我对理解紧随其后的平坦层的密集层的输出形状没有问题。输出形状符合我的理解,即(批量大小,单位)。
nn= keras.Sequential()
nn.add(keras.layers.Conv2D(8,kernel_size=(2,2),input_shape=(4,5,1)))
nn.add(keras.layers.Conv2D(1,kernel_size=(2,2)))
nn.add(keras.layers.Flatten())
nn.add(keras.layers.Dense(5))
nn.add(keras.layers.Dense(1))
nn.summary()
输出为:
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
conv2d_1 (Conv2D) (None, 3, 4, 8) 40
_________________________________________________________________
conv2d_2 (Conv2D) (None, 2, 3, 1) 33
_________________________________________________________________
flatten_1 (Flatten) (None, 6) 0
_________________________________________________________________
dense_1 (Dense) (None, 5) 35
_________________________________________________________________
dense_2 (Dense) (None, 1) 6
=================================================================
Total params: 114
Trainable params: 114
Non-trainable params: 0
_________________________________________________________________
但是我在理解多维输入的密集层的输出形状时遇到了麻烦。因此对于以下代码
nn= keras.Sequential()
nn.add(keras.layers.Conv2D(8,kernel_size=(2,2),input_shape=(4,5,1)))
nn.add(keras.layers.Conv2D(1,kernel_size=(2,2)))
#nn.add(keras.layers.Flatten())
nn.add(keras.layers.Dense(5))
nn.add(keras.layers.Dense(1))
nn.summary()
输出为
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
conv2d_1 (Conv2D) (None, 3, 4, 8) 40
_________________________________________________________________
conv2d_2 (Conv2D) (None, 2, 3, 1) 33
_________________________________________________________________
dense_1 (Dense) (None, 2, 3, 5) 10
_________________________________________________________________
dense_2 (Dense) (None, 2, 3, 1) 6
=================================================================
Total params: 89
Trainable params: 89
我无法直观地了解dense_1
和dense_2
层的输出形状。最终输出应该不是标量还是(batch,unit)?
在answer之后出现类似的问题试图解释直觉,但我不能完全理解这个概念。
来自同一answer:
也就是说,将640x959网格中的每个输出“像素”(i,j)计算为前一层在点(i,j)的8个不同卷积通道的密集组合。
可能有一些图片说明会很有用。
答案 0 :(得分:1)
这很棘手,但它确实适合Keras在密集层上的文档,
输出形状
nD
张量,形状为(batch_size, ..., units)
。例如,对于形状为(batch_size, input_dim)
的2D输入,输出的形状为(batch_size, units)
请注意,这不是最清晰的,但是他们用...
说,输入形状的最终尺寸将被密集连接的数量所取代。基本上,对于最终维度的每个项目,都创建一个与即将到来的密集层中每个请求的密集节点的连接。
在您的情况下,您有2 x 3 x 1的东西。因此,有一个“事物”(2 x 3事物)要连接到5个密集层节点中的每一个,因此必须2 x 3 x 5。在这种特殊情况下,您可以将其视为CNN层的通道。 5个输出“节点”中的每一个都有2 x 3的输出张。
在纯二维情况下,(batch_size, units)
...然后,经过最终维度units
迭代的每个项目本身都是标量值,因此最终得到的数字恰好是数字的大小请求的密集节点数。
但是在高维情况下,沿着输入的最终维迭代的每个项目本身仍将是高维事物,因此输出是这些高维事物的k个不同的“克隆”,其中k是请求的密集层大小,“克隆”是指单个密集连接的输出具有与输入最终维度中的项目相同的形状。
那么,密集度意味着该输出的每个特定元素与对应的一组输入的每个元素都有连接。但是请注意这一点。通过在输出的每个项目和输入的每个项目之间具有“一个”连接来定义密集层。因此,即使您的输出中有5个“ 2x3事物”,它们每个也只有一个单独的权重与它们如何连接到作为输入的2x3事物有关。 Keras还默认使用偏置 vector (而不是偏置张量),因此,如果密集层的尺寸为k
,而上一层的最终尺寸为n
,则应该期望(n+1)k
个可训练的参数。这些将始终与类似numpy的广播一起使用,以使权重和偏向矢量的较小尺寸形状与输入张量的实际形状相符。
习惯上要在第一个示例中使用Flatten,如果您想强制使用即将到来的密集层的确切大小。当您需要到每个“密集”节点的不同“(n-1)D”组连接时,可以使用多维密集层。对于高维输入,这可能是极为罕见的,因为您通常需要CNN类型的操作,但是我可以想象,在某些情况下,模型可以预测像素值,或者您正在生成完整的nD输出,例如从在编码器/解码器网络的解码器部分,您可能需要密集的单元格数组,以匹配某些预期的结构化输出类型(例如图像或视频)的尺寸。