如何在使用功能API初始化后更改网络?

时间:2016-06-27 11:42:46

标签: python neural-network theano conv-neural-network keras

我有一个相当“简单”的问题。当我使用功能API创建网络时:

layer2 = Dense(8, name="layer2")(layer1)

然后用

初始化它
model = Model(input=..., output=...)

如果我想在之后更改图层,该怎么办?如果我.pop()然后.append()新图层,则没有任何变化 - 输出保持不变。我认为这是因为输出仍然是事先定义的。

我遇到的确切问题是:我加载了预先训练好的AlexNet及其权重,但是我想重新训练最后Dense层的8级而不是1000级的分类任务。为此我想要删除最后一层并重新添加它们。

我找到了一种解决方法(Changing pretrained AlexNet classification in Keras),但我认为应该有一种更简单的方法。另外,我不认为我的解决方法适用于GoogLeNet所以我真的很想知道(或提示)如何处理这种情况。

1 个答案:

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