我是Pytorch的新手,如果有人能够帮助我理解以下内容(并且如果我错了就纠正我),将会很高兴,关于命令x.view在Pytorch中的含义first tutorial ,一般来说,卷积层的输入和完全连接层的输入:
def forward(self, x):
x = self.pool(F.relu(self.conv1(x)))
x = self.pool(F.relu(self.conv2(x)))
x = x.view(-1, 16 * 5 * 5)
x = F.relu(self.fc1(x))
x = F.relu(self.fc2(x))
x = self.fc3(x)
return x
据我所知,卷积层的输入256X256图像以其2D形式插入(即 - 256X256矩阵,或者在彩色图像的情况下为256X256X3)。然而,当我们将图像插入到完全连接的线性层时,我们需要首先将2D图像重塑为1D矢量(我是对的吗?这一般也是如此(或仅在Pytorch中)?)。这是为什么我们在将x插入完全连接的层之前使用命令“x = x.view(-1,16 * 5 * 5)”?
如果输入图像x为3D(例如256X256X256),上面给出的“前向”功能的语法是否保持不变?
提前多多感谢
答案 0 :(得分:2)
来自Petteri Nevavuori的讲义,并展示了如何使用内核I
从图像K
生成要素图。对于内核的每次应用,计算点积,实际上是I
中K
大小区域中K
和I
之间的元素乘法的总和
你可以说内核寻找对角线特征。然后它搜索图像并在左下角找到完美匹配的特征。否则,内核只能识别它所寻找的特征的部分。这就是为什么该产品被称为特征映射,因为它告诉内核能够在应用它的图像的任何位置识别特征。
答案改编自:https://discuss.pytorch.org/t/convolution-input-and-output-channels/10205/3
我们假设我们考虑输入图像的形状(W x H x 3
),其中输入音量有3个通道(RGB图像)。现在我们想为此图片创建ConvLayer
。
ConvLayer中的每个内核都将使用输入卷的所有输入通道。我们假设我们想使用3 by 3
内核。这个内核将有27个权重和1个偏差参数,因为(W * H * input_Channels = 3 * 3 * 3 = 27个权重)。
输出通道的数量是ConvLayer中使用的不同内核的数量。如果我们想输出64个通道,我们需要定义ConvLayer,使其使用64个不同的3x3内核。
如果您查看Conv2d的文档,我们可以定义一个模仿以上场景的ConvLayer,如下所示。
nn.Conv2d(3, 64, 3, stride=1)
其中in_channels = 3,out_channels = 64,kernel_size = 3x3。查看文档中的步骤。
如果查看Linear图层的实现,您会看到线性操作模拟的基础数学方程式为:y = Ax + b
。
根据linear图层的pytorch文档,我们可以看到它需要输入形状(N,∗,in_features)
,输出形状为(N,∗,out_features)
。因此,在您的情况下,如果输入图像x
的形状为256 x 256 x 256
,并且您希望将所有(256 * 256 * 256)要素转换为特定数量的要素,则可以定义线性层为:
llayer = nn.Linear(256*256*256, num_features)