使用功能 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
我有一个相当 "simple" 的问题。当我使用函数 API:
创建网络时layer2 = Dense(8, name="layer2")(layer1)
然后用
初始化它model = Model(input=..., output=...)
之后想换图层怎么办?如果我 .pop()
然后 .append()
一个新层,没有任何变化 - 输出保持不变。我认为这是因为输出仍然是预先定义的。
我遇到的确切问题是:我用它的权重加载了一个预训练的 AlexNet,但是我想重新训练最后一个 Dense
层来执行 8 类 的分类任务1000。为此,我想删除最后一层并重新添加它们。
我找到了解决方法(
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