VGGNet实现CIFAR-100图像识别-2(图像增强/ImageDataGenerator)

2023-11-12

写在最前:未经授权不得转载或直接复制使用。初学者,对于一些问题的理解可能不是很到位,请多多指教或者一起讨论~

官方文档直达

代码

# Data augmentation
train_datagen = tf.keras.preprocessing.image.ImageDataGenerator(
    rotation_range=20, 
    width_shift_range=0.1, # Shift picture
    height_shift_range=0.1,
    horizontal_flip=True, # Might has flip picture but there is no upside down thing
    fill_mode='nearest') # Fill missing pixels

valid_datagen = tf.keras.preprocessing.image.ImageDataGenerator(
    horizontal_flip=True, fill_mode='nearest')

train_gen = train_datagen.flow(X_train, y_train_cate, batch_size=256)
valid_gen = valid_datagen.flow(X_valid, y_valid_cate, batch_size=256)

print(len(train_gen))
print(len(valid_gen))

注意

使用图像增强后,数据来自生成器,在model.fit()方法中要使用steps_per_epoch而不是batch_size。model.fit()代码如下:

# Change learning_rate auto
reduce_lr = tf.keras.callbacks.ReduceLROnPlateau(monitor='val_loss', patience=10, mode='auto')

# Checkpoint
checkpoint_path = "training_1/cp.ckpt"
checkpoint_dir = os.path.dirname(checkpoint_path)

# Create a callback that saves the model's weights
cp_callback = tf.keras.callbacks.ModelCheckpoint(filepath=checkpoint_path,
                                                 save_weights_only=True,
                                                 verbose=1)

earlystopping = EarlyStopping(monitor='val_accuracy', verbose=1, patience=30)

# Train the model with the new callback
history = model_vgg11.fit(train_gen, 
                    validation_data=valid_gen, 
                    epochs=200,
                    # Not specify the batch_size since data is from generators (since they generate batches)
                    steps_per_epoch=len(train_gen), # Total number of steps (batches of samples) before a epoch finished, 
                                                    # default is the number of samples (50000) divided by the batch size (32)
                    validation_steps=len(valid_gen),
                    callbacks=[cp_callback, reduce_lr, earlystopping]) # callbacks=[cp_callback] Pass callback to training

使用图像增强的原因

  1. 使用图像增强的原因要具体数据具体分析,考虑到CIFAR-100中每个子类只有500张图像,我们使用数据增强来增加输入图像;
  2. 当我们没有足够的训练图像时,这也是一个很好的方法来减少过拟合;
  3. 还考虑到日常生活中一些可能的输入图像,例如可能会输入翻转、旋转或移动后的图像,使用图像增强后可以提高训练集的质量。

测试ImageDataGenerator对象的flow方法中batch_size参数

在ImageDataGenerator对象的flow方法中有一个batch_size参数,batch_size越小,flow方法生成的迭代器的长度 (len(train_gen)) 就越长。

我想知道这个参数是如何影响准确率的,调整了两个参数:

  1. ImageDataGenerator对象的flow方法中的batch_size
train_gen = train_datagen.flow(X_train, y_train_cate, batch_size=256)
  1. model.fit方法中的steps_per_epoch (这里先不解释这个参数,具体在 Keras-ImageDataGenerator的flow()中的batch_size参数,Model.fit()中的batch_size和steps_per_epoch参数的关系 这篇博文中解释)
history = model_vgg19.fit(train_gen, 
                    validation_data=valid_gen, 
                    epochs=200,
                    steps_per_epoch=352,
                    validation_steps=40,
                    callbacks=[reduce_lr, earlystopping])

做了如下测试:

测试 batch_size len(train_gen) steps_per_epoch 测试集上的准确率
测试1 128 352 352 0.5536
测试2 64 704 352 0.5404
测试3 64 704 704 0.5626
测试4 32 1407 352 0.5045
测试5 32 1407 1407 0.5955

从测试1,2,4中可以看出,在steps_per_epoch固定的情况下,batch_size越大准确率越高,但是影响不是很大。从测试2,3和测试4,5这两组测试可以看出,在batch_size固定的情况下,steps_per_epoch越大准确率越高。

总的来说,递增趋势,但是影响不大,这个参数没有什么调整的价值。但是这个结果仅仅是从我的几次测试总结出来的,只适用于这个数据和这个网络模型,并无普适性。

有兴趣可以看看这篇文章,做了关于batch_size详细的实验
来源:https://www.zhihu.com/question/32673260这里是引用

