我正在学习深度学习,并且试图理解下面给出的pytorch代码。我正在努力了解概率计算的工作原理。可以用外行的方式将其分解。多谢。
ps = model.forward(images [0,:])
# Hyperparameters for our network
input_size = 784
hidden_sizes = [128, 64]
output_size = 10
# Build a feed-forward network
model = nn.Sequential(nn.Linear(input_size, hidden_sizes[0]),
nn.ReLU(),
nn.Linear(hidden_sizes[0], hidden_sizes[1]),
nn.ReLU(),
nn.Linear(hidden_sizes[1], output_size),
nn.Softmax(dim=1))
print(model)
# 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,:])
答案 0 :(得分:1)
我是一个外行,所以我会帮您解决外行的问题:)
input_size = 784
hidden_sizes = [128, 64]
output_size = 10
这些是网络中各层的参数。每个神经网络都由layers
组成,每个layer
都有输入和输出形状。
具体地说,input_size
处理第一层的输入形状。这是整个网络的input_size
。输入到网络中的每个样本将是长度为784(数组为784长)的一维向量。
hidden_size
处理网络内部的形状。我们稍后再讨论。
output_size
处理最后一层的输出形状。这意味着我们的网络将为每个样本输出一个长度为10的一维向量。
现在要逐行分解模型定义:
model = nn.Sequential(nn.Linear(input_size, hidden_sizes[0]),
nn.Sequential
部分仅定义了一个网络,输入的每个参数都按该顺序定义了该网络中的新层。
nn.Linear(input_size, hidden_sizes[0])
是此类图层的示例。这是我们网络的第一层,输入大小为input_size
的输入,并输出大小为hidden_sizes[0]
的向量。输出的大小被认为是“隐藏的”,因为它不是整个网络的输入或输出。之所以“隐藏”,是因为它位于网络内部,与实际使用时与之交互的网络的输入和输出端相距甚远。
之所以称为Linear
,是因为它通过将输入乘以其权重矩阵并将其偏差矩阵添加到结果中来应用线性变换。 (Y = Ax + b,Y =输出,x =输入,A =权重,b =偏差)。
nn.ReLU(),
ReLU是激活功能的一个示例。该函数的作用是对最后一层(上面讨论的层)的输出进行某种转换,并输出该转换的结果。在这种情况下,使用的函数是ReLU
函数,该函数定义为ReLU(x) = max(x, 0)
。激活函数用于神经网络,因为它们会产生非线性。这使您的模型可以对非线性关系进行建模。
nn.Linear(hidden_sizes[0], hidden_sizes[1]),
根据我们上面的讨论,这是layer
的另一个示例。它接受hidden_sizes[0]
的输入(与最后一层的输出相同的形状),并输出长度为hidden_sizes[1]
的一维矢量。
nn.ReLU(),
再次使用ReLU
功能。
nn.Linear(hidden_sizes[1], output_size)
与上述两层相同,但这次的输出形状为output_size
。
nn.Softmax(dim=1))
另一个激活功能。此激活功能将nn.Linear
输出的对数转换为实际概率分布。这样,模型就可以输出每个类别的概率。至此,我们的模型已构建。
# 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,:])
这会将图像传递通过模型(向前传递),并应用先前在图层中讨论的操作。您将得到结果输出。