首页 > 解决方案 > 为什么我必须调用 model.predict(x) 而不是 model(x)?

问题描述

我有以下 keras 模型:

def model_1(vocab_size, output_dim, batch_input_dims, rnn_units, input_shape_LSTM, name='model_1'):

model = Sequential(name=name)

model.add(Embedding(input_dim=vocab_size+1, output_dim=output_dim, mask_zero=True, batch_input_shape=batch_input_dims))

model.add(LSTM(units=rnn_units, input_shape=input_shape_LSTM, 
    stateful=True, 
    return_sequences=True, 
    recurrent_initializer='glorot_uniform',
    recurrent_activation='sigmoid'))

model.add(Dense(units=vocab_size))

return model

然后我得到向量 x_ 和 y_ 由下式给出:

x_, y_ = get_batches(X, y, batch_size)
x_shape: (32, 200000)
y_ shape: (32, 200000)

现在,我不明白为什么如果我打电话:

model.predict(x_)

我得到了预期的数组。

相反,如果我打电话:

model(x_)

出现以下错误:

ValueError: Layer model_1 was called with an input that isn't a symbolic tensor. Received type: <class 'numpy.ndarray'>. Full input: [array([[    0,     0,     0, ..., 21839, 21841,  9579],
   [    0,     0,     0, ...,     1,     1, 23012],
   [    0,     0,     0, ...,   246,  9832,  9832],
   ...,
   [    0,     0,     0, ..., 24827, 24867, 24868],
   [    0,     0,     0, ..., 22448, 22426, 22426],
   [    0,     0,     0, ...,     1,     1,     1]])]. All inputs to the layer should be tensors.

有人可以解释我为什么吗?我为这个主题提出了建议的问题,但我没有找到答案......

标签: pythontensorflowkeras

解决方案


来自文档

这种 [预测] 方法是为大规模输入的性能而设计的。对于一批适合的少量输入,建议直接使用call以加快执行速度,例如 model(x) 或 model(x, training=False)

如果你不熟悉 python 的神奇功能,那么 usingmy_object(x)就相当于写my_object.__call__(x).

那么,这句话如何适用于您的案例?

扩展模型也是一个tf.keras.layer.Layer,这就是为什么您可以将多个模型堆叠成更高级别的模型。因为它也是一个层,所以当你调用它时model(x),它就像一个层,只返回转换后的输入,仅此而已。但是,当您将其称为 like 时model.predict(x),它​​更像是一个模型,并以在使用模型进行预测时更有用的方式为您提供转换。

为什么会出现异常?

因为该Embedding层需要 atf.Tensor并且调用模型时model(x)不会执行该转换。您可以手动执行此操作,tf.constant([array])然后它将起作用。或者,您可以tf.keras.layers.Input在开始时添加图层,它也可以解决问题。

这回答了你的问题了吗?


推荐阅读