如何在特定时期之后冻结特定层的训练

Hit*_*esh 5 keras tensorflow

我想在第三个纪元之后冻结以下代码的前两层的训练。总纪元设置为 10。

model = Sequential()
model.add(Conv2D(32, kernel_size=(3, 3),
                 activation='relu',
                 input_shape=input_shape))
model.add(Conv2D(64, (3, 3), activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))
model.add(Flatten())
model.add(Dense(128, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(num_classes, activation='softmax'))
Run Code Online (Sandbox Code Playgroud)

Nai*_*ain -1

这应该有效:

for epoch in range(3):
    model.fit(.., epochs=1)

# save the weights of this model
model.save_weights("weight_file.h5") 

# freeze the layers you want
for layer in model.layers[:2]:
    layer.trainable = False
Run Code Online (Sandbox Code Playgroud)

为了使用这些权重进一步训练,但前两层已冻结,您需要再次编译模型。

model.compile(..)

# train further    
for epoch in range(3, 10):
    model.fit(..., epochs=1)
Run Code Online (Sandbox Code Playgroud)

  • 如果不重新编译模型,它将无法工作。之后您将收到警告:“可训练权重与收集的可训练权重之间存在差异”。请看我的回答。其次为什么不只是 model.fit(..., epochs=7) 而不是 for 循环... (2认同)