我正在尝试训练一个包含两个嵌套模型的Keras模型,并且我想分别保存这两个内部模型的权重。目前我能够保存整个模型的权重,但无法加载大模型中嵌套模型的权重。
Big_model.summary
的输出看起来像这样
Model: "model_3"_________________________________________________________________Layer (type) Output Shape Param # =================================================================input_4 (InputLayer) [(None, 128, 128, 1)] 0 _________________________________________________________________model (Model) (None, 16, 16, 512) 170369024 _________________________________________________________________model_1 (Model) (None, 128, 128, 1) 15342209 =================================================================Total params: 185,711,233Trainable params: 185,711,233Non-trainable params: 0
如何查看两个内部模型的摘要,例如Big_model.inner_Model1.summary()
之类的东西,或者在训练后使用Big_model.inner_Model1.save_weights()
和Big_model.inner_Model2.save_weights()
或在model.fit
期间使用callbacks
来分别保存两个内部模型的权重呢?
我得到的结果是Big_model
没有名为inner_Model1
的模块,请问有什么帮助吗?
PS:训练或其他方面没有问题,我可以运行训练,我使用的是Tensorflow版本的tf.keras.models.Model
来创建模型。
这是我创建模型的方式
inner_Model1 = tf.keras.models.Model()inner_Model2 = tf.keras.models.Model()x = tf.keras.layers.Input(shape=IMAGE_SHAPE)Big_model = tf.keras.models.Model(x, inner_model2(inner_model1(x)))Big_model.compile(optimizer=optimizer, loss='mean_absolute_error')
回答:
在您发布的摘要中,model
是第一层,model_1
是第二层:
Big_model.layers[1].summary() #这是inner_Model1.summary()Big_model.layers[2].summary() #这是inner_Model2.summary()
您可以对它们进行任何操作。
如果您像那样创建了模型,那么直接这样做没有任何问题:
inner_Model1.save_weights(...)inner_Model2.save_weights(...)
如果您在大模型之外加载权重,它也会正常工作,它会看到变化。
inner_Model1.load_weights(...)inner_Model2.load_weights(...)