Python 3.x Keras:密集层的输入形状

Python 3.x Keras:密集层的输入形状,python-3.x,tensorflow,keras,Python 3.x,Tensorflow,Keras,我正在以下位置阅读教程: 其中有一个名为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
的网络,其架构如下:

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\u dim
在第一个密集层中已指定为64,为什么允许输入形状为(128,64)的噪声

我知道这个想法是每次一批计算128个元素。我的问题是,
predict
函数究竟可以实现什么功能?Keras文档()具有以下内容:

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\u size
,x中的哪个维度应该是
input\u dim
?如果
噪波形状=(64128)
会发生什么情况?或者
(64256,256)
或者
(256,256,64)
?哪些是允许的?某处有隐藏的文件吗?谢谢

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

回答您的问题:

  • noise shape=(64128)
    将给出一个错误,因为预期的输入dim是64,而您提供了128(第一个维度中的64在这里并不重要,因为批大小可以是任何大小,并且不会更改模型架构)
  • (64,256,256)
    (256,256,64)
    会给您一个错误,因为提供了具有两个维度(+1个批次维度)的输入,而模型需要一维输入(+1个批次维度)
还可以查看API的文档:

将输入_形状参数传递给第一层。这是一个形状元组 (整数或None项的元组,其中None表示 可能需要正整数)。在input_形状中,批次维度 不包括在内

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


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

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

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

谢谢。。。我仍然感到困惑,我认为上面的代码使用的是顺序API而不是函数API。如果使用顺序API,它不是说“在input_形状中,批处理维度不包括在内”吗?我在这里遗漏了什么?还有,文档中哪里说“Keras模型期望数据的第一个维度是批处理维度”?我找不到它。。。谢谢您的代码确实使用了顺序API,但思想是相同的。我不确定你是否能在文档中找到这句话。谢谢sdcbr!所以输入形状的最大尺寸是2,可以是(输入尺寸1,输入尺寸2)或(批量尺寸,输入尺寸)?尽管未在文档中明确指定。这是正确的吗?谢谢噪声的形状为
(128,64)
,这意味着128个示例,每个示例由64个输入组成
model.predict()
实际上有一个参数
batch\u size
,默认值为32。调用
predict()
时,模型将按4批大小传递数据
(32,64)
。例子的数量并不重要。您可以传递一个shape
(500,64)
数组,它仍然可以工作。