繁体   English   中英

如何在 Keras 中重用 model 和权重

[英]How to reuse the model and weights in Keras

我创建了一个 model 并安装如下所示。 我还按照Keras 官方文档来保存和加载 model。

c1 = tf.keras.layers.Conv2D(16, (3, 3), activation='relu', kernel_initializer='he_normal', padding='same')(inputs)
c1 = tf.keras.layers.Conv2D(16, (3, 3), activation='relu', kernel_initializer='he_normal', padding='same')(c1)
p1 = tf.keras.layers.MaxPooling2D((2, 2))(c1)

c2 = tf.keras.layers.Conv2D(32, (3, 3), activation='relu', kernel_initializer='he_normal', padding='same')(p1)
c2 = tf.keras.layers.Conv2D(32, (3, 3), activation='relu', kernel_initializer='he_normal', padding='same')(c2)

u3 = tf.keras.layers.Conv2DTranspose(16, (2, 2), strides=(2, 2), padding='same')(c2)
u3 = tf.keras.layers.concatenate([u3, c1], axis=3)
c3 = tf.keras.layers.Conv2D(16, (3, 3), activation='relu', kernel_initializer='he_normal', padding='same')(u3)
c3 = tf.keras.layers.Conv2D(16, (3, 3), activation='relu', kernel_initializer='he_normal', padding='same')(c3)

outputs = tf.keras.layers.Conv2D(1, (1, 1), activation='linear')(c3)
model = tf.keras.Model(inputs=[inputs], outputs=[outputs])
model.compile(optimizer='ADAM', loss='mean_squared_error', metrics=['mae'])

model.save('my_model')
model.save_weights('my_model_weights.h5')

history = model.fit(
    train_generator,
    steps_per_epoch=train_steps,
    epochs=epochs,
    validation_data=validation_generator,
    validation_steps=valid_steps)

我知道保存的 model 和权重可以如下加载:

model.load_weights('my_model_weights.h5')
model.load_weights('my_model_weights.h5', by_name=True)

如果我想进行迁移学习并将保存的 model 和权重应用于相同的架构但数据不同,应该怎么做?


错误:


AttributeError                            Traceback (most recent call last)
<ipython-input-16-e5ee0aa441fb> in <module>
      1 # Loading saved model
----> 2 new_model = tf.keras.load_model('my_model')
      3 # New model using the same architecture, but without loading it
      4 new_model_bis = tf.keras.Model(inputs=[inputs], outputs=[outputs])
      5 new_model_bis.compile(optimizer='ADAM', loss='mean_squared_error', metrics=['mae'])

AttributeError: module 'tensorflow.keras' has no attribute 'load_model'

你部分回答了你自己的问题。
保存权重后,如果保存了 model,则首先需要加载 model,然后是权重。 如果只保存权重,则需要创建具有完全相同架构的 model,然后加载权重

c1 = tf.keras.layers.Conv2D(16, (3, 3), activation='relu', kernel_initializer='he_normal', padding='same')(inputs)
c1 = tf.keras.layers.Conv2D(16, (3, 3), activation='relu', kernel_initializer='he_normal', padding='same')(c1)
p1 = tf.keras.layers.MaxPooling2D((2, 2))(c1)

c2 = tf.keras.layers.Conv2D(32, (3, 3), activation='relu', kernel_initializer='he_normal', padding='same')(p1)
c2 = tf.keras.layers.Conv2D(32, (3, 3), activation='relu', kernel_initializer='he_normal', padding='same')(c2)

u3 = tf.keras.layers.Conv2DTranspose(16, (2, 2), strides=(2, 2), padding='same')(c2)
u3 = tf.keras.layers.concatenate([u3, c1], axis=3)
c3 = tf.keras.layers.Conv2D(16, (3, 3), activation='relu', kernel_initializer='he_normal', padding='same')(u3)
c3 = tf.keras.layers.Conv2D(16, (3, 3), activation='relu', kernel_initializer='he_normal', padding='same')(c3)

outputs = tf.keras.layers.Conv2D(1, (1, 1), activation='linear')(c3)
model = tf.keras.Model(inputs=[inputs], outputs=[outputs])
model.compile(optimizer='ADAM', loss='mean_squared_error', metrics=['mae'])

model.save('my_model')
model.save_weights('my_model_weights.h5')

# Here's how you load the weight and models

# Loading saved model
new_model = tf.keras.load_model('my_model')
# New model using the same architecture, but without loading it
new_model_bis = tf.keras.Model(inputs=[inputs], outputs=[outputs])
new_model_bis.compile(optimizer='ADAM', loss='mean_squared_error', metrics=['mae'])

new_model.load_weights('my_model_weights.h5')
new_model_bis.load_weights('my_model_weights.h5')


print(new_model.summary())
# Both models would now be ready to use
new_model.predict(...)

然而,这不是迁移学习。 那只是训练 model,然后在其他地方重用它。 迁移学习使用预训练的 model,并替换最后一层以满足您的需求。 训练时只训练修改过的层,比训练整个model快很多

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM