![](/img/trans.png)
[英]Difficulty in Implementing a simple single-layer RNN using Pytorch's base class “nn.Linear” class
[英]What is the class definition of nn.Linear in PyTorch?
我有以下 PyTorch 代码:
import torch.nn as nn
import torch.nn.functional as F
class Network(nn.Module):
def __init__(self):
super().__init__()
self.hidden = nn.Linear(784, 256)
self.output = nn.Linear(256, 10)
def forward(self, x):
x = F.sigmoid(self.hidden(x))
x = F.softmax(self.output(x), dim=1)
return x
我的问题:这个self.hidden
是什么?
它从nn.Linear
返回并且可以将x
作为参数。 self.hidden
的目的究竟是什么?
pytorch 中 nn.Linear 的类定义是什么?
从文档:
CLASS torch.nn.Linear(in_features, out_features, bias=True)
对传入数据应用线性变换: y = x*W^T + b
参数:
请注意,权重W
具有形状(out_features, in_features)
并且偏差b
具有形状(out_features)
。 它们是随机初始化的,以后可以更改(例如,在训练神经网络期间,它们会通过某些优化算法进行更新)。
在你的神经网络中, self.hidden = nn.Linear(784, 256)
定义了一个隐藏的(意味着它在输入层和输出层之间),完全连接的线性层,它采用输入x
的形状(batch_size, 784)
,其中批量大小是一次传递到网络的输入数量(每个大小为 784)(作为单个张量),并通过线性方程y = x*W^T + b
转换为张量y
形状(batch_size, 256)
。 它由 sigmoid 函数进一步转换, x = F.sigmoid(self.hidden(x))
(它不是nn.Linear
的一部分,而是一个附加步骤)。
让我们看一个具体的例子:
import torch
import torch.nn as nn
x = torch.tensor([[1.0, -1.0],
[0.0, 1.0],
[0.0, 0.0]])
in_features = x.shape[1] # = 2
out_features = 2
m = nn.Linear(in_features, out_features)
其中x
包含三个输入(即批量大小为 3)、 x[0]
、 x[1]
和x[3]
,每个大小为 2,输出的形状为(batch size, out_features) = (3, 2)
。
参数(权重和偏差)的值是:
>>> m.weight
tensor([[-0.4500, 0.5856],
[-0.1807, -0.4963]])
>>> m.bias
tensor([ 0.2223, -0.6114])
(因为它们是随机初始化的,很可能你会得到与上面不同的值)
输出是:
>>> y = m(x)
tensor([[-0.8133, -0.2959],
[ 0.8079, -1.1077],
[ 0.2223, -0.6114]])
并且(在幕后)它被计算为:
y = x.matmul(m.weight.t()) + m.bias # y = x*W^T + b
IE
y[i,j] == x[i,0] * m.weight[j,0] + x[i,1] * m.weight[j,1] + m.bias[j]
其中i
在区间[0, batch_size)
和j
在[0, out_features)
。
Network
定义为具有两层,隐藏层和输出层。 粗略地说,隐藏层的功能是保存可以在训练过程中优化的参数。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.