Keras:密集层的输入形状

4
我正在阅读以下教程: https://www.datacamp.com/community/tutorials/generative-adversarial-networks 其中有一个名为generator的网络,其架构如下:
generator = Sequential()

generator.add(Dense(256, input_dim=64, kernel_initializer=initializers.RandomNormal(stddev=0.02)))
generator.add(LeakyReLU(0.2))

generator.add(Dense(512))
generator.add(LeakyReLU(0.2))

generator.add(Dense(1024))
generator.add(LeakyReLU(0.2))

# last layer output a 28x28 image
generator.add(Dense(784, activation='tanh'))
generator.compile(loss='binary_crossentropy', optimizer=optimizer)

生成器的输入被称为“噪声”,如下所示:
noise = np.random.normal(0, 1, size=[batch_size, input_dim])
print (noise.shape)

噪音的形状是:
noise shape:  (128, 64)

我们有:

generated_images = generator.predict(noise)

这是我困惑的地方:生成器的input_dim在第一个Dense层中被指定为64,为什么可以输入形状为(128,64)的噪声?
我理解的想法是每次在批处理中计算128个元素。我的问题是predict函数到底可以接受什么?Keras文档(https://keras.io/models/sequential/)中写道:
predict(x, batch_size=None, verbose=0, steps=None)

x: The input data, as a Numpy array (or list of Numpy arrays if the model has multiple inputs).

但是我们如何知道x中哪个维度应该是batch_size,哪个维度应该是input_dim?如果noise shape = (64,128),或者(64, 256, 256),或者(256, 256, 64)会发生什么?哪些是允许的?是否有隐藏的文档?谢谢!

2个回答

3
Keras模型要求您的数据的第一个维度为batch维度。您可以查看来自功能API的Input层文档。此层具有shape参数和batch_shape参数,两者都可以工作,但后者允许显式定义batch形状。
回答您的问题:
- noise shape = (64,128)会导致错误,因为期望的输入维度是64,而您提供了128(这里的第一个维度为64并不重要,因为批量大小可以是任何值,不会改变模型结构)。 - (64, 256, 256)和(256, 256, 64)会给您带来错误,因为提供了具有两个维度(+1 batch维度)的输入,而模型期望1维输入(+1 batch维度)。
还请查看Sequential API的文档:
将input_shape参数传递给第一层。这是一个形状元组(由整数或None条目组成的元组,其中None表示可以预期任何正整数)。在input_shape中,批次维度未包含在内。
如果您需要为输入指定固定的批次大小(这对于具有状态的循环网络非常有用),则可以向层传递一个batch_size参数。如果您同时向层传递batch_size = 32和input_shape =(6,8),则它将期望每个批次的输入具有批量形状(32,6,8)。

谢谢!我还是有点困惑,我以为上面的代码是使用顺序API而不是函数式API。如果使用顺序API,那么它不是说“在input_shape中,批次维度不包括”吗?我错过了什么? - Edamame
另外,在文档的哪个位置提到“Keras 模型期望数据的第一个维度是批处理维度”?我找不到了...谢谢! - Edamame
你的代码确实使用了Sequential API,但是思路是一样的。我不确定你是否能在文档中找到这句话的字面意思。 - sdcbr
在Sequential API中,input_shape从不期望批量大小。如果您想要的话,可以通过额外的batch_size参数指定批量大小。对于功能API也是同样的道理:shape从不期望批量形状,而是batch_shape - sdcbr
1
噪音的形状为(128, 64),这意味着有128个示例,每个示例包含64个输入。实际上model.predict()具有名为 batch_size 的参数,默认值为32。调用predict()时,模型将使用大小为(32, 64)的4个批次来处理数据。示例的数量并不重要。您可以传递一个形状为 (500, 64) 的数组,它仍然可以工作。 - sdcbr
显示剩余2条评论

0

你对输入数据和批量大小感到困惑。

  • 输入数据包含许多数据样本,每个样本是输入矩阵中的一行。样本数量是输入大小。
  • 批次是在一次计算中处理的输入数据的子集。批次大小中的样本数。

在你的例子中,128 是输入大小。如果你不指定批量大小,它将一次性计算所有输入数据,因此输入数据等同于一个批次(例如,在在线数据生成器上训练/预测)。你也可以指定批量大小来划分输入数据并在较小的批次上进行计算。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接