加载tf2 keras模型出错,'SparseTensorSpec' object has no attribute 'name'

tf.keras.models.load_model(model_path)

加载模型出错: ‘SparseTensorSpec’ object has no attribute ‘name’

我在tfrecord中使用了一个变长特征:

 "pkgSeq": tf.io.VarLenFeature(tf.int64)

具体模型定义如下:

from tensorflow.keras import Model

class DNN2(Model):
    ...

    @tf.function
    def call(self, inputs, training=False):
        
        seq_embed = tf.nn.embedding_lookup_sparse(self.item_embedding_table, inputs['pkgSeq'], None)


        feature = tf.concat([userinfo_user_age,
                             ...
                             seq_embed,
                             
                             ], axis=-1)

        result = self.layer1(feature)
        output = self.layer2(result)
        return output

保存模型时,使用了两种方式对比测试:

model = DNN2()
# way 1
save_path = os.path.join(ckpt_dir, './model')
model.save(save_path, save_format='tf')

# way 2
save_path2 = os.path.join(ckpt_dir, './model2')
tf.saved_model.save(model, save_path2)

然后使用
(1)tf 自带方式

model = tf.saved_model.load(model_path)

两个路径都可以正常加载。

(2)
但使用 keras加载时,便会出错:‘SparseTensorSpec’ object has no attribute ‘name’。 我想知道是哪里有问题,以及如何解决。谢谢!!

model2 = tf.keras.models.load_model(model_path)

两个保存的方式保存的文件格式应该是不一样的,参考 https://tf.wiki/zh_hans/deployment/export.html ,建议首选TensorFlow内置的SavedModel,Keras的模型导出可能与TensorFlow本体的兼容性还不是那么好

1 Like