权重从一个模型转移到另一个具有不同层结构的模型

时间:2018-03-19 20:58:11

标签: keras conv-neural-network

我有一个有三层的CNN网络,在安装模型后,权重被保存在磁盘上。我第二次加载权重,但这个时间模型增加了一个图层。所以它现在是4层网络。是否可以使用不同的架构传输模型权重?如果是,那怎么样?我正在使用keras进行开发。

对我而言,它显示错误:'您正在尝试将包含3个图层的重量文件加载到具有4个图层的模型中。

提前致谢!

2 个答案:

答案 0 :(得分:0)

我没有尝试过,但应该可以使用layer.get_weights()和layer.set_weights(权重)方法。

weights = old_model_layer.get_weights()
new_model_layer.set_weights(weights)

有关详细信息,请参阅https://keras.io/layers/about-keras-layers/

答案 1 :(得分:0)

我回答得有点晚,但是希望这会对别人有所帮助。

这是我的方法:

  1. 使用列表存储所有图层:

    model_layers = []
    model_layers.append(keras.layers.Conv2D(...))
    ...
    model_layers.append(keras.layers.Dense(units=num_classes))
    model_layers.append(keras.layers.Softmax())
    
  2. 定义源模型,然后从列表中添加层。从保存的文件中加载权重:

    model = keras.Sequential()
    for layer in model_layers:
        model.add(layer)
    model.compile(...)
    model.load_weights(filename)
    
  3. 将原始列表复制到新的临时列表。清除原始列表,并在其中添加目标网络所需的图层的新实例:

    temp_layers = model_layers.copy()
    model_layers.clear()
    model_layers.append(keras.layers.Conv2D(...))
    ...
    model_layers.append(keras.layers.Dense(units=num_classes))
    model_layers.append(keras.layers.Softmax())
    
  4. 假定源网络中的所有层都构成目标网络的初始部分,请将所有层引用从临时列表中复制到model_layers。如果需要,请排除分类层。如果知道各个图层的索引,也可以还原它们:

    for i in range(len(temp_layers) - 2):
        model_layers[i] = temp_layers[i]
    
  5. 按照第2步创建新模型:

    new_model = keras.Sequential()
    for layer in model_layers:
        new_model.add(layer)
    
  6. 添加可能需要的任何其他层(如果需要,还可以包括分类层):

    new_model.add(...)
    new_model.add(keras.layers.Dense(units=num_classes))
    new_model.add(keras.layers.Softmax())
    new_model.compile(...)
    

我意识到这不是一个普遍的答案。我已经提到了成功实施过程中使用的确切步骤。

随时尝试不同的版本。