为啥在同一数据集上使用 tensorflow 和 keras 重新训练的 Inception V3 显示出不同的准确性?
Posted
技术标签:
【中文标题】为啥在同一数据集上使用 tensorflow 和 keras 重新训练的 Inception V3 显示出不同的准确性?【英文标题】:Why Inception V3 retrained using tensorflow and keras on same dataset shows different accuracy?为什么在同一数据集上使用 tensorflow 和 keras 重新训练的 Inception V3 显示出不同的准确性? 【发布时间】:2019-09-11 18:25:28 【问题描述】:我正在尝试重新训练在 ImageNet 数据集上预训练的 Inception V3。
************ Keras(使用 TensorFlow 后端)************
我用以下代码重新训练了 Inception V3 使用 Keras(tensorflow 后端):
# SETUP MODEL
CLASSES = 3
base_model = InceptionV3(weights='imagenet', include_top=False)
x=base_model.output
x=GlobalAveragePooling2D()(x)
preds=Dense(CLASSES,activation='softmax')(x) #final layer with softmax activation
model=Model(inputs=base_model.input,outputs=preds)
# transfer learning
for layer in base_model.layers:
layer.trainable = False
model.compile(loss="categorical_crossentropy", optimizer='adam',metrics=["accuracy"])
# train the network
print("[INFO] training network...")
H = model.fit_generator(
aug.flow(trainX, trainY, batch_size=BS),
validation_data=(testX, testY),
steps_per_epoch=len(trainX) // BS,
epochs=EPOCHS, verbose=1, callbacks=[csv_logger])
经过 100 个 epoch 的训练后,我的准确率在 85% 到 90% 之间,如图所示:Training result using Keras plor
******** TensorFlow **********
我还通过以下链接使用 Tensorflow 在 ImageNet 上重新训练了 Inception V3 预训练:How to Retrain an Image Classifier for New Categories。 经过 4000 次迭代后,我的准确率在 93% 到 96% 之间,如下图所示:Training result using Tensorflow
谁能帮我找到这个原因的解释,或者请指出错误(如果有的话),供我解释。
实际上我在使用 Keras:
较低的学习率 = 0.001 epochs = 100 和 Batch size = 32 使用
进行数据增强aug = ImageDataGenerator(rotation_range=25, width_shift_range=0.1,
height_shift_range=0.1, shear_range=0.2, zoom_range=0.2,
horizontal_flip=True, fill_mode="nearest")
另一方面:
在张量流中,我正在使用
更高的学习率 = 0.01
否增强技术。
但是看起来,张量流模型达到了更高的准确度。 如果有人知道 tensorflow How to Retrain an Image Classifier for New Categories 使用的任何技巧或这种差异的任何可能的逻辑原因,请帮助我理解。
【问题讨论】:
看起来你运行 Tensorflow 的时间更长了。您不希望这会给您带来更高的准确性吗? @Chris 感谢您的回复......我也已经在 keras 中运行了 1000 个 epoch,但它只是过度拟合,准确性并没有提高。顺便说一句,有什么方法可以比较一般的迭代和时期? 【参考方案1】:您可能会看到差异的原因有很多。我认为更重要的部分是研究您在此旅程中可能想学习的一些东西。
首先,您应该每 x 个时期检查一次准确性。如果说之后准确性没有提高,则需要 3 个 epoch 才能结束训练。
您需要在每个类别中包含偶数数量的图像,否则您的批次中会出现一个类别过多。
您可能希望在管道中加入一些增强技术,以防止过度拟合。这包括在将图像送入批处理时对一定百分比的图像进行旋转、裁剪、模糊、噪点等。这也可以帮助解决每个类没有足够图像的问题。
您可能也没有选择最佳学习率,这很重要。
我建议查看有关图像分类的 fast.ai 部分,并通过 tensorflow 切换到 fastai 库。
【讨论】:
感谢您的详细解释。 我明白需要考虑的因素有很多。但在 Keras 中,我使用较低的学习率和数据增强技术。另一方面,在 tensorflow 中,我没有使用任何数据增强技术。但仍然 tensorflow 模型实现了更高的精度。在这两种情况下,我都使用在 ImageNet 上预训练的相同模型(Inception V3),并且只为新类添加了一个 FCL 和 softmax 层。以上是关于为啥在同一数据集上使用 tensorflow 和 keras 重新训练的 Inception V3 显示出不同的准确性?的主要内容,如果未能解决你的问题,请参考以下文章
Tensorflow:在具有不同类别数量的新数据集上微调预训练模型
TensorFlow:神经网络在训练集和测试集上的准确率始终为 100%
为啥 TensorFlow 返回 [[nan nan]] 而不是 CSV 文件中的概率?