【发布时间】:2021-09-24 15:21:41
【问题描述】:
目前,我正在使用一个 CNN,其中附加了一个完全连接的层,并且我正在使用大小为 32x32 的 3 通道图像。我想知道是否有一个一致的公式可以用来计算第一个线性层的输入尺寸和来自最后一个 conv/maxpooling 层的输入。我希望能够在仅给出最后一个 conv2d 层和稍后 maxpool 的信息的情况下计算第一个线性层的尺寸。换句话说,我希望能够计算该值而不必使用之前层的信息(因此我不必手动计算非常深的网络的权重维度)
我还想了解可接受尺寸的计算,例如这些计算的推理是什么?
出于某种原因,这些计算有效,Pytorch 接受了这些尺寸:
val = int((32*32)/4)
self.fc1 = nn.Linear(val, 200)
这也有效
self.fc1 = nn.Linear(64*4*4, 200)
为什么这些值有效,这些方法的计算是否存在限制?例如,如果我要更改步幅距离或内核大小,我觉得这会中断。
这是我使用的通用模型架构:
# define the CNN architecture
class Net(nn.Module):
def __init__(self):
super(Net, self).__init__()
# convolutional layer
self.conv1 = nn.Conv2d(in_channels=3, out_channels=16, kernel_size=3, padding=1)
# max pooling layer
self.pool = nn.MaxPool2d(2, 2)
self.conv2 = nn.Conv2d(in_channels=16, out_channels=32,kernel_size=3)
self.pool2 = nn.MaxPool2d(2,2)
self.conv3 = nn.Conv2d(in_channels=32, out_channels=64, kernel_size=3)
self.pool3 = nn.MaxPool2d(2,2)
self.dropout = nn.Dropout(0.25)
# H*W/4
val = int((32*32)/4)
#self.fc1 = nn.Linear(64*4*4, 200)
################################################
self.fc1 = nn.Linear(val, 200) # dimensions of the layer I wish to calculate
###############################################
self.fc2 = nn.Linear(200,100)
self.fc3 = nn.Linear(100,10)
def forward(self, x):
# add sequence of convolutional and max pooling layers
x = self.pool(F.relu(self.conv1(x)))
x = self.pool2(F.relu(self.conv2(x)))
x = self.pool3(F.relu(self.conv3(x)))
#print(x.shape)
x = torch.flatten(x, 1) # flatten all dimensions except batch
x = F.relu(self.fc1(x))
x = self.dropout(x)
x = F.relu(self.fc2(x))
x = self.dropout(x)
x = self.fc3(x)
return x
# create a complete CNN
model = Net()
print(model)
谁能告诉我如何计算第一个线性层的尺寸并解释原因?
【问题讨论】:
标签: python neural-network pytorch conv-neural-network dimensions