使用 torch 模块

在我们介绍 Torch 基础知识的迷你系列的第三部分中,我们用模块代替了手工编码的矩阵运算,大大简化了我们的玩具网络的代码。

来源:RStudio AI博客

最初,我们通过从头编写一个简单的神经网络来学习 torch 基础知识,只使用 torch 的一个功能:张量。然后,我们极大地简化了任务,用 autograd 代替了手动反向传播。今天,我们模块化了网络 - 无论是习惯意义上还是字面意义上:低级矩阵运算被替换为 torch 模块。

最初 torch torch 张量 然后 autograd 模块化 torch 模块

模块

从其他框架(例如 Keras)中,您可能习惯于区分模型和层。在 torch 中,两者都是 nn_Module() 的实例,因此,它们有一些共同的方法。对于那些从“模型”和“层”的角度思考的人,我人为地将本节分成了两部分。但实际上,并没有二分法:新模块可能由现有模块组成,递归级别任意。

模型 torch nn_Module()

基础模块(“层”)

我们可以创建一个线性模块,而不是像我们目前所做的那样手动写出仿射运算 - x$mm(w1) + b1,比如 -。以下代码片段实例化了一个线性层,该层需要三个特征输入并为每个观察返回一个输出:

x$mm(w1) + b1

该模块有两个参数,“权重”和“偏差”。两者现在都已预初始化:

$weighttorch_tensor -0.0385 0.1412 -0.5436[ CPUFloatType{1,3} ]$biastorch_tensor -0.1950[ CPUFloatType{1} ]
$weighttorch_tensor -0.0385 0.1412 -0.5436[ CPUFloatType{1,3} ]$biastorch_tensor -0.1950[ CPUFloatType{1} ]

模块是可调用的;调用模块执行其 forward() 方法,对于线性层,该方法将输入和权重进行矩阵乘法,并添加偏差。

forward()

让我们尝试一下:

data <- torch_randn(10, 3)out <- l(data)
data <- torch_randn(10, 3)out <- l(data) data <- torch_randn(10, 3) data <- torch_randn ( 10 3 ) out <- l(data) out <- l ( data )

不出所料,out 现在包含一些数据:

out
torch_tensor 0.2711-1.8151-0.0073 0.1876-0.0930 0.7498-0.2332-0.0428 0.3849-0.2618[ CPUFloatType{10,1} ]
AddmmBackward
AddmmBackward torch behind() l $