我正在尝试使用model.save()
保存TensorFlow模型,但是-我遇到此错误。
此处提供了模型摘要: Model Summary
变压器模型的代码:
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)
我不明白为什么会出现此错误,因为模型训练得很好。 任何帮助将不胜感激。
我的保存代码供参考:
print("Saving the model.")
saveloc = "C:/tmp/solar.h5"
model.save(saveloc)
print("Model saved to: " + saveloc + " succesfully.")
答案 0 :(得分:3)
这不是错误,而是功能。
此错误使您知道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.
那么您只需要覆盖此方法:
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
当TF看到这两个类时,您将能够保存模型。
因为现在在加载模型时,TF将能够从config重新实例化同一层。
Layer.from_config
的source code可以更好地了解其工作原理:
@classmethod
def from_config(cls, config):
return cls(**config)
答案 1 :(得分:0)
我认为简单的解决方案是为 gpu tensorflow-gpu==2.4.2 安装 tensorflow==2.4.2,我遇到了这个问题并调试了一整天,但没有解决。最后我安装了旧的稳定版本,错误消失了
答案 2 :(得分:-1)
这似乎是TensorFlow中的一个内部问题。
经过一番谷歌搜索,浏览了GitHub并发现了一个相对类似的问题-我得出了这个结论。
可以在这里找到研究材料:
“ ...最近已在SignInEmail.tsx(48, 3): 'firebase' is declared here.
中修复,但我们还没有将其拾取到498e815
中...”
在TensorFlow本身无法在其发行版中解决此问题之前,只能保存权重,并且每个实例都需要重新编译模型。
节省重量:
2.0 rc
随后加载权重:
# Saving model weights.
model.save_weights("C:/tmp/solar-model/solar", save_format = "tf")
# If you want to save it in a zip.
zipdir = "model.zip"
zipreference = zipfile.ZipFile(zipdir, "w")
zipreference.write("C:/tmp/solar-model/checkpoint", compress_type = zipfile.ZIP_DEFLATED)
zipreference.write("C:/tmp/solar-model/solar.data-00000-of-00002", compress_type = zipfile.ZIP_DEFLATED)
zipreference.write("C:/tmp/solar-model/solar.data-00001-of-00002", compress_type = zipfile.ZIP_DEFLATED)
zipreference.write("C:/tmp/solar-model/solar.index", compress_type = zipfile.ZIP_DEFLATED)
zipreference.close()