Sha*_*ail 36 python keras tensorflow
我正在尝试使用 保存我的 TensorFlow 模型model.save(),但是 - 我收到此错误。
变压器模型的代码:
def transformer(vocab_size, num_layers, units, d_model, num_heads, dropout, name="transformer"):
inputs = tf.keras.Input(shape=(None,), name="inputs")
dec_inputs = tf.keras.Input(shape=(None,), name="dec_inputs")
enc_padding_mask = tf.keras.layers.Lambda(
create_padding_mask, output_shape=(1, 1, None),
name='enc_padding_mask')(inputs)
# mask the future tokens for decoder inputs at the 1st attention block
look_ahead_mask = tf.keras.layers.Lambda(
create_look_ahead_mask,
output_shape=(1, None, None),
name='look_ahead_mask')(dec_inputs)
# mask the encoder outputs for the 2nd attention block
dec_padding_mask = tf.keras.layers.Lambda(
create_padding_mask, output_shape=(1, 1, None),
name='dec_padding_mask')(inputs)
enc_outputs = encoder(
vocab_size=vocab_size,
num_layers=num_layers,
units=units,
d_model=d_model,
num_heads=num_heads,
dropout=dropout,
)(inputs=[inputs, enc_padding_mask])
dec_outputs = decoder(
vocab_size=vocab_size,
num_layers=num_layers,
units=units,
d_model=d_model,
num_heads=num_heads,
dropout=dropout,
)(inputs=[dec_inputs, enc_outputs, look_ahead_mask, dec_padding_mask])
outputs = tf.keras.layers.Dense(units=vocab_size, name="outputs")(dec_outputs)
return tf.keras.Model(inputs=[inputs, dec_inputs], outputs=outputs, name=name)
Run Code Online (Sandbox Code Playgroud)
我不明白为什么会出现这个错误,因为模型训练得很好。任何帮助,将不胜感激。
我的保存代码供参考:
print("Saving the model.")
saveloc = "C:/tmp/solar.h5"
model.save(saveloc)
print("Model saved to: " + saveloc + " succesfully.")
Run Code Online (Sandbox Code Playgroud)
Eli*_*adL 58
这不是一个错误,这是一个功能。
此错误让您知道 TF 无法保存您的模型,因为它无法加载它。
具体来说,它将无法重新实例化您的自定义Layer类:encoder和decoder.
要解决这个问题,只需get_config根据您添加的新参数覆盖他们的方法。
层配置是包含层配置的 Python 字典(可序列化)。稍后可以从此配置中重新实例化同一层(没有其训练的权重)。
例如,如果您的encoder类看起来像这样:
class encoder(tf.keras.layers.Layer):
def __init__(
self,
vocab_size, num_layers, units, d_model, num_heads, dropout,
**kwargs,
):
super().__init__(**kwargs)
self.vocab_size = vocab_size
self.num_layers = num_layers
self.units = units
self.d_model = d_model
self.num_heads = num_heads
self.dropout = dropout
# Other methods etc.
Run Code Online (Sandbox Code Playgroud)
那么你只需要覆盖这个方法:
def get_config(self):
config = super().get_config().copy()
config.update({
'vocab_size': self.vocab_size,
'num_layers': self.num_layers,
'units': self.units,
'd_model': self.d_model,
'num_heads': self.num_heads,
'dropout': self.dropout,
})
return config
Run Code Online (Sandbox Code Playgroud)
当 TF 看到这个(对于两个类)时,您将能够保存模型。
因为现在加载模型时,TF 将能够从 config.xml 重新实例化同一层。
Layer.from_config的源代码可能会更好地了解它的工作原理:
@classmethod
def from_config(cls, config):
return cls(**config)
Run Code Online (Sandbox Code Playgroud)
小智 7
此问题是由 keras 和 tf.keras 库之间混合导入引起的,该库不受支持。
到处使用 tf.keras.models 或 usr keras.models
你不应该在这些库之间混合导入,因为它不会工作并产生各种奇怪的错误消息。这些错误随着 keras 和 TensorFlow 版本的不同而变化。
| 归档时间: |
|
| 查看次数: |
22228 次 |
| 最近记录: |