【问题标题】:Keras: input shape of a dense layerKeras:密集层的输入形状
【发布时间】:2018-08-03 18:51:07
【问题描述】:

我正在阅读教程: 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 以及 x 中的哪个维度应该是 input_dim?如果 noise shape = (64,128) 会发生什么?或(64, 256, 256) 或(256, 256, 64)?哪些是允许的?某处有隐藏文件吗?谢谢!

【问题讨论】:

    标签: python-3.x tensorflow keras


    【解决方案1】:

    Keras 模型期望数据的第一个维度是批处理维度。您可以从功能 API 查看Input layers 上的文档。该层有一个shape 参数和一个batch_shape 参数。两者都有效,但后者允许显式定义批处理形状。

    回答您的问题:

    • noise shape = (64,128) 会出错,因为预期的输入 dim 为 64,而您提供 128(第一维中的 64 在这里无关紧要,因为批量大小可以是任何值,并且不会改变模型架构)
    • (64, 256, 256) 和 (256, 256, 64) 会给您一个错误,因为提供了具有二维(+ 1 个批次维度)的输入,而模型需要一维输入(+ 1 个批次维度)。

    还可以查看Sequential API 的文档:

    将 input_shape 参数传递给第一层。这是一个形状元组 (整数元组或 None 条目,其中 None 表示任何 可能是正整数)。在 input_shape 中,批量维度 不包括在内。

    如果您需要为输入指定固定的批量大小(此 对有状态的循环网络很有用),你可以传递一个 batch_size 层的参数。如果您同时通过 batch_size=32 和 input_shape=(6, 8) 到一个层,然后它将期望每批 输入具有批处理形状 (32, 6, 8)。

    【讨论】:

    • 谢谢! ...我仍然很困惑,我认为上面的代码使用的是 Sequential API 而不是功能 API。如果使用 Sequential API,不是说“在 input_shape 中,不包括批处理维度。”吗?我在这里错过了什么?
    • 另外,在文档中的什么地方说“Keras 模型期望数据的第一个维度是批处理维度。”?我找不到它...谢谢!
    • 您的代码确实使用了 Sequential API,但想法是一样的。我不确定您是否会在文档中的某个地方找到该引用。
    • 感谢 sdcbr!所以 input_shape 的最大 dim 是 2,可以是 (input_dim_1, input_dim_2 ) 还是 (batch_dim, input_dim)?虽然没有在文档中明确指定。它是否正确?谢谢!
    • Noise 的形状为(128, 64),这意味着 128 个示例,每个示例由 64 个输入组成。 model.predict() 实际上有一个参数batch_size,默认为32。当调用predict() 时,模型会将你的数据以(32, 64) 的4 批次传递。示例的数量无关紧要。你可以传递一个形状数组(500, 64),它仍然可以工作。
    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2020-08-17
      • 2019-02-18
      • 1970-01-01
      • 2022-01-15
      • 2016-03-24
      • 2018-02-27
      • 2017-05-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多