我有一个相当“简单”的问题。当我使用功能API创建网络时:
layer2 = Dense(8, name="layer2")(layer1)
然后用
初始化它model = Model(input=..., output=...)
如果我想在之后更改图层,该怎么办?如果我.pop()
然后.append()
新图层,则没有任何变化 - 输出保持不变。我认为这是因为输出仍然是事先定义的。
我遇到的确切问题是:我加载了预先训练好的AlexNet及其权重,但是我想重新训练最后Dense
层的8级而不是1000级的分类任务。为此我想要删除最后一层并重新添加它们。
我找到了一种解决方法(Changing pretrained AlexNet classification in Keras),但我认为应该有一种更简单的方法。另外,我不认为我的解决方法适用于GoogLeNet所以我真的很想知道(或提示)如何处理这种情况。
答案 0 :(得分:8)
Model
对象不包含权重,而图层不包含权重。您可以使用model.load_weights()
为模型加载权重,然后根据您拥有的图层创建一个新图层,而不会丢失图层的初始化。
例如:
model.load_weights(f)
newClassificationLayer = Dense(8, activation='softmax')(lastCnnLayer)
model = Model(input=oldInput, output=newClassificationLayer)
要确保所有其他图层都已冻结,并且除了新图层之外没有经过培训,您可以为要冻结的每个图层设置trainable=False
。 E.g:
lastCnnLayer.trainable = False