【发布时间】:2021-02-22 10:08:21
【问题描述】:
我正在运行以下示例:
https://keras.io/examples/nlp/text_classification_with_transformer/
我已经按照描述创建并训练了一个模型,并且效果很好:
inputs = layers.Input(shape=(maxlen,))
embedding_layer = TokenAndPositionEmbedding(maxlen, vocab_size, embed_dim)
x = embedding_layer(inputs)
transformer_block = TransformerBlock(embed_dim, num_heads, ff_dim)
x = transformer_block(x,training=True)
x = layers.GlobalAveragePooling1D()(x)
x = layers.Dropout(0.1)(x)
x = layers.Dense(20, activation="relu")(x)
x = layers.Dropout(0.1)(x)
outputs = layers.Dense(2, activation="softmax")(x)
model = keras.Model(inputs=inputs, outputs=outputs)
"""
## Train and Evaluate
"""
model.compile("adam", "sparse_categorical_crossentropy", metrics=["accuracy"])
history = model.fit(
x_train, y_train, batch_size=1024, epochs=1, validation_data=(x_val, y_val)
)
model.save('SPAM.h5')
如何在 Keras 中正确保存和加载此类自定义模型?
我试过了
best_model=tf.keras.models.load_model('SPAM.h5')
ValueError: Unknown layer: TokenAndPositionEmbedding
但模型似乎错过了自定义层。但是以下也不起作用
best_model=tf.keras.models.load_model('SPAM.h5',custom_objects={"TokenAndPositionEmbedding": TokenAndPositionEmbedding()})
TypeError: __init__() missing 3 required positional arguments:
'maxlen', 'vocab_size', and 'embed_dim'
同样通过类也解决不了。
best_model=tf.keras.models.load_model('SPAM.h5',
custom_objects={"TokenAndPositionEmbedding": TokenAndPositionEmbedding})
TypeError: __init__() got an unexpected keyword argument 'name'
best_model=tf.keras.models.load_model('SPAM.h5',
{"TokenAndPositionEmbedding":
TokenAndPositionEmbedding,'TransformerBlock':TransformerBlock,
'MultiHeadSelfAttention':MultiHeadSelfAttention})
【问题讨论】:
-
也许这可以帮助你:Save and serialize: custom objects
-
为什么在 tf 而不是在 keras 文档中?
-
除非你真的考虑使用 tensorflow 之外的其他后端(我什至不确定是否仍然支持 theano),否则 tensorflow 网站上的文档通常更完整/最新。
-
为了保存/加载具有自定义层的模型或子类模型,您应该覆盖 get_config 和可选的 from_config 方法。此外,您应该使用注册自定义对象,以便 Keras 知道它。
-
我已经按照了,但还是同样的错误
标签: python tensorflow keras serialization transformer