CNN中的权重矩阵集及其维度如何

数据挖掘 分类 多类分类 混淆矩阵
2022-02-24 06:14:59

我正在尝试使用 CNN 计算每层的输出大小和 3 类分类的参数数量。我已经计算到最后的最大池化层,非常感谢帮助理解如何到达全连接层。

在 Matlab 中,我检查了完全连接(FC)的大小1176和权重,3*1176我正在努力理解这两个数字的含义以及它们是如何计算的。我可以猜测这3来自班级的数量,但怎么1176来的?它与我的计算不符。

问题:如何确定最后一层FC的尺寸?既然我有 3 个班级,我有 3 层吗?请纠正我哪里错了。附件是显示重量尺寸的屏幕截图3*1176

图像

1个回答

1176是最后一层之前的层中的神经元个数,是卷积层中但是扁平化的像素个数( height*width*n_filters, ie 7*7*24=1176)。3 来自最后一层中的神经元数量,因为您有 3 个类,所以您的最后一层有 3 个神经元,每个类 1 个(将输出 0 或 1)。3x1176然后,这给出了倒数第二层和最后一层之间权重的权重矩阵。使用torch我们可以显示网络中各层之间传递的数据的维度。在下面的示例中,我省略了批量标准化和 relu 层,因为它们不会影响尺寸。尺寸定义如下:batch_size * n_channels * height * width.

import torch

x = torch.randn(1, 1, 28, 28)
x.shape
# torch.Size([1, 1, 28, 28])

conv1 = torch.nn.Conv2d(in_channels=1, out_channels=12, kernel_size=3, padding=1)(x)
conv1.shape
# torch.Size([1, 12, 28, 28])

pool1 = torch.nn.MaxPool2d(kernel_size=2, stride=2)(conv1)
pool1.shape
# torch.Size([1, 12, 14, 14])

conv2 = torch.nn.Conv2d(in_channels=12, out_channels=24, kernel_size=3, padding=1)(pool1)
conv2.shape
# torch.Size([1, 24, 14, 14])

pool2 = torch.nn.MaxPool2d(kernel_size=2, stride=2)(conv2)
pool2.shape
# torch.Size([1, 24, 7, 7])

pool2.view(-1).shape
# torch.Size([1176])