Python conv2d后的PyTorch CNN线性层形状
我试图学习Pytork,遇到了一个教程,其中CNN的定义如下Python conv2d后的PyTorch CNN线性层形状,python,pytorch,torch,Python,Pytorch,Torch,我试图学习Pytork,遇到了一个教程,其中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, pa
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_层是如何制作的。在cnn_层之后,应将数据展平并提供给线性_层
我不明白要线性化的功能的数量是如何4*7*7
。我知道4是最后一个Conv2d层的输出维度
7*7
如何进入画面?步幅或填充在其中起了什么作用
输入图像形状为[1,28,28]
Conv2d
层的内核大小为3,跨距和填充为1,这意味着它不会更改图像的空间大小。有两个MaxPool2d
层将空间维度从(H,W)
减少到(H/2,W/2)
。因此,对于每个批次,具有4个输出通道的最后一次卷积的输出的形状为(批次大小,4,H/4,W/4)
。在向前传球中,特征张量被x=x.view(x.size(0),-1)
展平,从而使其成为(批次大小,H*W/4)
。我假设H和W是28,对于这两个值,线性层实际上会采用形状(batch_size,196)
的输入,
在二维卷积层中,矩阵[2D张量]中的特征[Value],
像往常一样,神经网络最后是一个完全连接的层,后面是一个连接层。
因此,向量[1D张量]中完全连通层中的特征。
因此,我们必须将最后一个度量中的每个特征[值]映射到完全连接的层中。
在pytorch中,完全连接层的实现是线性类。
第一个参数是输入特征的数量:
在这种情况下
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)
input_图像:(28,28,1)
_Conv2d_1:(28,28,4)输入图像的形状是什么?28x28单通道据我所知,完全连接层中的神经元数量不需要与卷积层的输出相同。如果第一个FC层中有30个神经元,而conv层的输出是4*7*7,那么仍然可以有30个,10是输出维度,30是隐藏层维度,可以有任意数量的输入。@cerofrais nope,这不是它的工作方式。谢谢