【问题标题】:Keras Sequential Dense input layer - and MNIST: why do images need to be reshaped?Keras Sequential Dense 输入层 - 和 MNIST:为什么需要重塑图像?
【发布时间】:2019-02-10 12:58:52
【问题描述】:

我问这个是因为我觉得我缺少一些基本的东西。

到目前为止,大多数人都知道 MNIST 图像是 28X28 像素。 keras documentation 告诉我有关 Dense 的信息:

输入形状 nD 张量,形状为:(batch_size, ..., input_dim)。最常见的情况是具有形状 (batch_size, input_dim) 的 2D 输入。

所以像我这样的新手会假设图像可以作为 28*28 矩阵输入模型。然而,我找到的每个教程都经过各种体操,将图像转换为一个 784 长的特征。

有时由

num_pixels = X_train.shape[1] * X_train.shape[2]
model.add(Dense(num_pixels, input_dim=num_pixels, activation='...'))

num_pixels = np.prod(X_train.shape[1:])
model.add(Dense(512, activation='...', input_shape=(num_pixels,)))

model.add(Dense(units=10, input_dim=28*28, activation='...'))
history = model.fit(X_train.reshape((-1,28*28)), ...)

甚至:

model = Sequential([Dense(32, input_shape=(784,)), ...),])

所以我的问题很简单——为什么? Dense 不能按原样接受图像,或者,如果有必要,就按原样“在幕后”处理它吗?如果,正如我所怀疑的,这个处理必须完成,这些方法(或其他)中的任何一种是否天生更可取?

【问题讨论】:

  • 不!那是因为currently the Dense layer is applied on the last axis。因此,如果您向其提供形状为(height, width)(height, width, channels) 的图像,则密集层将仅应用于最后一个轴(即宽度或通道)。
  • 好吧,我该死!当新手甚至无法信任文档时,世界会变成什么:)。除了文档之外,我不得不说那些发布教程的人应该费心解释为什么他们将图像展平(假设他们自己知道开始的原因)而不是仅仅发布......无论如何,感谢这个信息- 您可以将其作为实际答案发布,以便我可以将其标记为已解决吗?还是违反规定?

标签: python machine-learning keras keras-layer mnist


【解决方案1】:

应OP(即原始海报)的要求,我将提及我在评论中给出的答案并详细说明。

不能 Dense 只接受原样的图像,或者,如有必要,只处理 它是“幕后”吗?

不!那是因为currently the Dense layer is applied on the last axis。因此,如果您向其提供形状为(height, width)(height, width, channels) 的图像,则密集层将仅应用于最后一个轴(即宽度或通道)。然而,当图像被展平时,密集层中的所有单元将应用于整个图像,并且每个单元都连接到具有不同权重的所有像素。为了进一步澄清这一点,请考虑这个模型:

model = models.Sequential()
model.add(layers.Dense(10, input_shape=(28*28,)))
model.summary()

模型总结:

Layer (type)                 Output Shape              Param #   
=================================================================
dense_2 (Dense)              (None, 10)                7850      
=================================================================
Total params: 7,850
Trainable params: 7,850
Non-trainable params: 0
_________________________________________________________________

如您所见,Dense 层中有 7850 个参数:每个单元都连接到所有像素(28*28*10 + 10 个偏置参数 = 7850)。现在考虑这个模型:

model = models.Sequential()
model.add(layers.Dense(10, input_shape=(28,28)))
model.summary()

模型总结:

_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
dense_3 (Dense)              (None, 28, 10)            290       
=================================================================
Total params: 290
Trainable params: 290
Non-trainable params: 0
_________________________________________________________________

在这种情况下,密集层中只有 290 个参数。这里 Dense 层中的每个单元也连接到所有像素,但不同之处在于权重在第一个轴上共享(28*10 + 10 偏置参数 = 290)。与之前在整个图像中提取特征的模型相比,就好像从图像的每一行中提取特征一样。因此,这(即权重共享)可能对您的应用有用,也可能没用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-12-26
    • 1970-01-01
    • 2019-02-04
    • 2020-10-05
    • 2018-02-20
    • 2018-12-13
    • 2018-09-12
    • 2019-12-28
    相关资源
    最近更新 更多