了解更高维度的密集层输出

Understanding output of Dense layer for higher dimension

我在理解 Dense 层后跟 Flatten 层的输出形状方面没有问题。输出形状符合我的理解,即(批量大小,单位)。

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_1dense_2 层的输出形状做出直觉。最终输出不应该是标量或(批次,单位)吗? 跟随 answer 到类似的问题试图解释直觉,但我无法完全理解这个概念。 来自同一个 answer:

That is, each output "pixel" (i, j) in the 640x959 grid is calculated as a dense combination of the 8 different convolution channels at point (i, j) from the previous layer.

也许一些带图片的解释会有用。

这很棘手,但它确实符合 Keras 在密集层上的文档,

Output shape

nD tensor with shape: (batch_size, ..., units). For instance, for a 2D input with shape (batch_size, input_dim), the output would have shape (batch_size, units)

请注意,这不是最清楚的,但他们用 ... 表示输入形状的最终维度将被密集连接的数量所忽略。基本上,对于最终维度的每个项目,在即将到来的密集层中创建到每个请求的密集节点的连接。

在你的例子中,你有一个 2 x 3 x 1 的东西。所以有一个“东西”(2 x 3 的东西)连接到 5 个密集层节点中的每一个,hense 2 x 3 x 5. 在这种特殊情况下,您可以将其视为 CNN 层的通道。 5 个输出“节点”中的每一个都有不同的 2 x 3 sheet 个输出。

在纯二维的情况下 (batch_size, units) ... 然后由最终维度迭代的每个项目 units 本身就是一个标量值,所以你最终得到的大小正好是请求的密集节点数。

但在更高维的情况下,您沿输入的最终维度迭代的每个项目本身仍然是更高维的事物,因此输出是那些更高维事物的 k 个不同的“克隆” ,其中 k 是请求的密集层大小,“克隆”是指单个密集连接的输出与输入的最终维度中的项目具有相同的形状。

那么密集度意味着该输出的每个特定元素都与相应输入集的每个元素都有联系。但要小心这一点。密集层是通过在输出的每个项目和输入的每个项目之间具有“一个”连接来定义的。因此,即使您的输出中有 5 个“2x3 事物”,它们中的每一个都只有一个与它们相关联的权重,关于它们如何连接到作为输入的 2x3 事物。 Keras也默认使用biasvector(不是bias tensor),所以如果dense层的维度是k,而前一层的最终维度是n你应该期待 (n+1)k 个可训练参数。这些将始终与类似 numpy 的广播一起使用,以使权重和偏置向量的较小维度形状符合输入张量的实际形状。

如果您想强制即将到来的致密层的确切大小,通常会像您的第一个示例一样使用 Flatten。当您想要不同的“(n - 1)D”组连接到每个 Dense 节点时,您可以使用多维 Dense 层。对于更高维的输入,这可能极为罕见,因为您通常需要 CNN 类型的操作,但我可以想象在某些情况下模型预测像素值或者如果您正在生成完整的 nD 输出,例如编码器-解码器网络的解码器部分,您可能需要密集的单元格阵列,这些单元格与某些预期的结构化输出类型(如图像或视频)的尺寸相匹配。