Keras 中二维图像的张量形状

Shape of tensor for 2D image in Keras

我是 Keras 的新手(不知何故是 TF 的新手),但我发现输入层的形状定义非常混乱。

所以在示例中,当我们有一个长度为 20 的一维向量作为输入时,形状定义为

...Input(shape=(20,)...)

而当需要为MNIST定义灰度图像的二维张量时,定义为:

...Input(shape=(28, 28, 1)...)

所以我的问题是为什么张量没有定义为(20)(28, 28)?为什么在第一种情况下添加了第二个维度并将其留空?同样在第二,必须定义通道数?

我知道这取决于层,因此 Conv1D、Dense 或 Conv2D 具有不同的形状,但似乎第一个参数是隐式的?

根据 docs,密集需要 (batch_size, ..., input_dim) 但这与示例有何关联:

Dense(32, input_shape=(784,))

谢谢

元组与数字

input_shape必须是一个元组,所以只有(20,)可以满足。数字 20 不是元组。 -- 有参数 input_dim,如果你只有一个维度,可以让你的生活更轻松。这个参数可以取20。 (但实际上,我发现它只是令人困惑,我总是使用 input_shape 并使用元组,以保持一致的理解)。

Dense(32, input_shape=(784,)) 等同于 Dense(32, input_dim=784)

图片

图像不仅有像素,还有通道(红、绿、蓝)。
black/white 图像只有一个通道。

所以,(28pixels, 28pixels, 1channel)

但请注意,没有义务在任何地方都遵循这种形状的图像。你可以按照你喜欢的方式塑造它们。但是有些层确实需要一定的形状,否则就无法工作。

有些图层需要特定的形状

这是二维卷积层的情况,需要 (size1,size2,channels)。他们需要这种形状,因为他们必须相应地应用卷积滤波器。

循环层也是如此,需要 (timeSteps,featuresPerStep) 来执行它们的循环计算。

MNIST 模型

同样,没有任何义务以特定方式塑造您的形象。你必须根据你选择的第一层和你想要实现的目标来做。这是一件免费的事情。

许多示例根本不关心图像是二维结构的东西,它们只使用采用 784 像素的模型。够了。它们可能从 Dense 层开始,需要像 (size,)

这样的形状

其他示例可能会关心并使用形状 (28,28),但是这些模型将不得不重塑输入以适应下一层的需要。

2D 卷积层将需要 (28,28,1)

主要思想是:输入数组必须匹配input_shapeinput_dim

张量形状

不过,在阅读 Keras 错误消息或使用自定义/lambda 层时要小心。

我们之前定义的所有这些形状都忽略了一个重要的维度:批量大小样本数量

在内部,所有张量都将此附加维度作为第一维度。 Keras 会将其报告为 None(将适应您拥有的任何批量大小的维度)。

因此,input_shape=(784,) 将被报告为 (None,784)
input_shape=(28,28,1) 将被报告为 (None,28,28,1)

并且您的实际输入数据的形状必须与报告的形状相匹配。