簡體   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