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

Keras 权重从一个模型转移到具有不同层结构的另一个模型,keras,conv-neural-network,Keras,Conv Neural Network,我有一个三层的CNN网络,在拟合模型后,权重保存在磁盘上。第二次加载权重时,但这次模型增加了一层。所以现在是四层网络。是否可以使用不同的体系结构传递模型权重?如果是,那怎么办?我正在使用keras进行开发 对我来说,它显示了一个错误:“您试图将一个包含3层的权重文件加载到一个包含4层的模型中。” 提前谢谢 我还没有尝试过这个方法,但应该可以使用layer.get_weights()和layer.set_weights(weights)方法 有关更多信息,请参阅。我的回答有点晚,但希望这会对某人有

我有一个三层的CNN网络,在拟合模型后,权重保存在磁盘上。第二次加载权重时,但这次模型增加了一层。所以现在是四层网络。是否可以使用不同的体系结构传递模型权重?如果是,那怎么办?我正在使用keras进行开发

对我来说,它显示了一个错误:“您试图将一个包含3层的权重文件加载到一个包含4层的模型中。”


提前谢谢

我还没有尝试过这个方法,但应该可以使用layer.get_weights()和layer.set_weights(weights)方法


有关更多信息,请参阅。

我的回答有点晚,但希望这会对某人有所帮助

我就是这样做的:

  • 使用列表存储所有图层:

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

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

  • 假设源网络中的所有层构成目标网络的初始部分,则将所有层引用从临时列表复制到
    模型\u层
    。如果需要,排除分类图层。如果知道各个图层的索引,也可以恢复这些图层:

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

    new_model = keras.Sequential()
    for layer in model_layers:
        new_model.add(layer)
    
  • 添加可能需要的任何附加层(如果需要,与分类层一起):

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


    请随意尝试不同的变体。

    我们当然可以做到。我已经做了层的重量转移。我试图在没有架构差异的情况下进行模型权重转移。我想目前还没有办法通过使用模型权重来扩展架构。我们必须使用层权重进行扩展。在旧模型的基础上创建另一个模型实例怎么样?例如,new_model=model(inputs=[old_model.input],outputs=[new_model(old_model.output)])我尝试了同样的方法。我使用旧模型的权重和偏差创建了一个新模型,但发现每层权重的输出形状不同,无法合并新模型。例如,如果我们有3层的旧网络和4层的新网络,那么第4层将使用默认权重初始化,因为输入将不同于第4层,因此不兼容。在序列模型中,输入形状只给出一次。Rest网络自行管理。或者使用功能API:
    x=old_model.output x=densite(1024,activation='relu')(x)#附加层model=model(inputs=old_model.input,outputs=x)
    将其保存为新的模型扩展模型,可以单独使用。来自keras文档:model.load\u weights(filepath,by_name=False)从HDF5文件(由save_weights创建)加载模型的权重。默认情况下,体系结构应保持不变。若要将权重加载到不同的体系结构(与某些层共用),请使用by_name=True仅加载具有相同名称的层。
    for i in range(len(temp_layers) - 2):
        model_layers[i] = temp_layers[i]
    
    new_model = keras.Sequential()
    for layer in model_layers:
        new_model.add(layer)
    
    new_model.add(...)
    new_model.add(keras.layers.Dense(units=num_classes))
    new_model.add(keras.layers.Softmax())
    new_model.compile(...)