我不确定下面的问题,我在互联网上发现的一切似乎都很模糊
<美国有线电视新闻网>: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)
您的困惑来自这样一个事实:即使您为过滤器提供了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。这是因为前一个卷积层的输出通道与当前卷积层的输入通道相同相关问题 更多 >
编程相关推荐