出现的这样错误:
调试TensorFlow 2.0 程序时,发现错误如下:
_SymbolicException: Inputs to eager execution function cannot be Keras symbolic tensors, but found [<tf.Tensor 'my_rnn/lstm_cell/cond/Identity:0' shape=(None, 100) dtype=float32>, <tf.Tensor 'my_rnn/lstm_cell_1/cond/Identity:0' shape=(128, 64) dtype=float32>]
查阅资料发现的一种解决方案:
Keras在编译模型阶段,区分训练状态和非训练状态,二者的逻辑是不一样的。比如说,模型使用了Dropout,在训练时要随机失活部分神经元,而在正式运行(模型已经训练完毕后,在运行时),所有神经元都要保留的。
如果是训练状态,则在编译参数里增加一个选项即可:experimental_run_tf_function = False
training = True #设置一个布尔量,根据不同情况,调用不同的模型编译(装配)
if training: #
# 装配
model.compile(optimizer = optimizers.RMSprop(0.001),
loss = losses.BinaryCrossentropy(),
metrics=['accuracy'],
experimental_run_tf_function = False
)
else:
# 装配
model.compile(optimizer = optimizers.RMSprop(0.001),
loss = losses.BinaryCrossentropy(),
metrics=['accuracy']
)
设置之后,模型就可以运行了。
x_train shape: (25000, 80) tf.Tensor(1, shape=(), dtype=int64) tf.Tensor(0, shape=(), dtype=int64)
x_test shape: (25000, 80)
Epoch 1/50
194/195 [============================>.] - ETA: 0s - loss: 0.5002 - accuracy: 0.6656 Epoch 1/50
195/195 [==============================] - 6s 31ms/step - loss: 0.3957 - accuracy: 0.8240