我有一个有三层的CNN网络,在安装模型后,权重被保存在磁盘上。我第二次加载权重,但这个时间模型增加了一个图层。所以它现在是4层网络。是否可以使用不同的架构传输模型权重?如果是,那怎么样?我正在使用keras进行开发。
对我而言,它显示错误:'您正在尝试将包含3个图层的重量文件加载到具有4个图层的模型中。
提前致谢!
答案 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)
我回答得有点晚,但是希望这会对别人有所帮助。
这是我的方法:
使用列表存储所有图层:
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)
将原始列表复制到新的临时列表。清除原始列表,并在其中添加目标网络所需的图层的新实例:
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())
假定源网络中的所有层都构成目标网络的初始部分,请将所有层引用从临时列表中复制到model_layers
。如果需要,请排除分类层。如果知道各个图层的索引,也可以还原它们:
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.add(...)
new_model.add(keras.layers.Dense(units=num_classes))
new_model.add(keras.layers.Softmax())
new_model.compile(...)
我意识到这不是一个普遍的答案。我已经提到了成功实施过程中使用的确切步骤。
随时尝试不同的版本。