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