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