python - 为什么我必须调用 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.
有人可以解释我为什么吗?我为这个主题提出了建议的问题,但我没有找到答案......
解决方案
来自文档
这种 [预测] 方法是为大规模输入的性能而设计的。对于一批适合的少量输入,建议直接使用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
在开始时添加图层,它也可以解决问题。
这回答了你的问题了吗?
推荐阅读
- python - 我该怎么做才能停止收到一些“本地未绑定”错误消息?
- unity3d - Unity Asset Bundles 使用旧数据重建
- python - Blender中骨骼的顺序与Python中不同
- c# - 在 C# 中将面板置于最前面
- sql - 是否有任何命令可以执行 SQL 并剪切数据库行中的最后一个单词?
- node.js - Express 虚拟路径前缀不适用于 Angular 6 应用程序
- r - 如何更改 R 中列中的更新值?
- macos - 将 Nginx 配置为 Vapor API 的代理
- go - 如何在 go 代码中调用 graphql 解析器
- angular - 将字符串数组循环到文本框并从提交表单中发布,更改角度为 7