【问题标题】:Method to transfer weights between nested keras models在嵌套 keras 模型之间传递权重的方法
【发布时间】:2020-10-14 13:40:57
【问题描述】:

我正在尝试逐步建立混合模型,迭代添加子模型。

我首先构建和训练一个简单的模型。然后,我构建了一个稍微复杂的模型包含所有原始模型,但层数更多。我想将训练后的权重从第一个模型移到新模型中。我怎样才能做到这一点?第一个模型嵌套在第二个模型中。

这是一个虚拟 MWE:

import numpy as np
import tensorflow as tf
from tensorflow.keras.layers import (concatenate, Conv1D,  Dense, LSTM)
from tensorflow.keras import Model, Input, backend

# data
x = np.random.normal(size = 100)
y = np.sin(x)+np.random.normal(size = 100)
# model 1
def make_model_1():
    inp = Input(1)
    l1 = Dense(5, activation = 'relu')(inp)
    out1 = Dense(1)(l1)
    model1 = Model(inp, out1)
    return model1

model1 = make_model_1()

model1.compile(optimizer = tf.keras.optimizers.SGD(),
               loss = tf.keras.losses.mean_squared_error)

model1.fit(x, y, epochs = 3, batch_size = 10)

# make model 2
def make_model_2():
    inp = Input(1)
    l1 = Dense(5, activation = 'relu')(inp)
    out1 = Dense(1)(l1)
    l2 = Dense(15, activation = 'sigmoid')(inp)
    out2 = Dense(1)(l2)
    bucket = tf.stack([out1, out2], axis=2)
    out = backend.squeeze(Dense(1)(bucket), axis = 2)
    model2 = Model(inp, out)
    return model2

model2 = make_model_2()

我如何将权重从 model1 转移到 model2 以一种自动且完全不知道这两个模型的性质的方式,除了它们是嵌套的?

【问题讨论】:

    标签: python tensorflow keras mo


    【解决方案1】:

    您可以简单地将训练后的权重加载到您感兴趣的新模型的特定部分。我通过在model2 中创建一个model1 的新实例来做到这一点。之后,我加载训练好的权重。

    这里是完整的例子

    # data
    x = np.random.normal(size = 100)
    y = np.sin(x)+np.random.normal(size = 100)
    
    # model 1
    def make_model_1():
        
        inp = Input(1)
        l1 = Dense(5, activation = 'relu')(inp)
        out1 = Dense(1)(l1)
        model1 = Model(inp, out1)
        
        return model1
    
    model1 = make_model_1()
    model1.compile(optimizer = tf.keras.optimizers.SGD(),
                   loss = tf.keras.losses.mean_squared_error)
    model1.fit(x, y, epochs = 3, batch_size = 10)
    
    # make model 2
    def make_model_2(trained_model):
        
        inp = Input(1)
    
        m = make_model_1()
        m.set_weights(trained_model.get_weights())
        out1 = m(inp)
        
        l2 = Dense(15, activation = 'sigmoid')(inp)
        out2 = Dense(1)(l2)
        bucket = tf.stack([out1, out2], axis=2)
        out = tf.keras.backend.squeeze(Dense(1)(bucket), axis = 2)
        model2 = Model(inp, out)
        
        return model2
    
    model2 = make_model_2(model1)
    model2.summary()
    

    【讨论】:

    • 这很好用,谢谢!我没有意识到可以这样简单地调用模型。然而,我现在意识到我的用例并不是完全嵌套的——我可能还想修剪一些层。但是,您的答案没有问题!
    猜你喜欢
    • 2014-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多