深度学习:数据预处理【Image Resize、Data Argumentation、Normalize、ToTensor】

本文主要是介绍深度学习:数据预处理【Image Resize、Data Argumentation、Normalize、ToTensor】,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

深度学习:数据预处理【Image Resize、Data Argumentation、Normalize、ToTensor】

  • 一、Image Resize
  • 二、Data Argumentation/数据增强
    • 1、为什么需要大量的数据?
    • 2、如果没有很多数据,我怎么去获得更多数据?
    • 3、如果我有很多的数据,数据增强会有用吗?
    • 4、数据增强/Data Argumentation的时机
    • 5、数据增强/Data Argumentation 方式
      • 5.1 Flip/翻转
      • 5.2 Rotate/旋转
      • 5.3 Scale/缩放比例
      • 5.4 Crop Part/部分裁剪
      • 5.5 Gaussian Noise/高斯噪声
      • 5.6 移位(Translation)
      • 5.7 GAN
    • 6、数据增强的局限性
  • 三、Normalize
  • 四、ToTensor

一、Image Resize

二、Data Argumentation/数据增强

  • 我们常常会遇到数据不足的情况。比如,你遇到的一个任务,目前只有小几百的数据,然而,你知道目前现在流行的最先进的神经网络都是成千上万的图片数据。你知道有人提及大的数据集是效果好的保证。对自己数据集小感到失望,你怀疑在我的小数据集上能使我的“最先进的”神经网络能表现好吗?
  • 答案是:是!在我们开始是这件事发生之前,我们需要先反思几个问题。

1、为什么需要大量的数据?

下图为流行的神经网络的参数的个数
在这里插入图片描述

  • 当你训练一个机器学习mode时候,你真正做的就是调参以便它能将输入(比如图片)映射到输出(比如标签)。我们优化目标是追求我们模型损失较低的最佳点,当参数以正确的方式调整时就会发生这种情况。
  • 最领先的神经网络有着数百万的参数!
  • 显然,如果你有很多参数,你需要给你的模型足够比例的样本。同样,你需要的参数的个数与你任务的复杂度成比例。

2、如果没有很多数据,我怎么去获得更多数据?

  • 你不必寻找新奇的图片增加到你的数据集中。为什么?因为,神经网络在开始的时候并不是那么聪明。比如,一个欠训练的神经网络会认为这三个如下的网球是不同、独特的图片。相同的网球,但被移位(translated)了
    在这里插入图片描述
  • 所以,为了获得更多的数据,我们只要对现有的数据集进行微小的改变。比如旋转(flips)、移位(translations)、旋转(rotations)等微小的改变。我们的网络会认为这是不同的图片。
  • 如下图,数据增强演示
    在这里插入图片描述
  • 一个卷积神经网络,如果能够对物体即使它放在不同的地方也能稳健的分类,就被称为具有不变性的属性。更具体的,CNN可以对移位(translation)、视角(viewpoint)、大小(size)、照明(illumination)(或者以上的组合)具有不变性。
  • 这本质上是数据增强的前提。在现实场景中,我们可能会有一批在有限场景中拍摄的数据集。但是我们的目标应用可能存在于不同的条件,比如在不同的方向、位置、缩放比例、亮度等。我们通过额外合成的数据来训练神经网络来解释这些情况。

