Python pytorch:无法理解model.forward函数

Python pytorch:无法理解model.forward函数,python,deep-learning,pytorch,Python,Deep Learning,Pytorch,我正在学习深度学习,并试图理解下面给出的pytorch代码。我很难理解概率计算是如何工作的。可以用外行的术语来解释。非常感谢 ps=model.forward(图像[0,:]) 我是一个门外汉,所以我将帮助您了解门外汉的条款:) 这些是网络中图层的参数。每个神经网络由层组成,每个层都有一个输入和一个输出形状 具体来说,input\u size处理第一层的输入形状。这是整个网络的输入大小。输入到网络中的每个样本将是长度为784的一维向量(长度为784的数组) hidden_size处理网络中的形状

我正在学习深度学习,并试图理解下面给出的pytorch代码。我很难理解概率计算是如何工作的。可以用外行的术语来解释。非常感谢

ps=model.forward(图像[0,:])


我是一个门外汉,所以我将帮助您了解门外汉的条款:)

这些是网络中图层的参数。每个神经网络由
层组成,每个
层都有一个输入和一个输出形状

具体来说,
input\u size
处理第一层的输入形状。这是整个网络的输入大小。输入到网络中的每个样本将是长度为784的一维向量(长度为784的数组)

hidden_size
处理网络中的形状。我们稍后会讨论这个问题

output\u size
处理最后一层的输出形状。这意味着我们的网络将为每个样本输出长度为10的一维向量

现在要逐行分解模型定义:

model = nn.Sequential(nn.Linear(input_size, hidden_sizes[0]),
nn.Sequential
部分简单地定义了一个网络,输入的每个参数按照该顺序定义了该网络中的一个新层

nn.Linear(输入大小,隐藏大小[0])
就是这样一个层的例子。它是我们网络的第一层,接收大小为
input\u size
的输入,并输出大小为
隐藏大小[0]
的向量。输出的大小被认为是“隐藏的”,因为它不是整个网络的输入或输出。它“隐藏”是因为它位于网络内部,远离实际使用时与之交互的网络的输入端和输出端

这被称为
线性
,因为它通过将输入乘以其权重矩阵并将其偏差矩阵添加到结果中来应用线性变换。(Y=Ax+b,Y=输出,x=输入,A=权重,b=偏差)

ReLU是激活函数的一个示例。此函数的作用是对最后一层(上面讨论的层)的输出应用某种转换,并输出该转换的结果。在这种情况下,所使用的函数是
ReLU
函数,其定义为
ReLU(x)=max(x,0)
。激活函数用于神经网络,因为它们会产生非线性。这允许您的模型对非线性关系建模

nn.Linear(hidden_sizes[0], hidden_sizes[1]),
从上面讨论的内容来看,这是
的另一个示例。它接受
隐藏大小[0]
(与最后一层的输出形状相同)的输入,并输出长度为
隐藏大小[1]
的1D向量

nn.ReLU(),
再次应用
ReLU
功能

nn.Linear(hidden_sizes[1], output_size)
与上面两层相同,但这次我们的输出形状是
output\u size

nn.Softmax(dim=1))
另一个激活功能。此激活函数将
nn.Linear
输出的logit转换为实际的概率分布。这使模型可以输出每个类的概率。在这一点上,我们的模型就建立起来了

# Forward pass through the network and display output
images, labels = next(iter(trainloader))
images.resize_(images.shape[0], 1, 784)
print(images.shape)
这些只是预处理训练数据并将其转换为正确的格式

ps = model.forward(images[0,:])

这将通过模型传递图像(正向传递),并应用层中前面讨论的操作。您将获得结果输出。

我们通常用非外行术语回答问题;-)如果你是外行,你可能会更快地得到答案。解释得很好!很简单。做得好,
nn.Softmax(dim=1))
# Forward pass through the network and display output
images, labels = next(iter(trainloader))
images.resize_(images.shape[0], 1, 784)
print(images.shape)
ps = model.forward(images[0,:])