【问题标题】:Copying weights of a specific layer - keras复制特定层的权重 - keras
【发布时间】:2019-04-18 05:49:43
【问题描述】:

根据this,以下将权重从一个模型复制到另一个模型:

target_model.set_weights(model.get_weights())

复制特定层的权重怎么样,这行得通吗?

model_1.layers[0].set_weights(source_model.layers[0].get_weights())
model_2.layers[0].set_weights(source_model.layers[0].get_weights())

如果我训练 model_1model_2 他们会有不同的权重吗? documentation 没有说明此get_weights 是否进行深层复制。如果这不起作用,如何实现?

【问题讨论】:

    标签: python keras neural-network deep-learning keras-layer


    【解决方案1】:

    当然,这将是权重的副本。在两个单独的模型之间共享权重对象是没有意义的。您可以通过如下简单示例自行检查:

    model1 = Sequential()
    model1.add(Dense(10, input_dim=2))
    
    model2 = Sequential()
    model2.add(Dense(10, input_dim=2))
    
    model1.compile(loss='mse', optimizer='adam')
    model2.compile(loss='mse', optimizer='adam')
    

    测试:

    >>> model1.layers[0].get_weights()
    [array([[-0.42853734,  0.18648076, -0.47137827,  0.1792168 ,  0.0373047 ,
              0.2765705 ,  0.38383502,  0.09664273, -0.4971757 ,  0.41548246],
            [ 0.0403192 , -0.01309097,  0.6656211 , -0.0536288 ,  0.58677703,
              0.21625364,  0.26447064, -0.42619988,  0.17218047, -0.39748642]],
           dtype=float32),
     array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0.], dtype=float32)]
    
    >>> model2.layers[0].get_weights()
    [array([[-0.30062824, -0.3740575 , -0.3502644 ,  0.28050178, -0.68631136,
              0.1596322 ,  0.08288956, -0.20988202,  0.34323698,  0.2893324 ],
            [-0.29182747, -0.2754455 , -0.64082885,  0.29160154,  0.04342002,
             -0.4996035 ,  0.6608283 ,  0.10293472,  0.11375248, -0.43438092]],
           dtype=float32),
     array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0.], dtype=float32)]
    
    >>> model2.layers[0].set_weights(model1.layers[0].get_weights())
    >>> model2.layers[0].get_weights()
    [array([[-0.42853734,  0.18648076, -0.47137827,  0.1792168 ,  0.0373047 ,
              0.2765705 ,  0.38383502,  0.09664273, -0.4971757 ,  0.41548246],
            [ 0.0403192 , -0.01309097,  0.6656211 , -0.0536288 ,  0.58677703,
              0.21625364,  0.26447064, -0.42619988,  0.17218047, -0.39748642]],
           dtype=float32),
     array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0.], dtype=float32)]
    
    >>> id(model1.layers[0].get_weights()[0])
    140494823634144
    
    >>> id(model2.layers[0].get_weights()[0])
    140494823635664
    

    内核权重数组的id不同,所以它们是不同的对象,但具有相同的值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-01-12
      • 1970-01-01
      • 1970-01-01
      • 2017-03-22
      • 1970-01-01
      • 2017-10-07
      • 2020-06-02
      • 2019-08-12
      相关资源
      最近更新 更多