我在两台电脑上工作(一台在家里,一台在公司);他们都安装了TensorFlow 2.8.0。当我在家里训练模型时(它是tf.keras.Sequential模型),通过调用保存它:
model.save(<filepath>)
并在工作时加载它,方法是调用:
tf.keras.models.load_model(<filepath>)
它将失败,并显示错误:
AttributeError: '_UserObject' object has no attribute 'predict'
我在这里读到error:'_UserObject' object has no attribute 'predict',它可能是因为不同的版本(这不应该是我的情况),一个可能的解决方案是使用Keras格式(H5),但我想知道为什么这应该是必要的。有人解决了这个问题使用默认的TF模型格式吗?
- (我没有尝试H5格式,因为这意味着我将不得不重新培训或至少重新保存我在家庭办公室培训的所有模型;我想它会工作,但我不明白为什么TF模型格式不应该工作。)*
**编辑:**我遇到此问题的一个型号(尽管根据我的经验,这不应该是一个问题):
layers = []
layers += [tf.keras.layers.Dense(len(training_data[0]), activation=None)]
layers += [tf.keras.layers.BatchNormalization()]
layers += [tf.keras.layers.Activation(activation_type)]
layers += [tf.keras.layers.Dense(len(training_data[0]) * 2, activation=None)]
layers += [tf.keras.layers.BatchNormalization()]
layers += [tf.keras.layers.Activation(activation_type)]
layers += [tf.keras.layers.Dropout(0.5)]
layers += [tf.keras.layers.Dense(len(training_data[0]), activation=None)]
layers += [tf.keras.layers.BatchNormalization()]
layers += [tf.keras.layers.Activation(activation_type)]
layers += [tf.keras.layers.Dense(len(training_data[0] / 2), activation=None)]
layers += [tf.keras.layers.BatchNormalization()]
layers += [tf.keras.layers.Activation(activation_type)]
layers += [tf.keras.layers.Dense(classes_count, activation="softmax")]
model = tf.keras.Sequential(layers)
1条答案
按热度按时间tf7tbtn21#
TL;DR像调用输入Tensor上的函数一样调用模型。
如果您非常需要推理/预测功能,可以按如下方式进行:
***说明:***使用语法
model.save(<filepath>)
保存tensorflow 序列模型时,使用的是keras模型。这将以默认的SavedModel格式保存模型。https://www.tensorflow.org/guide/keras/save_and_serialize#how_to_save_and_load_a_model
当保存模型及其层时,SavedModel格式存储类名、调用函数、损耗和权重(以及配置,如果实现的话)。调用函数定义模型/层的计算图形。
在缺少模型/层配置的情况下,调用函数用于创建与原始模型类似的模型,该模型可以被训练、评估和用于推断。
注意第二段的解释。它说当模型配置不存在时,模型的
call function
可以用于推断。嗯!!!当你没有通过Model子类化定义tensorflow keras模型的
call
函数时,如何调用它?为了理解这一点,我们需要知道call
方法的用途是什么。检查下面的例子:从文档https://www.tensorflow.org/api_docs/python/tf/keras/Model#call中,我们知道当我们通过子类化定义一个模型时,模型的前向传递是在
call
中实现的。不应直接调用此方法。它仅在对tf. keras. Model进行子类化时被覆盖。要对输入调用模型,请始终使用call()方法,即model(inputs),它依赖于底层call()方法。
这个正向传递是通过在一个序列keras模型中堆叠层来定义的。因此,我们可以将序列模型本身视为
call
函数。因此,在加载模型后,我们应该像使用一个函数一样使用它,它采用输入Tensor。因此
model(input_tensor)