加载Keras模型后预测报错(疑似掩码层相关问题)
加载Keras模型后预测报错(疑似掩码层相关问题)
看起来你遇到的问题根源出在掩码层(Masking)的mask_value定义方式上。当你用tf.convert_to_tensor()把数组转成Tensor对象后,Keras在保存模型时会把这个Tensor序列化成一个JSON格式的字典,但加载模型时无法自动将这个字典还原成有效的Tensor,导致掩码操作失败,出现你看到的报错。
解决方案
- 修改掩码层的mask_value定义:不需要手动用
tf.convert_to_tensor()转换,直接传入numpy数组或者Python列表即可。Keras的Masking层会自动将这些类型转换为合适的Tensor。修改后的模型定义如下:
model = tf.keras.Sequential([ tf.keras.layers.Input((352, 4)), # 直接用numpy数组,去掉tf.convert_to_tensor包装 tf.keras.layers.Masking(mask_value=np.array([0.0, 0.0, 0.0, 0.0])), tf.keras.layers.GRU(50, return_sequences=True, activation='tanh'), tf.keras.layers.Dropout(0.2), tf.keras.layers.GRU(50,activation='tanh'), tf.keras.layers.Dropout(0.2), tf.keras.layers.Dense(units=1, activation='sigmoid')])
或者更简单,直接用Python列表:
tf.keras.layers.Masking(mask_value=[0.0, 0.0, 0.0, 0.0]),
重新训练并保存模型:删除之前的
model.keras文件,用修改后的代码重新训练模型,再保存。验证效果:无论是在训练文件里加载保存后的模型,还是在单独的测试文件中加载,调用
model.predict()都应该能正常运行了。
补充说明
你之前在训练文件里直接调用model.predict()没问题,是因为当时mask_value是内存中有效的Tensor对象;但保存模型后,这个Tensor被序列化成了字典格式,加载时无法被正确解析为Tensor——哪怕在同一个文件里加载也会报错,因为加载的是保存下来的序列化内容,不是训练时的内存对象。
备注:内容来源于stack exchange,提问作者JD12
相关产品推荐
相关产品推荐

