[英]Keras Sequential Dense input layer - and MNIST: why do images need to be reshaped?
我问这个是因为我觉得我错过了一些基本的东西。
到目前为止,大多数人都知道MNIST图像是28X28像素。 关于密集的keras文档告诉我这个:
输入形状nD张量与形状:(batch_size,...,input_dim)。 最常见的情况是具有形状的2D输入(batch_size,input_dim)。
所以像我这样的新手会假设图像可以作为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,)), ...),])
所以我的问题很简单 - 为什么? 不能密集只是按原样接受图像,或者,如果有必要,只是“在幕后”处理它,就像它一样? 如果,正如我怀疑的那样,必须进行这种处理,这些方法(或其他方法)中的任何一种本身都是优选的吗?
根据OP(即原版海报)的要求,我将在评论中提及答案,并详细说明。
不能密集只是按原样接受图像,或者,如果有必要,只是“在幕后”处理它,就像它一样?
根本没有! 那是因为目前Dense图层应用于最后一个轴 。 因此,如果您为其提供形状(height, width)
或(height, width, channels)
,则密集层将仅应用于最后一个轴(即宽度或通道)。 然而,当图像被展平时,Dense层中的所有单元将被应用于整个图像,并且每个单元连接到具有不同权重的所有像素。 为了进一步澄清,请考虑以下模型:
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 bias params = 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
_________________________________________________________________
在这种情况下,Dense层中只有290个参数。 这里Dense层中的每个单元也连接到所有像素,但不同之处在于权重在第一个轴上共享(28 * 10 + 10个偏差参数= 290)。 就像从在整个图像中提取特征的先前模型相比,从图像的每一行提取特征。 因此,这(即重量分配)可能对您的申请有用,也可能没有用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.