keras实现数据增强

转载链接:https://blog.csdn.net/hnu2012/article/details/54017564

在深度学习中,我们经常需要用到一些技巧(比如将图片进行旋转,翻转等)来进行data augmentation, 来减少过拟合。 在本文中,我们将主要介绍如何用深度学习框架keras来自动的进行data augmentation。

现在让我们来看一个例子:

@requires_authorization
from keras.preprocessing.image import ImageDataGenerator

datagen = ImageDataGenerator(
        rotation_range=40,
        width_shift_range=0.2,
        height_shift_range=0.2,
        rescale=1./255,
        shear_range=0.2,
        zoom_range=0.2,
        horizontal_flip=True,
        fill_mode='nearest',
        cval=0,
        channel_shift_range=0,
        horizontal_flip=False,
        vertical_flip=False,
        rescale=None)
 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

参数

  • rotation_range:整数,数据提升时图片随机转动的角度
  • width_shift_range:浮点数,图片宽度的某个比例,数据提升时图片水平偏移的幅度`
  • height_shift_range:浮点数,图片高度的某个比例,数据提升时图片竖直偏移的幅度
  • rescale: 重放缩因子,默认为None. 如果为None或0则不进行放缩,否则会将该数值乘到数据上(在应用其他变换之前)
  • shear_range:浮点数,剪切强度(逆时针方向的剪切变换角度)
  • zoom_range:浮点数或形如[lower,upper]的列表,随机缩放的幅度,若为浮点数,则相当于[lower,upper] = [1 - zoom_range, 1+zoom_range]
  • fill_mode:‘constant’‘nearest’,‘reflect’或‘wrap’之一,当进行变换时超出边界的点将根据本参数给定的方法进行处理
  • cval:浮点数或整数,当fill_mode=constant时,指定要向超出边界的点填充的值
  • channel_shift_range: Float. Range for random channel shifts.
  • horizontal_flip:布尔值,进行随机水平翻转
  • vertical_flip:布尔值,进行随机竖直翻转
  • rescale: 重放缩因子,默认为None. 如果为None或0则不进行放缩,否则会将该数值乘到数据上(在应用其他变换之前

下面我们使用这个工具来生成图片,并将它们保存在一个临时文件夹中

from keras.preprocessing.image import ImageDataGenerator, array_to_img, img_to_array, load_img

datagen = ImageDataGenerator(
        rotation_range=40,
        width_shift_range=0.2,
        height_shift_range=0.2,
        shear_range=0.2,
        zoom_range=0.2,
        horizontal_flip=True,
        fill_mode='nearest')

img = load_img('data/cat.jpg')  # 这是一个PIL图像
x = img_to_array(img)  # 把PIL图像转换成一个numpy数组,形状为(3, 150, 150)
x = x.reshape((1,) + x.shape)  # 这是一个numpy数组,形状为 (1, 3, 150, 150)

# 下面是生产图片的代码
# 生产的所有图片保存在 `preview/` 目录下
i = 0
for batch in datagen.flow(x, batch_size=1,
                          save_to_dir='preview', save_prefix='cat', save_format='jpeg'):
    i += 1
    if i > 50:
        break  # 否则生成器会退出循环
 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23

flow函数定义

flow(self, X, y, batch_size=32, shuffle=True, seed=None, save_to_dir=None, save_prefix=”, save_format=’jpeg’):接收numpy数组和标签为参数,生成经过数据提升或标准化后的batch数据,并在一个无限循环中不断的返回batch数据.

参数

  • X:样本数据,秩应为4.在黑白图像的情况下channel轴的值为1,在彩色图像情况下值为3
  • y:标签
  • batch_size:整数,默认32
  • shuffle:布尔值,是否随机打乱数据,默认为True
  • save_to_dir:None或字符串,该参数能让你将提升后的图片保存起来,用以可视化
  • save_prefix:字符串,保存提升后图片时使用的前缀, 仅当设置了save_to_dir时生效
  • save_format:”png”或”jpeg”之一,指定保存图片的数据格式,默认”jpeg”
  • yields:形如(x,y)的tuple,x是代表图像数据的numpy数组.y是代表标签的numpy数组.该迭代器无限循环.
  • seed: 整数,随机数种子

下图是原始图片:
这里写图片描述
下图是生产的50张图片:
这里写图片描述

源代码 [ code]

更多关于keras 图片生成器的部分详见 [ ImageDataGenerator ]

    • 0
      点赞
    • 0
      收藏
      觉得还不错? 一键收藏
    • 0
      评论
    Keras是一种使用Python编写的高级神经网络API,它在深度学习领域非常流行。Keras可以用于实现各种图像识别任务,包括图像分类、目标检测和图像分割等。 首先,我们需要构建一个卷积神经网络(Convolutional Neural Network, CNN)模型。CNN是图像识别领域最常用的模型之一。Keras提供了丰富的层(Layer)类,可以帮助我们构建CNN模型。例如,我们可以使用卷积层(Conv2D)来提取图像的特征,使用池化层(MaxPool2D)来减小特征图的大小,使用全连接层(Dense)来进行分类等。 接下来,我们需要准备训练数据和标签。训练数据通常是一批图像数据,标签是与这些图像对应的类别信息。Keras提供了ImageDataGenerator类,可以方便地将图像数据和标签加载到模型进行训练。我们可以设置各种参数,如图像大小、批量大小、数据增强等来优化训练过程。 在模型准备好之后,我们可以使用compile()方法编译模型,并指定损失函数(loss)、优化器(optimizer)和评估指标(metrics)。编译后的模型可以使用fit()方法对训练数据进行训练,使用validate set的数据进行评估。我们可以设置训练的轮数、批量大小等参数。 当模型训练完成后,我们可以使用evaluate()方法对测试集进行评估,也可以使用predict()方法对新的图像数据进行预测。预测结果通常是一个包含各个类别概率的向量,我们可以使用argmax()方法找到概率最高的类别标签。 总之,Keras是一个功能强大且易于使用的深度学习框架,通过它可以轻松实现图像识别任务。我们只需按照一定的步骤构建CNN模型、准备数据、编译模型并进行训练和预测。使用Keras,我们可以更快速、更高效地完成图像识别任务。
    评论
    添加红包

    请填写红包祝福语或标题

    红包个数最小为10个

    红包金额最低5元

    当前余额3.43前往充值 >
    需支付:10.00
    成就一亿技术人!
    领取后你会自动成为博主和红包主的粉丝 规则
    hope_wisdom
    发出的红包
    实付
    使用余额支付
    点击重新获取
    扫码支付
    钱包余额 0

    抵扣说明:

    1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
    2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

    余额充值