繁体   English   中英

Keras顺序密集输入层 - 和MNIST:为什么需要重塑图像?

[英]Keras Sequential Dense input layer - and MNIST: why do images need to be reshaped?

我问这个是因为我觉得我错过了一些基本的东西。

到目前为止,大多数人都知道MNIST图像是28X28像素。 关于密集的keras文档告诉我这个:

输入形状nD张量与形状:(b​​atch_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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM