【问题标题】:Keras - VGG fine-tuned model gives bad predictionsKeras - VGG 微调模型给出错误的预测
【发布时间】:2018-05-20 17:38:27
【问题描述】:

我有这个代码:

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。

【问题讨论】:

  • 取决于很多条件,输入数据质量、数据量、类分布等。

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


【解决方案1】:

您的模型根本不会学习

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

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

【讨论】:

  • 有道理,谢谢!即使进行了更改,准确率仍然略低于 50%。这是否意味着我的 x_train 和 y_train 都不好/需要改进?每个都有大约 15,000 个图像数据,所以我认为数量不是问题。
  • 您可以尝试几种方法进行改进。首先,如果您的硬件有能力,完全解冻所有层(删除“for layer in model.layers: layer.trainable = False”),尝试不同的优化器、学习率、时期、增强...
猜你喜欢
  • 2019-10-19
  • 1970-01-01
  • 2018-06-12
  • 1970-01-01
  • 2017-06-05
  • 2023-03-30
  • 1970-01-01
  • 2019-06-16
  • 2018-02-22
相关资源
最近更新 更多