Keras:密集层的输入形状

时间:2018-08-03 18:51:07

标签: python-3.x tensorflow keras

我正在以下位置阅读本教程: 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)?允许哪些?某处有隐藏文件吗?谢谢!

2 个答案:

答案 0 :(得分:2)

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

要回答您的问题:

  • noise shape = (64,128)会出现错误,因为预期的输入昏暗值为64,而您提供了128(第一维中的64并不重要,因为批量大小可以是任何值,并且不会更改模型体系结构)< / li>
  • (64, 256, 256)(256, 256, 64)会给您一个错误,因为提供了具有二维(+1个批处理尺寸)的输入,其中模型期望一维输入(+1个批处理尺寸)。 / li>

还请查看Sequential API的文档:

  

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

     

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

答案 1 :(得分:0)

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

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

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