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

How can I change a network after initialising using functional API?

我有一个相当 "simple" 的问题。当我使用函数 API:

创建网络时
layer2 = Dense(8, name="layer2")(layer1)

然后用

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

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

我遇到的确切问题是:我用它的权重加载了一个预训练的 AlexNet,但是我想重新训练最后一个 Dense 层来执行 8 类 的分类任务1000。为此,我想删除最后一层并重新添加它们。

我找到了解决方法() but I think there should be an easier way. Additionally, I dont think my workaround will work with a 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