3、如果我有很多的数据,数据增强会有用吗?

  • 是的。它能增加你数据集中相关数据的数据量。这与神经网络的学习方式有关。让我们用一个例子来阐述它。
  • 在我们的假想数据集中分为两类。左侧为品牌A(Ford),有车为品牌B(Chevrolet)
    在这里插入图片描述
  • 假设我们有一个数据集,含两种品牌的车,如上所示。我们假设A品牌的车都如上面左侧一样对其(所有的车头朝向左侧)。同样B如右侧(所有的都朝向右侧)。现在,你将你的数据集送入“最先进的”神经网络,你希望等训练结束后获得令人印象深刻的结果。
  • 测试数据:Ford车(A品牌)却朝向右侧
    在这里插入图片描述
  • 当训练结束后,你送入上面的品牌A车的图片。 但是你的神经网络却认为它是一辆B品牌的车!你很困惑。难道不是刚刚通过这个“最先进的”神经网络获得了95%的准确率吗?我不是夸张,这个事情以往发生过。
  • 为什么发生了这件事? 它的发生正是很多机器学习算法工作的原理。它会去寻找最能区分两个类别的、最明显的特征。这里,A品牌与B品牌最明显的区别是A都是朝向左侧,B是朝向右侧。
  • 你的神经网络会与你喂给它的数据质量一样好或坏。
  • 我们如何去阻止这件事发生呢? 我们不得不减少数据集中不相关的特征。对于上面的轿车模型分类器,一个简单的方案是增加分别朝向原始方向反向的两种车的图片。更好的方法是,你可以从沿着水平方向翻转图片以便它们都朝着反方向!现在,在新数据集上训练神经网络,你将会获得你想要获得的性能。
  • 通过执行数据增强,你可以阻止神经网络学习不相关的特征,从根本上提升整体性能。

4、数据增强/Data Argumentation的时机

  • 在我们的机器学习管道(pipeline)的何处进行增强数据呢?
  • 答案似乎很显然,在我们喂入模型之前,进行数据增强,对吧?是的,但是你有两个选项。一种是事先执行所有转换,实质上会增强你的数据集的大小。另一种选项是在送入机器学习之前,在小批量(mini-batch)上执行这些转换。
    • 第一个选项叫做线下增强(offline augmentation)。这种方法适用于较小的数据集(smaller dataset)。你最终会增加一定的倍数的数据集,这个倍数等于你转换的个数。比如我要翻转我的所有图片,我的数据集相当于乘以2。
    • 第二种方法叫做线上增强(online augmentation)或在飞行中增强(augmentation on the fly)。这种方法更适用于较大的数据集(larger datasets),因为你无法承受爆炸性增加的规模。另外,你会在喂入模型之前进行小批量的转换。一些机器学习框架支持在线增强,可以再gpu上加速。

5、数据增强/Data Argumentation 方式

对于这些技术中的每一种,我们还指定了数据集大小增加的因子,也称为数据增强因子(Data Augmentation Factor)。

5.1 Flip/翻转

  • 可以对图片进行水平和垂直翻转。一些框架不提供垂直翻转功能。但是,一个垂直反转的图片等同于图片的180度旋转,然后再执行水平翻转。下面是我们的图片翻转的例子。
    在这里插入图片描述
  • 从左侧开始,原始图片,水平翻转的图片,垂直翻转的图片。
  • 你可以使用你喜欢的工具包进行下面的任意命令进行翻转,数据增强因子=2或4
# NumPy.'img' = A single image.
flip_1 = np.fliplr(img)
# TensorFlow. 'x' = A placeholder for an image.
shape = [height, width, channels]
x = tf.placeholder(dtype = tf.float32, shape = shape)
flip_2 = tf.image.flip_up_down(x)
flip_3 = tf.image.flip_left_right(x)
flip_4 = tf.image.random_flip_up_down(x)
flip_5 = tf.image.random_flip_left_right(x)

在这里插入图片描述

5.2 Rotate/旋转

  • 一个关键性的问题是当旋转之后图像的维数可能并不能保持跟原来一样。如果你的图片是正方形的,那么以直角旋转将会保持图像大小。如果它是长方形,那么180度的旋转将会保持原来的大小。以更精细的角度旋转图像也会改变最终的图像尺寸。我们将在下一节中看到我们如何处理这个问题。以下是以直角旋转的方形图像的示例。
    在这里插入图片描述
  • 当我们从左向右移动时,图像相对于前一个图像顺时针旋转90度。
  • 你可以使用你喜欢的工具包执行以下的旋转命令。数据增强因子= 2或4。
