英文:
Tensorflow Keras Model subclassing -- call function
问题
我正在使用Tensorflow进行自监督学习的实验。我正在运行的示例代码可以在Keras示例网站上找到。这是链接到NNCLR示例。可以在这里找到下载代码的Github链接。虽然我可以运行示例没有问题,但当我尝试使用model.save()
保存预训练模型或微调模型时,出现了问题。
我得到的错误消息如下:
ValueError: 无法保存模型<__main__.NNCLR object at 0x7f6bc0f39550>,因为输入形状不可用或模型的前向传递没有定义。要定义前向传递,请覆盖`Model.call()`。要指定输入形状,直接调用`build(input_shape)`,或者使用`Model()`、`Model.fit()`或`Model.predict()`在实际数据上调用模型。如果有自定义的训练步骤,请确保通过`Model.__call__`在训练步骤中调用前向传递,即`model(inputs)`,而不是`model.call()`。
我不确定如何覆盖`Model.call()`方法。感谢帮助。
[1]: https://keras.io/examples/vision/nnclr/
[2]: https://github.com/keras-team/keras-io/blob/master/examples/vision/nnclr.py
英文:
I am experimenting with self supervised learning using tensorflow. The example code I'm running can be found in the Keras examples website. This is the link to the NNCLR example. The Github link to download the code can be found here. While I have no issues running the examples, I am running into issues when I try to save the pretrained or the finetuned model using model.save()
.
The error I'm getting is this:
f"Model {model} cannot be saved either because the input shape is not "
ValueError: Model <__main__.NNCLR object at 0x7f6bc0f39550> cannot be saved either
because the input shape is not available or because the forward pass of the model is
not defined. To define a forward pass, please override `Model.call()`.
To specify an input shape, either call `build(input_shape)` directly, or call the model on actual data using `Model()`, `Model.fit()`, or `Model.predict()`.
If you have a custom training step, please make sure to invoke the forward pass in train step through
`Model.__call__`, i.e. `model(inputs)`, as opposed to `model.call()`.
I am unsure how to override the Model.call() method. Appreciate some help.
答案1
得分: 1
以下是翻译好的部分:
一种在这种情况下实现模型保存的方法是重写 keras.Model
类中的 save
(或 save_weights
)方法。在您的情况下,首先在 NNCLR
类中初始化微调模型,然后重写其 save
方法。顺便提一下,通过这种方式,您还可以使用 ModelCheckpoint
API。
如下所述,在 NNCLR
模型类中定义微调模型,并重写其 save
方法。
class NNCLR(keras.Model):
def __init__(...):
super().__init__()
...
self.finetuning_model = keras.Sequential(
[
layers.Input(shape=input_shape),
self.classification_augmenter,
self.encoder,
layers.Dense(10),
],
name="finetuning_model",
)
...
def save(
self, filepath, overwrite=True, include_optimizer=True,
save_format=None, signatures=None, options=None
):
self.finetuning_model.save(
filepath=filepath,
overwrite=overwrite,
save_format=save_format,
options=options,
include_optimizer=include_optimizer,
signatures=signatures
)
model = NNCLR(...)
model.compile
model.fit
接下来,您可以执行以下操作:
model.save('finetune_model') # 以SavedModel格式保存
finetune_model = tf.keras.models.load_model('finetune_model', compile=False)
# NNCLR 代码示例:评估部分
"A popular way to evaluate a SSL method in computer vision or
for that fact any other pre-training method as such is to learn
a linear classifier on the frozen features of the trained backbone
model and evaluate the classifier on unseen images."
for layer in finetune_model.layers:
if not isinstance(layer, layers.Dense):
layer.trainable = False
finetune_model.summary() # OK
finetune_model.compile(
optimizer=keras.optimizers.Adam(),
loss=keras.losses.SparseCategoricalCrossentropy(from_logits=True),
metrics=[keras.metrics.SparseCategoricalAccuracy(name="acc")],
)
finetune_model.fit
请注意,以上内容是提供的翻译,可能与原文有细微差异,但保留了代码的结构和逻辑。
英文:
One way to achieve model saving in such cases is to override the save
(or save_weights
) method in the keras.Model
class. In your case, first initialize the finetune model in the NNCLR
class. And next, override the save
method for it. FYI, in this way, you may also able to use ModelCheckpoint
API.
As said, define the finetune model in the NNCLR
model class and override the save
method for it.
class NNCLR(keras.Model):
def __init__(...):
super().__init__()
...
self.finetuning_model = keras.Sequential(
[
layers.Input(shape=input_shape),
self.classification_augmenter,
self.encoder,
layers.Dense(10),
],
name="finetuning_model",
)
...
def save(
self, filepath, overwrite=True, include_optimizer=True,
save_format=None, signatures=None, options=None
):
self.finetuning_model.save(
filepath=filepath,
overwrite=overwrite,
save_format=save_format,
options=options,
include_optimizer=include_optimizer,
signatures=signatures
)
model = NNCLR(...)
model.compile
model.fit
Next, you can do
model.save('finetune_model') # SavedModel format
finetune_model = tf.keras.models.load_model('finetune_model', compile=False)
'''
NNCLR code example: Evaluate sections
"A popular way to evaluate a SSL method in computer vision or
for that fact any other pre-training method as such is to learn
a linear classifier on the frozen features of the trained backbone
model and evaluate the classifier on unseen images."
'''
for layer in finetune_model.layers:
if not isinstance(layer, layers.Dense):
layer.trainable = False
finetune_model.summary() # OK
finetune_model.compile(
optimizer=keras.optimizers.Adam(),
loss=keras.losses.SparseCategoricalCrossentropy(from_logits=True),
metrics=[keras.metrics.SparseCategoricalAccuracy(name="acc")],
)
finetune_model.fit
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论