python - 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)
我似乎无法理解为什么它给了我如此低的准确性和糟糕的预测。有人可以向我解释一下吗?我正在使用张量流。
解决方案
您的模型根本不会学习。
您正在使用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))
...
请记住,通过不冻结任何图层,您的模型可能会获得更好的结果。为此,只需让所有层都可训练。
推荐阅读
- c# - 如何使用 C# 在 Azure blob 存储中解压缩大小为 40 gb 的文件
- python - 在另一个列表中排序列表
- r - 审查 rjags - 无效的父值
- tensorflow - 什么是 Tensorflow 中的集体操作?
- android - Android SensorManager 和 Google Fit 原始传感器数据之间的区别?
- jenkins - 创建自定义工作区时找不到 .Jenkins 文件夹
- python-3.x - Python3 - 以编程方式更改 PSD 图层的可见性
- r - 在 R 中使用 is.na 和 Sapply 函数
- python-3.x - 如何让 Sublime Text3 只用一个点显示所有方法
- ios - 您可以多次设置 contentInset 吗?