无法理解密集层的输出形状 - keras

数据挖掘 神经网络 深度学习 喀拉斯
2021-09-22 03:29:48

我正在按照在线教程对图像进行分类,并从密集层开始对 cifar10 数据进行分类。

# Create a model and add layers
model = Sequential()
model.add(Dense(512, activation='relu', input_shape=(32, 32, 3)))
model.add(Dense(10, activation='softmax'))

# Print summary
model.summary()

在此处输入图像描述

dense_1 output shape (None, 32, 32, 512). 'None' 代表批量大小,但 '32,32' 代表什么?为什么不是形状(无,512)?dense_2 层也是如此。

有人可以在这里解释一下或指向我解释这个的资源吗?

3个回答

Keras 将密集层应用于图像的每个位置,就像1x1卷积一样。

更准确地说,您将 512 个密集神经元中的每一个应用到每个32x32位置,使用每个位置的 3 个颜色值作为输入。这就是为什么你有512*3 (weights) + 512 (biases) = 2048 parameters.

因此,对于每个位置的每个神经元,您都会生成一个输出,这就是为什么每个位置都有 512 个输出,即32x32x512.

这一切都发生在批次中的每个示例中:这就是None部分。

所以据我了解,Dense几乎是 Keras 说矩阵乘法的方式。

概括:

每当我们说Dense(512, activation='relu', input_shape=(32, 32, 3)),我们真正的意思是执行矩阵乘法以产生一个期望最后一维为512的输出矩阵。

翻译中丢失的是512只是所需输出的一部分,而不是整个画面。Keras 会看到输入形状和 Dense 形状,并自动确定您要执行矩阵乘法。


示例 1:

让我们看看Dense(512, activation='relu', input_shape=(32, 32, 3))

矩阵乘法:

(None, 32, 32, 3) * (3, 512)

解释:

  1. None 是模型训练时确定的图片数量,所以现在无所谓。
  2. (..., 32, 32, 3)input_shapeDense(...)
  3. (3, 512)来自 Keras,看到您将最后一个维度作为 a(..., ..., ..., 3)作为您的input_shape. 因此,Keras 采用最后一个3并将其与 相结合,512得到最终的形状(3, 512)Taa-daa,自动魔法解释道。

结果是:

(None, 32, 32, 512)

这是因为这两个3s 由于矩阵乘法而相互抵消。

正如Param #grovina(3 * 512) + 512 = 2048的回答所指出的那样。这是因为这个等式:

input * weights + bias

  1. input将是3(也就是每个神经元的参数数)
  2. weights将是512(又名神经元数量)
  3. bias将是512(也就是每个神经元一个偏差)

示例 2:

让我们对Dense(10, activation='softmax').

矩阵乘法:

(None, 32, 32, 512) * (512, 10)

解释:

  1. None现在没关系。
  2. (..., 32, 32, 512)input_shape从第一个来的Dense(...)
  3. (512, 10)来自 the 的最后一个维度input_shape10第二个中指定的Dense(...)

结果是:

(None, 32, 32, 10)

两者512抵消。

Param #(512 * 10) + 10 = 5130

  1. input将是512(也就是每个神经元的参数数)
  2. weights将是10(又名神经元数量)
  3. bias将是10(也就是每个神经元一个偏差)

对。输入层的属性是什么?除非我弄错了,否则您根本没有压平您的形象。因此,您已将 32 x 32 图像直接发送到密集层,而不是卷积层。(附带说明一下,您可能正在学习一个非常糟糕的教程,因为这不是好的教程所做的)。

相反,如果您试图将不带卷积的网络的性能与带卷积的网络的性能进行比较,那么您可以做的是将图像展平

然后,运行这两个密集层。你能分享一下你正在学习的教程吗?当我在学校学习 DNN 时,我们使用了这本在线教科书

它是在 Keras(或 Tensor-flow、MXNet 等)之前编写的,因此它没有 Keras 示例。但是,在 Keras 文档、这本书和这个论坛之间,你应该能够掌握深度学习。