【发布时间】:2018-03-19 20:58:11
【问题描述】:
我有一个三层的 CNN 网络,在拟合模型后,权重保存在磁盘上。我第二次加载权重,但这次模型增加了一层。所以现在是4层网络。是否可以使用不同的架构传输模型权重?如果是,那怎么办?我正在使用 keras 进行开发。
对我来说,它显示错误:“您正在尝试将包含 3 层的权重文件加载到具有 4 层的模型中”。
提前致谢!
【问题讨论】:
我有一个三层的 CNN 网络,在拟合模型后,权重保存在磁盘上。我第二次加载权重,但这次模型增加了一层。所以现在是4层网络。是否可以使用不同的架构传输模型权重?如果是,那怎么办?我正在使用 keras 进行开发。
对我来说,它显示错误:“您正在尝试将包含 3 层的权重文件加载到具有 4 层的模型中”。
提前致谢!
【问题讨论】:
我还没有尝试过,但是应该可以使用 layer.get_weights() 和 layer.set_weights(weights) 方法。
weights = old_model_layer.get_weights()
new_model_layer.set_weights(weights)
请参阅https://keras.io/layers/about-keras-layers/ 了解更多信息。
【讨论】:
x = old_model.output x = Dense(1024, activation='relu')(x) # Additional layer model = Model(inputs=old_model.input, outputs=x)然后你可以把它保存为一个新的模型扩展模型,可以单独使用。
我回答有点晚了,但希望这会对某人有所帮助。
我就是这样做的:
使用列表存储所有层:
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(...)
我意识到这不是一个普遍的答案。我已经提到了我在成功实施中使用的确切步骤。
随意尝试不同的变体。
【讨论】: