我有这段代码:
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。
答案 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))
...
请注意,不冻结任何图层,您的模型可能会有更好的效果。为此,只需留下所有图层都可以训练。