我是Keras的新手(以某种方式对TF),但我发现输入层的形状定义非常混乱 .
因此在示例中,当我们有一个长度为20的1D向量用于输入时,形状被定义为
...Input(shape=(20,)...)
当需要为MNIST定义灰度图像的2D张量时,它定义为:
...Input(shape=(28, 28, 1)...)
所以我的问题是为什么张量没有被定义为 (20)
和 (28, 28)
?为什么在第一种情况下添加第二个维度并留空?另外,第二,必须定义多个 Channels ?
我明白它取决于层,所以Conv1D,Dense或Conv2D采用不同的形状但似乎第一个参数是隐式的?
根据docs,密集需要 (batch_size, ..., input_dim)
但这与示例有什么关系:
谢谢
1 回答
Tuples vs numbers
input_shape
必须是一个元组,所以只有(20,)
才能满足它 . 数字20
不是元组 . - 有参数input_dim
,如果您只有一个维度,可以让您的生活更轻松 . 此参数可以采用20
. (但实际上,我发现它只是令人困惑,我总是使用input_shape
并使用元组,以保持一致的理解) .Dense(32, input_shape=(784,))
与Dense(32, input_dim=784)
相同 .Images
图像不仅有像素,还有通道(红色,绿色,蓝色) .
黑/白图像只有一个通道 .
所以,
(28pixels, 28pixels, 1channel)
但请注意,没有任何义务可以随处处理图像 . 你可以按自己喜欢的方式塑造它们 . 但是某些层确实需要某种形状,否则它们无法工作 .
Some layers demand specific shapes
这是2D卷积层的情况,需要
(size1,size2,channels)
. 他们需要这种形状,因为他们必须相应地应用卷积滤波器 .这也是复发层的情况,需要
(timeSteps,featuresPerStep)
来执行它们的重复计算 .MNIST models
同样,没有义务以特定方式塑造您的图像 . 您必须根据您选择的第一层和您打算实现的目标来完成 . 这是免费的 .
很多例子都不够 . 它们可能以
Dense
层开始,这需要像(size,)
这样的形状其他示例可能会关注,并使用形状
(28,28)
,但这些模型将不得不重塑输入以满足下一层的需要 .卷积层2D将需要
(28,28,1)
.主要想法是: input arrays must match input_shape or input_dim.
Tensor shapes
但是,在阅读Keras错误消息或使用自定义/ lambda图层时要小心 .
我们之前定义的所有这些形状都省略了一个重要的维度: the batch size 或 number of samples .
在内部,所有张量都将具有此附加维度作为第一维度 . Keras会将其报告为
None
(这个尺寸将适应您拥有的任何批量) .因此,
input_shape=(784,)
将报告为(None,784)
.input_shape=(28,28,1)
将被报告为(None,28,28,1)
并且您的实际输入数据必须具有与报告的形状匹配的形状 .