Keras ImageDataGenerator验证精度低

Keras ImageDataGenerator验证精度低,keras,neural-network,conv-neural-network,Keras,Neural Network,Conv Neural Network,我正在尝试使用mobilenetv2进行迁移学习,从斯坦福大学的cars-196数据集中对196类汽车进行分类 我的工作环境是谷歌colab笔记本。 我使用来自keras的ImageDataGenerator来加载用于列车和验证的图像。 在训练图像上,我还执行数据扩充 以下代码是我如何执行它的: 从驱动器加载数据集 从google.colab导入驱动器 驱动器。装入“/content/drive” 输入数学 从keras.models导入顺序、模型 从keras.layers导入稠密、Conv2

我正在尝试使用mobilenetv2进行迁移学习,从斯坦福大学的cars-196数据集中对196类汽车进行分类

我的工作环境是谷歌colab笔记本。 我使用来自keras的ImageDataGenerator来加载用于列车和验证的图像。 在训练图像上,我还执行数据扩充

以下代码是我如何执行它的:

从驱动器加载数据集 从google.colab导入驱动器 驱动器。装入“/content/drive” 输入数学 从keras.models导入顺序、模型 从keras.layers导入稠密、Conv2D、MaxPoolig2D、展平、辍学、ReLU、GlobalAveragePoolig2D 从keras.preprocessing.image导入ImageDataGenerator 从keras.applications.mobilenet\u v2导入MobileNetV2,预处理\u输入 批次大小=196 列车\数据发生器=图像数据发生器 旋转_range=20,将增强图像旋转20度 缩放范围=0.2,放大或缩小20% 水平翻转=真,允许放大图像的水平翻转 亮度范围=[0.8,1.2],较亮和较暗的图像增加20% 宽度\偏移\范围=0.1, 高度位移范围=0.1, 预处理_函数=预处理_输入 img\u data\u迭代器=从\u目录中训练\u datagen.flow\u 从何处获取数据,类是子文件夹名称 “/content/drive/My drive/dataset/cars-196/car_data/train”, class_mode=categorical,类采用2D单色热编码方式,默认值为true,但仅指出这一点 shuffle=True,对数据进行洗牌,默认值为True,但仅指出它 批次大小=批次大小, target_size=224224此大小是mobilenet NN的默认值 验证\u img\u data\u迭代器=来自\u目录的ImageDataGenerator.flow\u “/content/drive/My drive/dataset/cars-196/car_data/test”, 类别模式=分类, 洗牌=正确, 批次大小=批次大小, 目标尺寸=224224 基本模型=MobileNetV2weights='imagenet',包括顶部=False x=基本模型输出 x=全局平均池2DX x=Dense512,激活=relu'x x=辍学0.5x preds=Dense196,激活=softmax'x 模型=模型输入=基本模型输入,输出=预测 禁用已训练层的训练 对于模型中的层。层[:-3]: layer.trainable=错误 model.compileoptimizer='Adam',loss='classifical_crossentropy',metrics=['accurity'] 定义检查点 从keras.callbacks导入模型检查点 文件路径=/content/drive/My drive/dataset/cars-196/model.h5 checkpoint=ModelCheckpointfilepath,monitor='loss',verbose=1,save\u best\u only=True,mode='min' 回调\u列表=[检查点] 历史=model.fit img_数据迭代器, steps_per_epoch=math.ceil8144/BATCH_SIZE,8144是训练图像的数量 validation_steps=math.ceil8062/BATCH_SIZE,8062是验证图像的数量 验证数据=验证数据迭代器, 纪元=100, 回调=回调\u列表 关于批量大小,我决定将批量大小设置为可用标签的数量,但在val_准确性方面没有任何改变

我在添加的完全连接的层之间添加了0.5的漏值,但是验证的准确性没有变化

我在训练集上的准确率达到92%左右,而验证准确率保持在0.7%左右

我的猜测是ImageDataGenerator的行为很奇怪,并且把准确性搞砸了,但是我还没有找到任何解决问题的方法,所以我不知道背后的原因是什么

有人对可能出现的问题有任何猜测吗

---编辑


train和test文件夹都有子文件夹,其中包含我要识别的不同车辆的标签名称,每个子文件夹都有该车辆的图像。cars-196数据集就是这样的。ImageDataGenerator将正确的标签附加到图像上,具体取决于该图像所在的子文件夹。

问题在于我没有将预处理输入函数应用到验证数据图像生成器

而不是

验证\u img\u data\u迭代器=来自\u目录的ImageDataGenerator.flow\u “/content/drive/My drive/dataset/cars-196/car_data/test”, 类别模式=分类, 洗牌=正确, 批次大小=批次大小, 目标尺寸=224224 改成

验证\u img\u数据\u迭代器=图像数据生成器 预处理_函数=预处理_输入 .flow\u来自\u目录 “/content/drive/My drive/dataset/cars-196/car_data/test”, 类别模式=分类, 洗牌=正确, 批次大小=批次大小, 目标尺寸=224224
你的测试和训练数据是否被正确地洗牌了?在函数flow_from_目录中,我将洗牌参数设置为True,默认情况下它是True,但我只是照做了,所以我猜它被洗牌了,尽管我可能遗漏了一些东西……你有两个不同的文件夹存放你的训练和测试数据。img_data_迭代器只从train dir中获取数据,而validation_img_data_itera
tor正在从test Dir获取数据,但我已将shuffle=True添加到这两个选项中,我是否遗漏了什么?举个例子,您正在尝试检查图像中是否有狗、猫、老虎、鹿、狮子。所以你有5节课。您已经统一收集了图像,并将它们划分到train和test文件夹中。但是,当您将数据分为train和test文件夹时,您并没有洗牌,因此您的train文件夹中几乎没有任何lion图像,而您的test文件夹中有所有lion图像。在这种情况下,经过训练的模型将无法在验证集上正常工作。