我们可以在keras中更改训练后的神经网络结构(.json或.h5文件)及其权重(.h5文件)吗?

时间:2019-03-13 11:37:09

标签: python json tensorflow keras

训练神经网络并将其保存为特定格式(例如.h5或.json格式)后。假设我想使用网络进行推理但没有层(例如批处理规范化),我可以仅从模型文件(.h5或json)中删除此层并进行推理吗?

这有可能改变网络并进行推理吗?如果是,怎么办?

2 个答案:

答案 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)

一种方法,可以为不同类型的模型编辑提供很大的自由度,但很麻烦:

  1. 通过调用

    获取您的keras模型的配置和权重

    temp_config = my_model.get_config()

    temp_weights = my_model.get_weights()

  2. 分析要更改或删除的temp_config中的哪一层。

  3. 对temp_config进行更改,并对temp_weights进行相应的更改。不幸的是,由于每个权重只是相互附加(通常最终会产生权重,偏差,权重,偏差,权重,偏差等),因此很难找到每一层的正确权重。如果要删除图层,请删除该图层的相应权重。

  4. 然后使用新的配置和权重构建模型

    new_model = Model.from_config(new_config)

    new_model.set_weights(new_weights)