【问题标题】:How to reuse the model and weights in Keras如何在 Keras 中重用模型和权重
【发布时间】:2021-03-10 13:52:46
【问题描述】:

我创建了一个模型并进行了拟合,如下所示。我也跟着Keras official docs 保存和加载了模型。

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.load_weights('my_model_weights.h5')
model.load_weights('my_model_weights.h5', by_name=True)

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


错误:


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'

【问题讨论】:

    标签: python tensorflow keras transfer-learning


    【解决方案1】:

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

    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(...)
    

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

    【讨论】:

    • 我将您答案的最后一部分添加到具有相同架构但数据不同的新 jupyter 笔记本中。它返回错误。请看问题。
    • load_model 没有明显的理由不工作。您可以尝试通过 from tensorflow.keras import load_model 导入它,但如果这不起作用,请删除此部分并在不加载模型的情况下保持 new_model_bis 构建,然后在其上加载权重。
    猜你喜欢
    • 2019-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-21
    • 2020-12-05
    • 2019-01-30
    • 1970-01-01
    • 2020-02-12
    相关资源
    最近更新 更多