在多层CNN中,哪个输入占用第二层?

2024-10-01 11:21:10 发布

您现在位置:Python中文网/ 问答频道 /正文

我不确定下面的问题,我在互联网上发现的一切似乎都很模糊

<美国有线电视新闻网>:

model = Sequential()
# 1st conv layer
model.add(Conv2D(10, (4,4), actiavtion="relu", input_shape=(28,28,1)))
model.add(MaxPooling2D(pool_size=(2,2), strides=(2,2)))
# 2nd conv layer
model.add(Conv2D(20, (4,4), actiavtion="relu"))
model.add(MaxPooling2D(pool_size=(2,2), strides=(2,2)))
model.add(Flatten())
model.add(Dense(128, activation='relu'))
model.add(Dense(num_classes, activation='softmax'))

现在,当输入图像被传递到第一个conv层时,我们将得到10个特征映射,每个特征映射的形状为(25, 25, 1)。因此,我们得到了(25, 25, 1, 10)的形状,对吗?应用池将导致(12, 12, 1, 10)

我的问题出现在第二个conv层。conv层始终以一张图片/矩阵作为输入。就像第一层拍摄的(28, 28, 1),这是一张图片

但是conv layer 1给了我们10张图片(或功能图)。那么,这10个选项中的哪一个用作输入?我会假设每一个

假设这是正确的:因此,我们有第二个conv层的输入形状(12, 12, 1)。应用它会得到(9, 9, 1),池层会给出(4, 4, 1)。因为我们指定了20个特性,所以我们得到了(4, 4, 1, 20)

但这只适用于10种可能输入中的一种!因此,如果我们应用所有这些,我们将得到最终的形状(4, 4, 1, 20, 10)。对吗

编辑:

重量计算使我认为它是正确的,因为它适合。 另一方面,扁平层只有320 = 4*4*20个神经元,而不是我所期望的3200 = 4*4*20*10。那会让我觉得这是不对的

这是模型摘要的输出:

_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
conv2d_13 (Conv2D)           (None, 25, 25, 10)        170       
_________________________________________________________________
max_pooling2d_10 (MaxPooling (None, 12, 12, 10)        0         
_________________________________________________________________
conv2d_14 (Conv2D)           (None, 9, 9, 20)          3220      
_________________________________________________________________
max_pooling2d_11 (MaxPooling (None, 4, 4, 20)          0         
_________________________________________________________________
flatten_6 (Flatten)          (None, 320)               0         
_________________________________________________________________
dense_12 (Dense)             (None, 128)               41088     
_________________________________________________________________
dense_13 (Dense)             (None, 10)                1290      
=================================================================
Total params: 45,768
Trainable params: 45,768
Non-trainable params: 0

如果初始输入形状是RGB图片(例如(28, 28, 3)),我们会得到(4, 4, 3, 20, 10)


Tags: noneaddlayersizemodel图片paramsdense
1条回答
网友
1楼 · 发布于 2024-10-01 11:21:10

您的困惑来自这样一个事实:即使您为过滤器提供了2个数字(在您的示例中,4表示宽度,4表示高度),过滤器实际上是3D的。此第三维表示输入通道的数量

让我们看一下第一个卷积层:Conv2D(10, (4,4), actiavtion="relu", input_shape=(28,28,1)

我们的输入形状为(28, 28, 1),过滤器形状为(4, 4, 1)。即使您在上面的那一行中将形状指定为(4, 4),请记住,第三维将是输入通道的数量,对于第一个卷积层,它是1。例如,如果将RGB图像输入到模型中,则输入形状过滤器的三维度都将是3,而不是1

给定输入形状和过滤器形状,我们的输出形状应该是(input_shape[0] - filter_shape[0] + 1, input_shape[1] - filter_shape[1] + 1, output_channels)(假设步幅为1,它在模型中)。替换值,我们得到(28 - 4 + 1, 28 - 4 + 1, 10)(25, 25, 10)。这证实了我们在{}中看到的情况

至于我们如何在引擎盖下从输入到输出,首先我们需要在输入端横向和纵向移动过滤器。shape(28, 28, 1)的输入和shape(4, 4, 1)的过滤器将产生shape(25, 25, 4, 4, 1)的分块输入。换句话说,我们有原始图像的25 x 25“视图”,其中每个视图都具有表示我们在图像中看到的像素值的形状(4, 4, 1)

我们有10个(4, 4, 1)过滤器(10是输出通道的数量)。让我们看一下这些过滤器中的第一个。让我们也看一下原始图像的第一个“视图”(记住,我们总共有25 x 25)。我们用这个“视图”element-wise乘以过滤器,结果非常好,因为过滤器和“视图”的形状相同(4, 4, 1)。这种乘法的性质为我们提供了一个shape(4, 4, 1)的输出“视图”。然后,我们将所有这些值相加(4 x 4 x 1 = 16总值)以给出我们的“信号”。这些值的总和越大,意味着对过滤器所寻找的内容的检测越强。我忽略了一些东西,比如偏见,但这并没有改变事物的维度

上面的遍历只处理了图像的第一个过滤器和第一个“视图”,并生成了单个标量“信号”。我们有10个过滤器和25 x 25视图,最终的输出形状为(25, 25, 10)(如预期的那样)

请注意整个过程是如何在3D空间中运行的。过滤器和视图都是三维的,在本例中,最后一个尺寸为1。它能够在3D空间中运行,因为元素相乘可以实现,只要过滤器和“视图”具有相同的三维空间(本例中为1)

如果我们经过第二个卷积层(Conv2D(20, (4,4), actiavtion="relu")),过滤器和“视图”的最后一个维度都是10,而不是1。这是因为前一个卷积层的输出通道与当前卷积层的输入通道相同

相关问题 更多 >