为什么在同一数据集上使用张量流和keras重新训练的Inception V3显示出不同的准确性?

时间:2019-04-22 14:59:50

标签: python tensorflow machine-learning keras deep-learning

我正在尝试重新训练在ImageNet数据集上预训练的Inception V3。

******* Keras(使用Tensorflow后端)************

我已经使用Keras使用以下代码重新训练了 Inception V3 (张量流后端):

# 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个纪元后,我的准确度在 85%到90%之间,如下图所示:Training result using Keras plor

******** Tensorflow **********

我还通过以下链接How to Retrain an Image Classifier for New Categories在Tensorflow上对ImageNet上预训练的Inception V3进行了再训练。 经过4000次迭代,我得到的准确度在 93%至96%之间,如下图所示:Training result using Tensorflow

出于这个原因,任何人都可以帮助我找到解释,或者指出错误(如果有的话)作为我的解释。

实际上在Keras中,我正在使用:

低学习率= 0.001 时代= 100且批量大小= 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")

另一方面:

在tensorflow中,我正在使用

较高的学习率= 0.01

增强技术。

但是,看来tensorflow模型达到了更高的精度。 如果有人知道tensorflow How to Retrain an Image Classifier for New Categories使用的任何技巧或造成这种差异的任何可能的逻辑原因,请帮助我理解。

1 个答案:

答案 0 :(得分:0)

您可能会看到很多不同的原因。我认为更重要的部分是研究您在这里旅行期间可能要学习的一些知识。

首先,您应该每x个历元检查一次准确性。如果说了几秒钟后准确性仍未提高,则需要结束训练。

您需要在每个班级中保留一定数量的图像,否则一个班级中的班级数量将过多。

您可能想要在管道中包括一些扩充技术,以防止过度拟合。这包括在将一定比例的图像送入批处理时对图像进行旋转,裁切,模糊,降噪等操作。这也可以帮助解决每个班级没有足够图像的问题。

您可能也没有选择最佳的学习率,这很重要。

我建议您查看有关图像分类的fast.ai部分,并通过tensorflow切换到fastai库。