conv2d 之后的 PyTorch CNN 线性层形状
PyTorch CNN linear layer shape after conv2d
我在尝试学习 PyTorch 时遇到了一个教程,其中 CNN 的定义如下,
class Net(Module):
def __init__(self):
super(Net, self).__init__()
self.cnn_layers = Sequential(
# Defining a 2D convolution layer
Conv2d(1, 4, kernel_size=3, stride=1, padding=1),
BatchNorm2d(4),
ReLU(inplace=True),
MaxPool2d(kernel_size=2, stride=2),
# Defining another 2D convolution layer
Conv2d(4, 4, kernel_size=3, stride=1, padding=1),
BatchNorm2d(4),
ReLU(inplace=True),
MaxPool2d(kernel_size=2, stride=2),
)
self.linear_layers = Sequential(
Linear(4 * 7 * 7, 10)
)
# Defining the forward pass
def forward(self, x):
x = self.cnn_layers(x)
x = x.view(x.size(0), -1)
x = self.linear_layers(x)
return x
我了解 cnn_layers 是如何制作的。在cnn_layers之后,要把数据压扁给linear_layers.
我不明白 Linear 的特征数量是多少 4*7*7
。我知道 4 是最后一个 Conv2d 层的输出维度。
7*7
如何进入画面? stride 或 padding 在其中有什么作用吗?
输入图像形状为 [1, 28, 28]
Conv2d
层的内核大小为 3,步长和填充为 1,这意味着它不会改变图像的空间大小。有两个 MaxPool2d
层将空间维度从 (H, W)
减少到 (H/2, W/2)
。因此,对于每个批次,具有 4 个输出通道的最后一个卷积的输出具有 (batch_size, 4, H/4, W/4)
的形状。在前向传递中,特征张量被 x = x.view(x.size(0), -1)
展平,使其成为 (batch_size, H*W/4)
的形状。我假设 H 和 W 为 28,线性层将采用 (batch_size, 196)
.
形状的输入
其实,
在 2D 卷积层中,矩阵 [2D-tensor] 中的特征 [values],
像往常一样,神经网络最终有一个完全连接的层,随后是 logist。
因此,向量 [1D-tensor] 中全连接层的特征。
因此我们必须将最后一个度量中的每个特征[值]映射到后面的全连接层。
在pytorch中全连接层的实现是Linear
class。
第一个参数是输入特征的数量:
在这种情况下
input_image : (28,28,1)
after_Conv2d_1 : (28,28,4) <- because of the padding : if padding := 0 then (26,26,1)
after_maxPool_1 : (14,14,4) <- due to the stride of 2
after_Conv2D_2 : (14,14,4) <- because this is "same" padding
after_maxPool_2 : (7,7,4)
最后,全连接层之前的特征总数为4*7*7
。
此外,这里显示了为什么我们使用奇数作为内核大小并从具有偶数像素的图像开始
我在尝试学习 PyTorch 时遇到了一个教程,其中 CNN 的定义如下,
class Net(Module):
def __init__(self):
super(Net, self).__init__()
self.cnn_layers = Sequential(
# Defining a 2D convolution layer
Conv2d(1, 4, kernel_size=3, stride=1, padding=1),
BatchNorm2d(4),
ReLU(inplace=True),
MaxPool2d(kernel_size=2, stride=2),
# Defining another 2D convolution layer
Conv2d(4, 4, kernel_size=3, stride=1, padding=1),
BatchNorm2d(4),
ReLU(inplace=True),
MaxPool2d(kernel_size=2, stride=2),
)
self.linear_layers = Sequential(
Linear(4 * 7 * 7, 10)
)
# Defining the forward pass
def forward(self, x):
x = self.cnn_layers(x)
x = x.view(x.size(0), -1)
x = self.linear_layers(x)
return x
我了解 cnn_layers 是如何制作的。在cnn_layers之后,要把数据压扁给linear_layers.
我不明白 Linear 的特征数量是多少 4*7*7
。我知道 4 是最后一个 Conv2d 层的输出维度。
7*7
如何进入画面? stride 或 padding 在其中有什么作用吗?
输入图像形状为 [1, 28, 28]
Conv2d
层的内核大小为 3,步长和填充为 1,这意味着它不会改变图像的空间大小。有两个 MaxPool2d
层将空间维度从 (H, W)
减少到 (H/2, W/2)
。因此,对于每个批次,具有 4 个输出通道的最后一个卷积的输出具有 (batch_size, 4, H/4, W/4)
的形状。在前向传递中,特征张量被 x = x.view(x.size(0), -1)
展平,使其成为 (batch_size, H*W/4)
的形状。我假设 H 和 W 为 28,线性层将采用 (batch_size, 196)
.
其实,
在 2D 卷积层中,矩阵 [2D-tensor] 中的特征 [values],
像往常一样,神经网络最终有一个完全连接的层,随后是 logist。
因此,向量 [1D-tensor] 中全连接层的特征。
因此我们必须将最后一个度量中的每个特征[值]映射到后面的全连接层。
在pytorch中全连接层的实现是Linear
class。
第一个参数是输入特征的数量:
在这种情况下
input_image : (28,28,1)
after_Conv2d_1 : (28,28,4) <- because of the padding : if padding := 0 then (26,26,1)
after_maxPool_1 : (14,14,4) <- due to the stride of 2
after_Conv2D_2 : (14,14,4) <- because this is "same" padding
after_maxPool_2 : (7,7,4)
最后,全连接层之前的特征总数为4*7*7
。
此外,这里显示了为什么我们使用奇数作为内核大小并从具有偶数像素的图像开始