我正在尝试训练CNN使用Fashion-MNIST
,Conv2d
和Maxpool
层对来自Linear
数据的图像进行分类。我在in_features = 12*4*4
层中遇到了nn.Linear
如下所述的代码。
请问如何为nn.Linear图层选择in_features
参数?
class Network(nn.Module):
def __init__(self):
super(Network, self).__init__()
self.conv1 = nn.Conv2d(in_channels=1, out_channels=6, kernel_size=5)
self.conv2 = nn.Conv2d(in_channels=6, out_channels=12, kernel_size=5)
self.fc1 = nn.Linear(in_features=12*4*4, out_features=120)
self.fc2 = nn.Linear(in_features=120, out_features=60)
self.out = nn.Linear(in_features=60, out_features=10)
答案 0 :(得分:1)
Fashion-MNIST
数据集中的每个示例都是一个28 x 28
灰度图像。
28 x 28
5 x 5
卷积而没有填充(由于default padding=0
)和stride=1(by default)
,所以我们在每一侧丢失2
像素,我们下降到{{1} },即(28-5)/ 1 +1 24 x 24
的接受域执行maxpooling操作,将每个维度切成一半,降到2 x 2
12 x 12
卷积而没有5 x 5
和padding
,我们下降到stride=1
,即(12-5)/ 1 + 1 8 x 8
这就是为什么4 x 4
。基本上是self.fc1 = nn.Linear(in_features=12*4*4, out_features=120)
,高度和宽度分别为n_features_conv * height * width
,4
与位于其上方的n_features_conv
层的out_channels
相同。
请注意,如果您更改输入图像的大小,则必须执行上述计算并相应地调整第一conv2D
层。
希望这对您有帮助!
答案 1 :(得分:0)
如果CNN最后有fc层,则首先必须确定输入大小。接下来,您有三个选择:
自己做数学。计算张量大小在通过不同的转换,合并层时的变化方式。
只需输入您在初始图层中固定大小的随机张量即可。然后查看输出(tensor.size()
)的大小。在您给出的示例中,它是(torch.Size([12, 4, 4])
)。
使用tsalib之类的东西来处理后台调整大小。
我个人更喜欢方法2,因为它快速,准确并且不需要任何第三方库。