但是在len(train_gen)<steps_per_epoch,会有如下警告:
WARNING:tensorflow:Your input ran out of data; interrupting training. Make sure that your dataset or generator can generate at least steps_per_epoch * epochs batches (in this case, 40 batches). You may need to use the repeat() function when building your dataset.

意思就是一定要len(train_gen)>steps_per_epoch,那么如果想用更大的steps_per_epoch去提高准确率的话,就只能在ImageDataGenerator对象的flow方法中使用更小的batch_size了。

具体分析ImageDataGenerator对象的flow方法 (转载)

分析可得,ImageDataGenerator对象的flow方法,对输入数据(imgs,ylabel)打乱(默认参数,可设置)后,依次取batch_size的图片并逐一进行变换。取完后再循环。伪代码如下
在这里插入图片描述
————————————————
版权声明:本文为CSDN博主「lsh呵呵」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/nima1994/article/details/80625938

ImageDataGenerator.flow#生成的是一个迭代器,可直接用于for循环
batch_size如果小于X的第一维m,next生成的多维矩阵的第一维是为batch_size,输出是从输入中随机选取batch_size个数据
batch_size如果大于X的第一维m,next生成的多维矩阵的第一维是m,输出是m个数据,不过顺序随机 ,输出的X,Y是一一对对应的
如果要直接用于tf.placeholder(),要求生成的矩阵和要与tf.placeholder相匹配 ————————————————
版权声明:本文为CSDN博主「liming89」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/liming89/article/details/110506982

只在训练集、验证集应用数据增强的原因(转载)

如何证明数据增强(Data Augmentation)有效性? - 益达的回答 - 知乎
https://www.zhihu.com/question/444425866/answer/1730208151
在这里插入图片描述

未完待续,接下来请看另一篇博文:VGGNet实现CIFAR-100图像识别-3

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

VGGNet实现CIFAR-100图像识别-2(图像增强/ImageDataGenerator) 的相关文章

  • python future 和元组解包

    实现像使用 future 进行元组解包这样的事情的优雅 惯用的方法是什么 我有这样的代码 a b c f x y g a b z h y c 我想将其转换为使用期货 理想情况下我想写一些类似的东西 a b c ex submit f x y
  • 如何在序列化器创建方法中获取 URL Id?

    我有以下网址 url r member P
  • pydev 调试器:严重警告:此版本的 python 似乎编译不正确(内部生成的文件名不是绝对的)[重复]

    这个问题在这里已经有答案了 通过运行 from sklearn datasets import fetch california housing import pandas as pd pd set option precision 4 m
  • python 模拟第三方模块

    我正在尝试测试一些处理推文的类 我使用 Sixohsix twitter 来处理 Twitter API 我有一个类充当 Twitter 类的外观 我的想法是模拟实际的 Sixohsix 类 通过随机生成新推文或从数据库检索它们来模拟推文的
  • Django 模型在模板中不可迭代

    我试图迭代模型以获取列表中的第一个图像 但它给了我错误 即模型不可迭代 以下是我的模型和模板的代码 我只需要获取与单个产品相关的列表中的第一个图像 模型 py class Product models Model title models
  • if 语句未命中中的 continue 断点

    在下面的代码中 两者a and b是生成器函数的输出 并且可以评估为None或者有一个值 def testBehaviour self a None b 5 while True if not a or not b continue pri
  • 如何创建一个语句来打印以特定单词开头的单词? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 如何在 python 中打印从特定字母开始的单词 而不使用函数 而是使用方法或循环 1 我有一个字符串 想要打印以 m 开头的单词 S
  • 在Python中调整图像大小

    我有一张尺寸为 288 352 的图像 我想将其大小调整为 160 240 我尝试了以下代码 im imread abc png img im resize 160 240 Image ANTIALIAS 但它给出了一个错误TypeErro
  • 对图像块进行多重处理

    我有一个函数必须循环遍历图像的各个像素并计算一些几何形状 此函数需要很长时间才能运行 在 24 兆像素图像上大约需要 5 小时 但似乎应该很容易在多个内核上并行运行 然而 我一生都找不到一个有据可查 解释充分的例子来使用 Multiproc
  • Python urllib.request.urlopen:AttributeError:'bytes'对象没有属性'data'

    我正在使用 Python 3 并尝试连接到dstk 我收到错误urllib包裹 我对SO进行了很多研究 但找不到与这个问题类似的东西 api url self api base street2coordinates api body jso
  • Numpy 过滤器平滑零区域

    我有一个 0 及更大整数的 2D numpy 数组 其中值代表区域标签 例如 array 9 9 9 0 0 0 0 1 1 1 9 9 9 9 0 7 1 1 1 1 9 9 9 9 0 2 2 1 1 1 9 9 9 8 0 2 2 1
  • 如何设置 Celery 来调用自定义工作器初始化?

    我对 Celery 很陌生 我一直在尝试设置一个具有 2 个独立队列的项目 一个用于计算 另一个用于执行 到目前为止 一切都很好 我的问题是执行队列中的工作人员需要实例化一个具有唯一 object id 的类 每个工作人员一个 id 我想知
  • 首先对列表中最长的项目进行排序

    我正在使用 lambda 来修改排序的行为 sorted list key lambda item item lower len item 对包含元素的列表进行排序A1 A2 A3 A B1 B2 B3 B 结果是A A1 A2 A3 B
  • Pandas 根据 diff 列形成簇

    我正在尝试使用 Pandas 根据表示时间 以秒为单位 的列中的差异来消除数据框中的一些接近重复项 例如 import pandas as pd numpy as np df pd DataFrame 1200 1201 1233 1555
  • 在 Pandas 中使用正则表达式的多种模式

    我是Python编程的初学者 我正在探索正则表达式 我正在尝试从 描述 列中提取一个单词 数据库名称 我无法给出多个正则表达式模式 请参阅下面的描述和代码 描述 Summary AD1 Low free DATA space in data
  • 无法在 osx-arm64 上安装 Python 3.7

    我正在尝试使用 Conda 创建一个带有 Python 3 7 的新环境 例如 conda create n qnn python 3 7 我收到以下错误 Collecting package metadata current repoda
  • python Soap zeep模块获取结果

    我从 SOAP API 得到如下结果 client zeep Client wsdl self wsdl transport transport auth header lb E authenticate self login res cl
  • 使用yield 进行字典理解

    作为一个人为的例子 myset set a b c d mydict item yield join item s for item in myset and list mydict gives as cs bs ds a None b N
  • 当鼠标悬停在上面时,intellisense vscode 不显示参数或文档

    我正在尝试将整个工作流程从 Eclipse 和 Jupyter Notebook 迁移到 VS Code 我安装了 python 扩展 它应该带有 Intellisense 但它只是部分更糟糕 我在输入句点后收到建议 但当将鼠标悬停在其上方
  • 迭代 pandas 数据框的最快方法?

    如何运行数据框并仅返回满足特定条件的行 必须在之前的行和列上测试此条件 例如 1 2 3 4 1 1 1999 4 2 4 5 1 2 1999 5 2 3 3 1 3 1999 5 2 3 8 1 4 1999 6 4 2 6 1 5 1

随机推荐

  • web自动点击遍历(入口检查)

    目录 web自动点击遍历 入口检查 一 背景 二 技术方案 三 核心代码 3 1代码结构 3 2用例模块 3 3获取HTML代码 3 4正则查找a标签 3 5遍历存储 3 6递归遍历 web自动点击遍历 入口检查 导语 web自动化的存在问
  • Qt debug版本运行正常release版本运行崩溃问题记录

    问题由来 某一项目debug版本运行正常 进入发布阶段 结果release后的版本出现了崩溃问题 因为是release版本 不能debug运行 只能通过printf debug 虽然问题原因很简单 但是耗费了大量时间 故做此记录 以供后续参
  • 网络安全(黑客)自学笔记&学习路线

    谈起黑客 可能各位都会想到 盗号 其实不尽然 黑客是一群喜爱研究技术的群体 在黑客圈中 一般分为三大圈 娱乐圈 技术圈 职业圈 娱乐圈 主要是初中生和高中生较多 玩网恋 人气 空间 建站收徒玩赚钱 技术高的也是有的 只是很少见 技术圈 这个
  • Jeesite4本地及服务器上传文件、图片详解

    大家过年好 你们的老朋友小Q又回来了 最近一段时间忙于公司项目开发 又加上过年比较忙 所以没能留出时间更新内容 大家是不是有点着急了 公司最近在使用jeesite4开发项目 我呢 对这个框架一点也不熟悉 遇到问题都是现查现用 这不 在上传文
  • 【Vue3源码学习】响应式 api: watchEffect

    在 Vue2中watch 是 option 写法中一个很常用的选项 使用它可以非常方便的监听一个数据源的变化 而在 Vue3 中watch 独立成了一个 响应式api 源码地址 packages runtime core src apiWa
  • IOS发送通知与接收通知

    1 注册通知 注册通知 NSNotificationCenter defaultCenter addObserver self selector selector notiReceived name RefreshOrder object
  • 单例模式的优缺点和使用场景

    单例模式 Singleton 也叫单子模式 是一种常用的软件设计模式 在应用这个模式时 单例对象的类必须保证只有一个实例存在 许多时候整个系统只需要拥有一个的全局对象 这样有利于我们协调系统整体的行为 比如在某个服务器程序中 该服务器的配置
  • Unity Animation动画系统

    Unity Animation动画系统 Animation基础用法 Animator动画状态机 注意一些细节 Animation基础用法 创建游戏对象并添加Animation组件 然后将动画文件拖入组件 注意 需要进入动画文件的Debug属
  • 保持健康体态

    少吃多动 我们日常生活中经常可以吃到的米面谷物 蛋糕甜点等都属于富含 碳水化合物 的食物 其中 像蛋糕 甜点 面条这种经过精细加工的食物 就可以被理解为 精制碳水化合物 而奶茶 饮料里边的糖更是精加工碳水 平时吃的精白米面 都属于是精加工碳
  • Linux文件误删除恢复操作

    本文参考http write blog csdn net postedit ticket ST 491405 OGjDDusZeyMgVQ7bHW7f passport csdn net 前言 作为一个多用户 多任务的操作系统 Linux下
  • Linux统计物理cpu、逻辑cpu

    物理cpu个数 grep physical id proc cpuinfo sort uniq wc l 每个物理cpu的核心个数 grep cpu cores proc cpuinfo uniq awk F print 2 每个物理cpu
  • 值传递与引用传递的区别

    一 值传递 是指在调用函数时将实际参数复制一份传递到函数中 这样在函数中如果对参数进行修改 将不会影响到实际参数 代码在内存中的执行流程 1 首先加载main方法 2 接下来int number 100 3 输出调用前的number 结果为
  • C# 参考 : sealed 密封类

    C 语言参考 sealed C 参考 当对一个类应用 sealed 修饰符时 此修饰符会阻止其他类从该类继承 在下面的示例中 类 B 从类 A 继承 但是任何类都不能从类 B 继承 1 class A 2 sealed class B A
  • mysql提高数据插入效率

    1 同时插入多行记录时 宜采用一条Insert语句 2 批量插入记录时 建立采用Load Date Infile语句 3 插入延迟 提高插入操作对系统的不利影响 4 在插入大量数据之前 可以先将表锁定 5 插入数据之前先对数据进行排序
  • Java BufferedImage设置透明背景

    方式一 从网上搜索出来的方案 BufferedImage bufferedImage new BufferedImage width height BufferedImage TYPE INT RGB Graphics2D graphics
  • 《c/c++ 获取时间戳》——精确到毫秒

    timeb h和time h 这两个是C 的标准头文件 在Microsoft Visual Studio VC98 Include中 表示了C 对时间的支持能力 time h中申明了tm结构体 来对时间年月日 时分秒的支持 值得注意的是 它
  • 小程序运营成功的秘诀

    随着移动互联网的快速发展 小程序已经成为许多企业提升用户体验 增强市场竞争力的重要工具 然而 在竞争激烈的市场环境下 要想让小程序真正成功 吸引用户并保持用户的活跃度 需要一系列有效的运营策略 本文将深入探讨小程序运营成功的关键要素 帮助企
  • [Oracle]解决dbms_output.put_line输出长度限制

    解决dbms output put line输出长度限制 设置dbms output enable n n为一个比较大的数值 即长度大于即将输出的内容 如下函数是将输出的长段内容逐行输出的存储过程 可替代dbms output put li
  • WSL2实现桥接网卡(简单版)局域网内互ping不成问题~

    Windows操作 同时选中wsl网卡与以太网网卡 然后选择桥接 就会出现桥接网卡 设置网桥的静态ip和dns WSL2操作 执行以下脚本 实际IP地址 网关啥的根据实际情况设置 bin bash new ip 168 168 4 169
  • VGGNet实现CIFAR-100图像识别-2(图像增强/ImageDataGenerator)

    图像增强 ImageDataGenerator 官方文档直达 代码 注意 使用图像增强的原因 测试ImageDataGenerator对象的flow方法中batch size参数 具体分析ImageDataGenerator对象的flow方