# Placeholders: 'x' = A single image, 'y' = A batch of images
# 'k' denotes the number of 90 degree anticlockwise rotations
shape = [height, width, channels]
x = tf.placeholder(dtype = tf.float32, shape = shape)
rot_90 = tf.image.rot90(img, k=1)
rot_180 = tf.image.rot90(img, k=2)
# To rotate in any angle. In the example below, 'angles' is in radians
shape = [batch, height, width, 3]
y = tf.placeholder(dtype = tf.float32, shape = shape)
rot_tf_180 = tf.contrib.image.rotate(y, angles=3.1415)
# Scikit-Image. 'angle' = Degrees. 'img' = Input Image
# For details about 'mode', checkout the interpolation section below.
rot = skimage.transform.rotate(img, angle=45, mode='reflect')

在这里插入图片描述

5.3 Scale/缩放比例

  • 图像可以向外或向内缩放。向外缩放时,最终图像尺寸将大于原始图像尺寸。大多数图像框架从新图像中剪切出一个部分,其大小等于原始图像。我们将在下一节中处理向内缩放,因为它会缩小图像大小,迫使我们对超出边界的内容做出假设。以下是缩放的示例或图像。
    在这里插入图片描述
  • 从左到右,原始图像,向外缩放10%,向外缩放20%
  • 您可以使用scikit-image使用以下命令执行缩放。数据增强因子=任意。
# Scikit Image. 'img' = Input Image, 'scale' = Scale factor
# For details about 'mode', checkout the interpolation section below.
scale_out = skimage.transform.rescale(img, scale=2.0, mode='constant')
scale_in = skimage.transform.rescale(img, scale=0.5, mode='constant')
# Don't forget to crop the images back to the original size (for 
# scale_out)

在这里插入图片描述

5.4 Crop Part/部分裁剪

  • 与缩放不同,我们只是从原始图像中随机抽样一个部分。然后,我们将此部分的大小调整为原始图像大小。这种方法通常称为随机裁剪。以下是随机裁剪的示例。仔细观察,你会发现此方法与缩放之间的区别。
    在这里插入图片描述
  • 从左至右,原始图像,左上角裁剪的图像,右下角裁剪的图像。裁剪的部分被缩放为原始图像大小。
  • 你可以使用以下任何TensorFlow命令执行随机裁剪。数据增强因子=任意。.
# TensorFlow. 'x' = A placeholder for an image.
original_size = [height, width, channels]
x = tf.placeholder(dtype = tf.float32, shape = original_size)
# Use the following commands to perform random crops
crop_size = [new_height, new_width, channels]
seed = np.random.randint(1234)
x = tf.random_crop(x, size = crop_size, seed = seed)
output = tf.images.resize_images(x, size = original_size)

在这里插入图片描述

5.5 Gaussian Noise/高斯噪声

  • 当您的神经网络试图学习可能无用的高频特征(大量出现的模式)时,通常会发生过度拟合。具有零均值的高斯噪声基本上在所有频率中具有数据点,从而有效地扭曲高频特征。这也意味着较低频率的组件(通常是您的预期数据)也会失真,但你的神经网络可以学会超越它。添加适量的噪音可以增强学习能力。
  • 一个色调较低的版本是盐和胡椒噪音,它表现为随机的黑白像素在图像中传播。这类似于通过向图像添加高斯噪声而产生的效果,但可能具有较低的信息失真水平。

在这里插入图片描述

  • 从左至右,原始图形,加入高斯噪声图片,加入盐和胡椒噪声图片
  • 您可以在TensorFlow上使用以下命令为图像添加高斯噪声。数据增强因子= 2。
#TensorFlow. 'x' = A placeholder for an image.
shape = [height, width, channels]
x = tf.placeholder(dtype = tf.float32, shape = shape)
# Adding Gaussian noise
noise = tf.random_normal(shape=tf.shape(x), mean=0.0, stddev=1.0,
dtype=tf.float32)
output = tf.add(x, noise)

