最大池化层似乎具有权重。这是错误的。对?

时间:2019-05-31 08:49:38

标签: python pytorch

在“使用PyTorch进行深度学习:60分钟的闪电战>神经网络”的pytorch教程步骤中

我有一个疑问,什么剂量表示网络中的params [1]?

我之所以这么想,是因为最大轮询剂量没有任何权重值。

例如。

如果您编写类似的代码 ' def init (自己):     self.conv1 = nn.Conv2d(1,6,5) '

这意味着输入具有1个通道,6个输出通道,conv(5,5)

因此,我理解params [0]在初始化时具有6个通道,5 x 5矩阵随机映射值。

出于同样的原因

params [2]具有相同的形式,但是16通道。我也明白这一点。

但是params [1],什么意思?

也许这只是最大轮询存在的表示方法。

但是在本教程的最后,在“更新权重”的步骤中 可能会通过下面的代码进行更新。

learning_rate = 0.01
for f in net.parameters():
    f.data.sub_(f.grad.data * learning_rate)

这是用于构建网络的代码

import torch
import torch.nn as nn
import torch.nn.functional as F


class Net(nn.Module):

    def __init__(self):
        super(Net, self).__init__()
        # 1 input image channel, 6 output channels, 5x5 square convolution
        # kernel
        self.conv1 = nn.Conv2d(1, 6, 5)
        self.conv2 = nn.Conv2d(6, 16, 5)
        # an affine operation: y = Wx + b
        self.fc1 = nn.Linear(16 * 5 * 5, 120)
        self.fc2 = nn.Linear(120, 84)
        self.fc3 = nn.Linear(84, 10)

    def forward(self, x):
        # Max pooling over a (2, 2) window
        x = F.max_pool2d(F.relu(self.conv1(x)), (2, 2))
        # If the size is a square you can only specify a single number
        x = F.max_pool2d(F.relu(self.conv2(x)), 2)
        x = x.view(-1, self.num_flat_features(x))
        x = F.relu(self.fc1(x))
        x = F.relu(self.fc2(x))
        x = self.fc3(x)
        return x

    def num_flat_features(self, x):
        size = x.size()[1:]  # all dimensions except the batch dimension
        num_features = 1
        for s in size:
            num_features *= s
        return num_features

params = list(net.parameters())
print(params[1])

Parameter containing:
tensor([-0.0614, -0.0778,  0.0968, -0.0420,  0.1779, -0.0843],
       requires_grad=True)

请访问pytorch教程网站。 https://pytorch.org/tutorials/beginner/blitz/neural_networks_tutorial.html#sphx-glr-beginner-blitz-neural-networks-tutorial-py

1 个答案:

答案 0 :(得分:0)

您对此有误。它与max_pooling无关。 正如您在“链接的教程”中可以看到的那样,当“ nn.paramter” -Tensor分配给模块时,它会自动注册为参数。

从本质上讲,这意味着__init__中列出的所有内容都是模块和参数,可以分配给它。

值在参数内部意味着什么,以及模型计算其步骤所需的参数。描绘它

params[0] -> self.conf1 -> Layer-Input
params[1] -> self.conf1 -> Layer-Output
params[2] -> self.conf2 -> Layer-Input
params[3] -> self.conf2 -> Layer-Output
params[4] -> self.fc1   -> Layer-Input
params[5] -> self.fc1   -> Layer-Output

依次类推,直到达到params [9],这就是整个参数列表的末尾。

编辑:忘记了重量 这些值表明您的网络学到了什么。 因此,您可以更改这些值,以便对网络进行微调以适应您的需求。

如果您问为什么每个图层需要2行? 好吧,当您进行反向传播时,您需要这些值来定位图层中的问题。 这就是为什么它存储在传递到图层之前,然后从该图层返回之后进行存储的原因。

希望现在情况变得更清楚了。