为什么在Keras层的方法调用中批次大小为None?

时间:2019-04-28 13:21:41

标签: tensorflow keras

我正在Keras中实现自定义层。如果我打印传递给call方法的输入的形状,则会得到None作为第一个元素。这是为什么?第一个元素不应该是批次大小吗?

def call(self, x):
    print(x.shape)  # (None, ...)

当我致电model.fit时,我正在传递批处理大小

batch_size = 50
model.fit(x_train, y_train, ..., batch_size=batch_size)

那么,什么时候才真正调用方法call?在方法call中获取批处理大小的推荐方法是什么?

2 个答案:

答案 0 :(得分:1)

None表示它是动态形状。它可以取任何值,具体取决于您选择的批次大小。

默认情况下,定义模型时,模型将定义为支持您可以选择的任何批量大小。这就是None的意思。在TensorFlow 1.*中,模型的输入是tf.placeholder()的实例。

如果您不使用指定批量大小的keras.InputLayer(),则默认情况下将获得第一维None

import tensorflow as tf

model = tf.keras.models.Sequential()
model.add(tf.keras.layers.Dense(units=2, input_shape=(2, )))
print(model.inputs[0].get_shape().as_list()) # [None, 2]
print(model.inputs[0].op.type == 'Placeholder') # True

当您以指定的批次大小使用keras.InputLayer()时,可以定义具有固定批次大小的输入占位符:

import tensorflow as tf

model = tf.keras.models.Sequential()
model.add(tf.keras.layers.InputLayer((2,), batch_size=50))
model.add(tf.keras.layers.Dense(units=2, input_shape=(2, )))
print(model.inputs[0].get_shape().as_list()) # [50, 2]
print(model.inputs[0].op.type == 'Placeholder') # True

当您为model.fit()方法指定批处理大小时,这些输入占位符已被定义,您不能修改其形状。 model.fit()的批次大小仅用于拆分您提供给批次的数据。

如果您使用批处理大小2定义输入层,然后将不同的批处理大小值传递给model.fit()方法,您将得到ValueError

import tensorflow as tf
import numpy as np

model = tf.keras.models.Sequential()
model.add(tf.keras.layers.InputLayer((2,), batch_size=2)) # <--batch_size==2
model.add(tf.keras.layers.Dense(units=2, input_shape=(2, )))
model.compile(optimizer=tf.keras.optimizers.Adam(),
              loss='categorical_crossentropy')
x_train = np.random.normal(size=(10, 2))
y_train = np.array([[0, 1] for _ in range(10)])

model.fit(x_train, y_train, batch_size=3) # <--batch_size==3

这将引发: ValueError: The batch_size argument value 3 is incompatible with the specified batch size of your Input Layer: 2

答案 1 :(得分:0)

我遇到了同样的问题,发现使用tf.shape(your_variable)代替your_variable.shape解决了这个问题。由于tf.shape(your_variable)是在稍后调用fit函数时动态评估的。

参考 https://github.com/tensorflow/tensorflow/issues/36991#issuecomment-590448880