5.6 移位(Translation)

  • 移位只涉及沿X或Y方向(或两者)移动图像。在下面的示例中,我们假设图像在其边界之外具有黑色背景,并且被适当地移位。这种增强方法非常有用,因为大多数对象几乎可以位于图像的任何位置。这迫使你的卷积神经网络看到所有角落。
    在这里插入图片描述
  • 从左至右,原始图像,向右移位,向上移位
  • 你可以使用以下命令在TensorFlow中执行转换。数据增强因子=任意。
# pad_left, pad_right, pad_top, pad_bottom denote the pixel 
# displacement. Set one of them to the desired value and rest to 0
shape = [batch, height, width, channels]
x = tf.placeholder(dtype = tf.float32, shape = shape)
# We use two functions to get our desired augmentation
x = tf.image.pad_to_bounding_box(x, pad_top, pad_left, height + pad_bottom + pad_top, width + pad_right + pad_left)
output = tf.image.crop_to_bounding_box(x, pad_bottom, pad_right, height, width)

5.7 GAN

  • 现实世界中,自然数据仍然可以存在于上述简单方法无法解释的各种条件下。例如,让我们承担识别照片中景观的任务。景观可以是任何东西:冻结苔原,草原,森林等。听起来像一个非常直接的分类任务吧?除了一件事,你是对的。我们忽略了影响照片表现中的一个重要特征 - 拍摄照片的季节。
  • 如果我们的神经网络不了解某些景观可以在各种条件下(雪,潮湿,明亮等)存在的事实,它可能会将冰冻的湖岸虚假地标记为冰川或湿地作为沼泽。
  • 缓解这种情况的一种方法是添加更多图片,以便我们考虑所有季节性变化。但这是一项艰巨的任务。扩展我们的数据增强概念,想象一下人工生成不同季节的效果有多酷?
  • 使用条件对抗神经网络(Conditional GANs)
  • 在没有进入血腥细节的情况下,条件GAN可以将图像从一个域转换为图像到另一个域。如果你认为这听起来太模糊,那就不是;这就是这个神经网络的强大功能!以下是用于将夏季风景照片转换为冬季风景的条件GAN的示例。使用CycleGAN改变季节
    在这里插入图片描述
  • 上述方法是稳健的,但计算密集。更便宜的替代品将被称为神经风格转移(neural style transfer)。它抓取一个图像(又称“风格”)的纹理、氛围、外观,并将其与另一个图像的内容混合。使用这种强大的技术,我们产生类似于条件GAN的效果(事实上,这种方法是在cGAN发明之前引入的!)。
  • 这种方法的唯一缺点是,输出看起来更具艺术性而非现实性。但是,有一些进步,如下面显示的深度照片风格转移(Deep Photo Style Transfer),有令人印象深刻的结果。
  • 深度照片风格转移。请注意我们如何在数据集上生成我们想要的效果
    在这里插入图片描述
  • 我们没有深入探索这些技术,因为我们并不关心它们的内在工作。我们可以使用现有的训练模型,以及转移学习的魔力,将其用于增强。

6、数据增强的局限性

  • 数据增强可以提升模型训练效果,但是效果是有限的。因为扩展出来的数据和原数据非常相似,即使扩展出无数多数据,也只能提升有限的效果。所以数据提升的程度也不要太大。

三、Normalize

四、ToTensor




参考资料:
数据增强(Data Augmentation)
深度学习中的数据增强方法都有哪些?
深度学习中有哪些数据增强方法?

这篇关于深度学习:数据预处理【Image Resize、Data Argumentation、Normalize、ToTensor】的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1128903

相关文章

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

Ilya-AI分享的他在OpenAI学习到的15个提示工程技巧

