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

标签 tensorflow keras neural-network deep-learning keras-layer

我在理解 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_1 的输出形状做出直觉和 dense_2层。最终输出不应该是标量或 (batch,unit) 吗?
关注 answer to similar question试图解释直觉,但我无法完全掌握这个概念。
来自同一个 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 个密集层节点中的每一个,即 2 x 3 x 5。你可以认为在这种特殊情况下,它就像 CNN 层的 channel 。 5 个输出“节点”中的每一个都有一个不同的 2 x 3 输出表。
在纯二维情况下 (batch_size, units) ...然后每个项目由最终维度 units 迭代本身是一个标量值,所以你最终得到的东西与请求的密集节点数量的大小完全相同。
但是在高维情况下,沿着输入的最终维度迭代的每个项目本身仍然是一个高维的东西,因此输出是这些高维东西的 k 个不同的“克隆”,其中 k 是要求的密集层大小,“克隆”是指单个密集连接的输出与输入的最终维度中的项目具有相同的形状。
那么密度意味着该输出的每个特定元素都与相应输入集的每个元素有联系。但要小心这一点。密集层是通过在输出的每个项目和输入的每个项目之间具有“一个”连接来定义的。因此,即使您的输出中有 5 个“2x3 事物”,但它们每个都只有一个与它们相关的单独权重,即它们如何连接到作为输入的 2x3 事物。 Keras 还默认使用偏置向量(不是偏置张量),因此如果密集层的维度为 k而上一层的最终维度是n你应该期待 (n+1)k可训练的参数。这些将始终与类似 numpy 的广播一起使用,以使权重和偏置向量的较小维度形状与输入张量的实际形状一致。
如果要强制执行即将到来的密集层的确切大小,通常会像在第一个示例中一样使用 Flatten。当您需要不同的“(n - 1)D”组连接到每个 Dense 节点时,您将使用多维 Dense 层。对于更高维的输入,这可能非常罕见,因为您通常需要 CNN 类型的操作,但我可以想象,在某些情况下,模型可能会预测像素值,或者如果您正在生成完整的 nD 输出,例如来自在编码器-解码器网络的解码器部分,您可能需要一个密集的单元阵列,以匹配某些预期结构化输出类型(如图像或视频)的维度。

关于tensorflow - 了解更高维度的密集层的输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57690048/

相关文章:

python - 如何防止 TypeError : unsupported operand type(s) for -: 'NoneType' and 'int' when using keras EarlyStopping?

deep-learning - Keras中inception v3的预处理功能

python - 保存在 Tensorflow 模型中的自定义文本预处理

tensorflow - Keras错误: expected dense_input_1 to have 3 dimensions

python - 从一组给定的单词中造出一个有意义的句子

python - 遵循 TensorFlow 教程并遇到 model.predict 问题

android - 适用于 Android 的 Tensorflow 示例

tensorflow - 拟合生成器函数中的数据增强误差

python - 第一个纪元后的神经网络生成 NaN 值作为输出、损失

machine-learning - Keras 神经网络模型精度始终为零