Keras中2D图像的张量形状

时间:2017-09-10 21:18:43

标签: tensorflow keras keras-layer

我是Keras的新手(以某种方式对TF),但我发现输入层的形状定义非常混乱。

因此在示例中,当我们有一个长度为20的1D向量用于输入时,形状被定义为

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

当需要为MNIST定义灰度图像的2D张量时,它定义为:

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

所以我的问题是为什么张量未被定义为(20)(28, 28)?为什么在第一种情况下添加第二个维度并留空?另外,第二,必须定义多个频道?

据我所知,它取决于图层所以Conv1D,Dense或Conv2D采用不同的形状,但似乎第一个参数是隐式的?

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

Dense(32, input_shape=(784,))

谢谢

1 个答案:

答案 0 :(得分:7)

元组与数字

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

Dense(32, input_shape=(784,))Dense(32, input_dim=784)相同。

图片

图像不仅有像素,还有通道(红色,绿色,蓝色) 黑/白图像只有一个通道。

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

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

某些图层需要特定的形状

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

也是复发层的情况,需要(timeSteps,featuresPerStep)来执行其重复计算。

MNIST模型

同样,没有义务以特定方式塑造您的形象。您必须根据您选择的第一层和您打算实现的目标来完成。这是免费的。

许多例子根本不关心图像是2d结构化的东西,他们只使用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)

您的实际输入数据必须具有与报告的形状匹配的形状。