Keras - VGG微调模型给出了糟糕的预测

时间:2018-05-20 17:38:27

标签: python machine-learning neural-network keras deep-learning

我有这段代码:

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)

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

1 个答案:

答案 0 :(得分:2)

您的模型根本不会学习

您正在使用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))
...

请注意,不冻结任何图层,您的模型可能会有更好的效果。为此,只需留下所有图层都可以训练。