训练神经网络并将其保存为特定格式(例如.h5或.json格式)后。假设我想使用网络进行推理但没有层(例如批处理规范化),我可以仅从模型文件(.h5或json)中删除此层并进行推理吗?
这有可能改变网络并进行推理吗?如果是,怎么办?
答案 0 :(得分:2)
是的,它实际上很简单:)您需要使用参数命名所有图层,并使用model.save_weights
保存权重并使用所需的架构来构建另一个模型,该模型共享一些层。然后,您可以使用new_model.load_weights(..., by_name=True)
仅加载共享层documentation。这是一个示例:
input = Input(..., name='image_in')
conv1 = Conv2D(..., name='conv2d')(input)
normed = BatchNormalization(...)(conv1)
out = Flatten()(normed)
out = Dense(num_classes, activation='softmax', name='final_dense')(out)
model = Model(input, out)
# ... train etc
model.save_weights(model_file)
然后,您可以创建另一个模型,并为要共享的图层使用相同的名称:
input = Input(..., name='image_in')
conv1 = Conv2D(..., name='conv2d')(input) # reuse conv2d
out = Flatten()(conv1) # we got rid of batch
out = Dense(num_classes, activation='softmax', name='final_dense')(out) # reuse final_dense
new_model = Model(input, out)
# ... now load
new_model.load_weights(model_file, by_name=True)
设置by_name=True
仅将名称匹配的图层加载到您想要的任何体系结构中。
答案 1 :(得分:0)
一种方法,可以为不同类型的模型编辑提供很大的自由度,但很麻烦:
通过调用
获取您的keras模型的配置和权重temp_config = my_model.get_config()
temp_weights = my_model.get_weights()
分析要更改或删除的temp_config中的哪一层。
对temp_config进行更改,并对temp_weights进行相应的更改。不幸的是,由于每个权重只是相互附加(通常最终会产生权重,偏差,权重,偏差,权重,偏差等),因此很难找到每一层的正确权重。如果要删除图层,请删除该图层的相应权重。
然后使用新的配置和权重构建模型
new_model = Model.from_config(new_config)
new_model.set_weights(new_weights)