首页 > 解决方案 > Keras - VGG 微调模型给出错误的预测

问题描述

我有这个代码:

base = VGG16(weights='imagenet', include_top=False, input_shape=(64,64,3))

# convert to sequential model
model = Sequential()
for layer in base.layers:
    model.add(layer)

# Remove last layer
model.layers.pop()

# add flatten and two dense layers that don't appear when specifying an input_shape
model.add(Flatten())
model.add(Dense(4096))
model.add(Dropout(.5))
model.add(Dense(4096))
model.add(Dropout(.5))

for layer in model.layers:
    layer.trainable = False

# Add a layer for 3 classes
model.add(Dense(3, activation='softmax'))

model.compile(
    optimizer = 'rmsprop',
    loss='categorical_crossentropy',
    metrics=['accuracy']
)

# training
model.fit(x_train,y_train, epochs=30, batch_size=64, verbose=1)

# predict
y_target = model.predict(x_target, batch_size=64, verbose=1)

我似乎无法理解为什么它给了我如此低的准确性和糟糕的预测。有人可以向我解释一下吗?我正在使用张量流。

标签: pythonmachine-learningneural-networkkerasdeep-learning

解决方案


您的模型根本不会学习

您正在使用VGG16预先训练的模型用新层更改顶层,以便您的模型学习新类,但后来您使所有层都无法训练。这样,您的新密集层将始终包含随机权重,作为它们的初始化,并且您的模型将永远不会学习。

如果要保持VGG16权重冻结并微调模型,则应在添加新层之前移动冻结层的权重代码,如下所示:

#Moved here
for layer in model.layers:
    layer.trainable = False

# add flatten and two dense layers that don't appear when specifying an input_shape
model.add(Flatten())
model.add(Dense(4096))
model.add(Dropout(.5))
model.add(Dense(4096))
model.add(Dropout(.5))
...

请记住,通过不冻结任何图层,您的模型可能会获得更好的结果。为此,只需让所有层都可训练。


推荐阅读