Ilya(不是本人,claude AI)在社交媒体上分享了他在OpenAI学习到的15个Prompt撰写技巧。 以下是详细的内容: 提示精确化:在编写提示时,力求表达清晰准确。清楚地阐述任务需求和概念定义至关重要。例:不用"分析文本",而用"判断这段话的情感倾向:积极、消极还是中性"。 快速迭代:善于快速连续调整提示。熟练的提示工程师能够灵活地进行多轮优化。例:从"总结文章"到"用

大模型研发全揭秘:客服工单数据标注的完整攻略

在人工智能(AI)领域,数据标注是模型训练过程中至关重要的一步。无论你是新手还是有经验的从业者,掌握数据标注的技术细节和常见问题的解决方案都能为你的AI项目增添不少价值。在电信运营商的客服系统中,工单数据是客户问题和解决方案的重要记录。通过对这些工单数据进行有效标注,不仅能够帮助提升客服自动化系统的智能化水平,还能优化客户服务流程,提高客户满意度。本文将详细介绍如何在电信运营商客服工单的背景下进行

基于MySQL Binlog的Elasticsearch数据同步实践

一、为什么要做 随着马蜂窝的逐渐发展,我们的业务数据越来越多,单纯使用 MySQL 已经不能满足我们的数据查询需求,例如对于商品、订单等数据的多维度检索。 使用 Elasticsearch 存储业务数据可以很好的解决我们业务中的搜索需求。而数据进行异构存储后,随之而来的就是数据同步的问题。 二、现有方法及问题 对于数据同步,我们目前的解决方案是建立数据中间表。把需要检索的业务数据,统一放到一张M

关于数据埋点,你需要了解这些基本知识

产品汪每天都在和数据打交道,你知道数据来自哪里吗? 移动app端内的用户行为数据大多来自埋点,了解一些埋点知识,能和数据分析师、技术侃大山,参与到前期的数据采集,更重要是让最终的埋点数据能为我所用,否则可怜巴巴等上几个月是常有的事。   埋点类型 根据埋点方式,可以区分为: 手动埋点半自动埋点全自动埋点 秉承“任何事物都有两面性”的道理:自动程度高的,能解决通用统计,便于统一化管理,但个性化定

使用SecondaryNameNode恢复NameNode的数据

1)需求: NameNode进程挂了并且存储的数据也丢失了,如何恢复NameNode 此种方式恢复的数据可能存在小部分数据的丢失。 2)故障模拟 (1)kill -9 NameNode进程 [lytfly@hadoop102 current]$ kill -9 19886 (2)删除NameNode存储的数据(/opt/module/hadoop-3.1.4/data/tmp/dfs/na

异构存储(冷热数据分离)

异构存储主要解决不同的数据,存储在不同类型的硬盘中,达到最佳性能的问题。 异构存储Shell操作 (1)查看当前有哪些存储策略可以用 [lytfly@hadoop102 hadoop-3.1.4]$ hdfs storagepolicies -listPolicies (2)为指定路径(数据存储目录)设置指定的存储策略 hdfs storagepolicies -setStoragePo

Hadoop集群数据均衡之磁盘间数据均衡

生产环境,由于硬盘空间不足,往往需要增加一块硬盘。刚加载的硬盘没有数据时,可以执行磁盘数据均衡命令。(Hadoop3.x新特性) plan后面带的节点的名字必须是已经存在的,并且是需要均衡的节点。 如果节点不存在,会报如下错误: 如果节点只有一个硬盘的话,不会创建均衡计划: (1)生成均衡计划 hdfs diskbalancer -plan hadoop102 (2)执行均衡计划 hd

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

学习hash总结

2014/1/29/   最近刚开始学hash,名字很陌生,但是hash的思想却很熟悉,以前早就做过此类的题,但是不知道这就是hash思想而已,说白了hash就是一个映射,往往灵活利用数组的下标来实现算法,hash的作用:1、判重;2、统计次数;