我正在尝试冻结经过免费训练的 VGG16 层(下面的“conv_base”)并在它们之上添加新层以进行特征提取。我希望在模型拟合之前(ret1)/之后(ret2)从“conv_base”获得相同的预测结果,但事实并非如此。这是检查体重冻结的错误方法吗?
加载 VGG16 并设置为不可训练
conv_base = applications.VGG16(weights='imagenet', include_top=False, input_shape=[150, 150, 3])
conv_base.trainable = False
模型拟合前的结果
ret1 = conv_base.predict(np.ones([1, 150, 150, 3]))
在 VGG16 上添加层并编译模型
model = models.Sequential()
model .add(conv_base)
model .add(layers.Flatten())
model .add(layers.Dense(10, activation='relu'))
model .add(layers.Dense(1, activation='sigmoid'))
m.compile('rmsprop', 'binary_crossentropy', ['accuracy'])
拟合模型
m.fit_generator(train_generator, 100, validation_data=validation_generator, validation_steps=50)
模型拟合后的结果
ret2 = conv_base.predict(np.ones([1, 150, 150, 3]))
希望这是真的,但事实并非如此。
np.equal(ret1, ret2)