我是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)
,但这与示例有什么关系:
谢谢
答案 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_shape
或input_dim
匹配。
张量形状
但是,在阅读Keras错误消息或使用自定义/ lambda图层时要小心。
我们之前定义的所有形状都省略了一个重要的维度:批量大小或样本数量。
在内部,所有张量都将此附加维度作为第一维度。 Keras会将其报告为None
(一个适应您所拥有的批量大小的维度)。
因此,input_shape=(784,)
将报告为(None,784)
input_shape=(28,28,1)
将报告为(None,28,28,1)
您的实际输入数据必须具有与报告的形状匹配的形状。