【TensorFlow2 之011】TF 如何使用数据增强提高模型性能?

news2024/12/22 15:03:49

一、说明

        亮点:在这篇文章中,我们将展示数据增强技术作为提高模型性能的一种方式的好处。当我们没有足够的数据可供使用时,这种方法将非常有益。

教程概述:

  1. 无需数据增强的训练
  2. 什么是数据增强?
  3. 使用数据增强进行训练
  4. 可视化

二、没有数据增强的训练

        一个熟悉的问题是“我们为什么要使用数据增强?所以,让我们看看答案。

        为了证明这一点,我们将在TensorFlow中创建一个卷积神经网络,并在Cats-vs-Dog数据集上对其进行训练。

        首先,我们将准备用于训练的数据集。我们将首先从在线存储库下载数据集。完成此操作后,我们将继续解压缩并为训练和验证集创建路径位置。

import os
import wget
import zipfile

wget.download("https://storage.googleapis.com/mledu-datasets/cats_and_dogs_filtered.zip")
100% [........................................................................] 68606236 / 68606236

Out[2]:

'cats_and_dogs_filtered.zip'

 

with zipfile.ZipFile("cats_and_dogs_filtered.zip","r") as zip_ref:
    zip_ref.extractall()

base_dir = 'cats_and_dogs_filtered'

train_dir = os.path.join(base_dir, 'train')
validation_dir = os.path.join(base_dir, 'validation')

       让我们继续加载本教程所需的必要库。

import numpy as np
import tensorflow as tf
import matplotlib.pyplot as plt
import matplotlib.image as mpimg

from tensorflow.keras import Model
from tensorflow.keras.optimizers import RMSprop
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Flatten, Dense, Dropout, Activation
from tensorflow.keras.layers import Conv2D, MaxPooling2D
from tensorflow.keras.callbacks import TensorBoard
from tensorflow.keras.preprocessing.image import img_to_array, load_img
from tensorflow.keras.preprocessing.image import ImageDataGenerator

        我们将使用“模型子类化技术”来构建模型。这样,我们应该在__init__中定义我们的层,并在调用中实现模型的前向传递。模型的输入将是大小为 \([150, 150, 3]\) 的图像。在卷积层之后,我们将利用两个完全连接的层来进行预测。这是一个二元分类问题,所以我们在输出层中只有一个神经元。

class Create_model(Model):
    def __init__(self, chanDim=-1):
        super(Create_model, self).__init__()
        self.conv1A = Conv2D(16, 3, input_shape = (150, 150, 3))
        self.act1A  = Activation("relu")
        self.pool1A = MaxPooling2D(2)
        self.conv1B = Conv2D(32, 3)
        self.act1B  = Activation("relu")
        self.pool1B = MaxPooling2D(pool_size=(2, 2))
        self.conv1C = Conv2D(64, 3)
        self.act1C  = Activation("relu")
        self.pool1C = MaxPooling2D(2)

        self.flatten = Flatten()
        self.dense2A = Dense(512)
        self.act2A  = Activation("relu")
        self.dense2B = Dense(1)
        self.sigmoid  = Activation("sigmoid")
  
    def call(self, inputs):
        x = self.conv1A(inputs)
        x = self.act1A(x)
        x = self.pool1A(x)
        x = self.conv1B(x)
        x = self.act1B(x)
        x = self.pool1B(x)
        x = self.conv1C(x)
        x = self.act1C(x)
        x = self.pool1C(x)
    
        x = self.flatten(x)
        x = self.dense2A(x)
        x = self.act2A(x)
        x = self.dense2B(x)
        x = self.sigmoid(x)

        return x

model = Create_model()

model.compile(loss='binary_crossentropy',
              optimizer=RMSprop(lr=0.001),
              metrics=['accuracy'])

        我们的图像不在一个文件中,而是在多个文件夹中。为了在这样的数据集上训练网络,我们需要使用图像数据生成器。在创建两个生成器(用于训练和验证)后,我们可以使用 fit 方法训练网络。唯一的区别是,我们不是将输入和输出分别传递给我们的网络,而是将数据生成器传递给网络。

        最好规范化像素值,以便每个像素值的值介于 0 和 1 之间,以免中断或减慢学习过程。因此,这将是传递给图像数据生成器的唯一参数。然后,我们将使用这些数据生成器遍历目录、调整图像大小和创建批处理。

train_datagen = ImageDataGenerator(rescale=1./255)
val_datagen = ImageDataGenerator(rescale=1./255)

train_generator = train_datagen.flow_from_directory(
        train_dir,
        target_size=(150, 150),
        batch_size=20,
        class_mode='binary')

validation_generator = val_datagen.flow_from_directory(
        validation_dir,
        target_size=(150, 150),
        batch_size=20,
        class_mode='binary')

history = model.fit(
        train_generator,
        steps_per_epoch=100,
        epochs=15,
        validation_data=validation_generator,
        validation_steps=50,
        verbose=0)

        让我们检查一下模型的分类准确性和损失。

        在这里,训练集的准确性和损失都以蓝色显示,而验证集的准确度和损失都以橙色显示。

accuracy = history.history['accuracy']
val_accuracy = history.history['val_accuracy']

loss = history.history['loss']
val_loss = history.history['val_loss']

epochs = range(len(accuracy))

plt.plot(epochs, accuracy)
plt.plot(epochs, val_accuracy)
plt.title('Training and validation accuracy')

plt.figure()

plt.plot(epochs, loss)
plt.plot(epochs, val_loss)
plt.title('Training and validation loss')

  

       从这些图中,我们可以清楚地看到,模型在训练中的表现比在验证集上的表现要好得多。那么我们能做什么呢?使用数据增强。

三、什么是数据增强?

        大多数计算机视觉任务需要大量数据,而数据增强是用于提高计算机视觉系统性能的技术之一。计算机视觉是一项相当复杂的任务。对于输入图像,算法必须找到一种模式来理解图片中的内容。

        在实践中,拥有更多数据将有助于几乎所有的计算机视觉任务。今天,计算机视觉的状态需要更多的数据来解决大多数计算机视觉问题。对于卷积神经网络的所有应用来说,这可能不是真的,但对于计算机视觉领域来说确实如此。

        当我们训练计算机视觉模型时,数据增强通常会有所帮助。无论我们使用迁移学习还是从头开始训练模型,都是如此。

        因此,数据增强是一种技术,可以在不收集新数据的情况下显着增加可用于训练的数据的多样性。您可以在此处找到有关数据增强理论方面的更多信息。

四、 使用数据增强进行训练

        乍一看,数据增强可能听起来很复杂,但幸运的是,TensorFlow 允许我们有效地实现它。

        因此,我们将像以前一样使用图像数据生成器,但我们将添加重新缩放、旋转、移动、缩放、缩放和翻转。再次重要的是要说,此过程仅适用于训练集,而不应用于验证。

        在这里,我们不仅要调整大小,还要添加旋转(以度为单位的范围)、高度和宽度偏移(以像素为单位的范围)、剪切范围(以度为单位的逆时针方向的角度)、缩放范围和翻转。

train_datagen = ImageDataGenerator(
    rescale=1./255,
    rotation_range=40,
    width_shift_range=0.2,
    height_shift_range=0.2,
    shear_range=0.2,
    zoom_range=0.2,
    horizontal_flip=True,)

val_datagen = ImageDataGenerator(rescale=1./255)

train_generator = train_datagen.flow_from_directory(
        train_dir,
        target_size=(150, 150),
        batch_size=20,
        class_mode='binary')

validation_generator = val_datagen.flow_from_directory(
        validation_dir,
        target_size=(150, 150),
        batch_size=20,
        class_mode='binary')

Found 2000 images belonging to 2 classes.
Found 1000 images belonging to 2 classes.

        此外,Dropout 层将被添加到我们的神经网络中。我们将丢弃\(50%\)个起始神经元。添加 Dropout 图层将有助于防止过度拟合。

class Create_model(Model):
    def __init__(self, chanDim=-1):
        super(Create_model, self).__init__()
        self.conv1A = Conv2D(16, 3, input_shape = (150, 150, 3))
        self.act1A  = Activation("relu")
        self.pool1A = MaxPooling2D(2)
        self.conv1B = Conv2D(32, 3)
        self.act1B  = Activation("relu")
        self.pool1B = MaxPooling2D(pool_size=(2, 2))
        self.conv1C = Conv2D(64, 3)
        self.act1C  = Activation("relu")
        self.pool1C = MaxPooling2D(2)

        self.flatten = Flatten()
        self.dense2A = Dense(512)
        self.act2A  = Activation("relu")
        self.dropout = Dropout(0.5)
        self.dense2B = Dense(1)
        self.sigmoid  = Activation("sigmoid")
  
    def call(self, inputs):
        x = self.conv1A(inputs)
        x = self.act1A(x)
        x = self.pool1A(x)
        x = self.conv1B(x)
        x = self.act1B(x)
        x = self.pool1B(x)
        x = self.conv1C(x)
        x = self.act1C(x)
        x = self.pool1C(x)

        x = self.flatten(x)
        x = self.dense2A(x)
        x = self.act2A(x)
        x = self.dropout(x)
        x = self.dense2B(x)
        x = self.sigmoid(x)

        return x

model = Create_model()

model.compile(loss='binary_crossentropy',
              optimizer=RMSprop(lr=0.001),
              metrics=['accuracy'])

现在我们可以训练网络了。

history = model.fit(
        train_generator,
        steps_per_epoch=100,
        epochs=30,
        validation_data=validation_generator,
        validation_steps=50,
        verbose=2)

Train for 100 steps, validate for 50 steps
Epoch 1/30
100/100 - 92s - loss: 0.9063 - accuracy: 0.5125 - val_loss: 0.7271 - val_accuracy: 0.5000
Epoch 2/30
100/100 - 56s - loss: 0.7020 - accuracy: 0.5625 - val_loss: 0.6551 - val_accuracy: 0.5480
Epoch 3/30
100/100 - 56s - loss: 0.6815 - accuracy: 0.5950 - val_loss: 0.6253 - val_accuracy: 0.6600
Epoch 4/30
100/100 - 57s - loss: 0.6594 - accuracy: 0.6220 - val_loss: 0.6262 - val_accuracy: 0.6350
Epoch 5/30
100/100 - 56s - loss: 0.6352 - accuracy: 0.6485 - val_loss: 0.5916 - val_accuracy: 0.6890
Epoch 6/30
100/100 - 56s - loss: 0.6336 - accuracy: 0.6675 - val_loss: 0.5774 - val_accuracy: 0.6790
Epoch 7/30
100/100 - 57s - loss: 0.6383 - accuracy: 0.6570 - val_loss: 0.5830 - val_accuracy: 0.6980


让我们看看结果。在这里,训练集的准确性和损失都以蓝色显示,而验证集的准确度和损失都以橙色显示。

accuracy = history.history['accuracy']
val_accuracy = history.history['val_accuracy']

loss = history.history['loss']
val_loss = history.history['val_loss']

epochs = range(len(accuracy))

plt.plot(epochs, accuracy)
plt.plot(epochs, val_accuracy)
plt.title('Training and validation accuracy')

plt.figure()

plt.plot(epochs, loss)
plt.plot(epochs, val_loss)
plt.title('Training and validation loss')
Text(0.5, 1.0, 'Training and validation loss')

现在的结果好多了。但是,我们模型的准确性还不完美。

我们将在下一篇文章中使用迁移学习来解决这个问题。

五、 可视化

到目前为止,我们只是在讨论如何创建增强图像,但让我们看看它们的外观。

为此,我们需要使用来自生成器的一个图像并“循环它”。这将遍历生成器并执行增强。下面我们展示了这些图像样本的可视化。

augmented_images = [train_generator[0][0][0] for i in range(12)]
plt.figure(figsize=(8,6))

for i in range(12):
	plt.subplot(3, 4, i+1)
	image = augmented_images[i]
	image = image.reshape(150, 150, 3)
	plt.imshow(image)
pyplot.show()
狗增强图像
增强图像

六、总结

        总而言之,我们已经学会了如何使用数据增强技术来提高模型的性能。在数据稀缺或数据收集成本高昂的情况下,我们可以使用这种方法。但是,请注意,我们不能将数据集扩充到非常大的比例。此方法有其局限性。在下一篇文章中,我们将展示如何应用迁移学习的过程。

有关该主题的更多资源:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1083675.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Excel 中使用数据透视图进行数据可视化

使用数据透视表(PivotTable)是在Excel中进行数据可视化的强大工具。下面将提供详细的步骤来使用数据透视表进行数据可视化。 **步骤一:准备数据** 首先,确保你有一个包含所需数据的Excel表格。数据应该按照一定的结构和格式组织…

4.js中next()方法与prev()方法使用

我们可以选择某个DOM元素进行获取和操作,但是有时候我们在操作某个元素的时候,也要对它相邻的的元素进行获取或是操作,那我们该如何去做呢,今天记录一个获取某个元素的相邻的上一个元素或相邻的下一个元素 js中的next()方法 next…

【HarmonyOS】低代码平台组件拖拽使用技巧之堆叠容器

【关键字】 HarmonyOS、低代码平台、组件拖拽、堆叠组件 1、写在前面 从本篇开始,我们一起来学习一下低代码平台中组件的托拉拽,虽然组件拖拽十分简单,但实际上还是有一定的技巧,新手上路难免会遇到一定的问题,如果能…

Python并行编程之道—加速海量任务同时执行

这次我要和大家分享一种加速海量任务执行的方法,那就是Python并行编程。如果你经常处理大量的任务,并且希望能够同时执行它们以提高效率,那么并行编程将会给你带来巨大的帮助! 1、了解并行编程 并行编程是利用多个执行单元同时执…

国产化系统加密/国产化系统防泄密

​深信达网络科技有限公司自主研发的深信达主机加固系统软件V2.0、深信达沙盒防泄密系统软件V5.0,与麒麟软件完成兼容认证,并被纳入麒麟软件安全生态联盟成员之一。 麒麟软件主要面向通用和专用领域打造安全创新操作系统产品和相应解决方案,以…

《动手学深度学习 Pytorch版》 8.4 循环神经网络

8.4.1 无隐状态的神经网络 对于无隐藏装态的神经网络来说,给定一个小批量样本 X ∈ R n d \boldsymbol{X}\in\mathbb{R}^{n\times d} X∈Rnd,则隐藏层的输出 H ∈ R n h \boldsymbol{H}\in\mathbb{R}^{n\times h} H∈Rnh 通过下式计算: …

【2023研电赛】商业计划书命题:基于三维视觉感知的可重构智能表面通信设计

该作品参与极术社区组织的2023研电赛作品征集活动,欢迎同学们投稿,获取作品传播推广,并有丰富礼品哦~ 基于三维视觉感知的可重构智能表面通信设计 参赛单位:华北水利水电大学 参赛队伍:创新小组 指导老师:邵…

揭秘光耦合器继电器:了解其功能和应用

在现代电子领域,光耦合器继电器已成为重要组件,可实现各种电路之间的无缝通信。这些小型但功能强大的设备广泛用于从家庭自动化到工业控制系统的各种应用。在本文中,我们将深入研究光耦合器继电器的工作原理,并探讨其广泛采用背后…

外汇天眼:又一平台被假冒,投资者交友误入假BOQ惨遭杀猪盘!

我们都知道,现在网站制作的门槛越来越低,只要懂点皮毛就很容易模仿别人的网站。因为道理很简单,拷贝正规网站前台的样式表和前端代码,然后找个开源的后台程序一对接,网站就做好了。正是如此,一些骗子就利用…

ikuai配置

ikuai配置 一.安装爱快路由二.进入爱快路由web界面三.配置外网设置四.配置DHCP服务器(爱快默认未启用此服务,不配置此步网段内主机获取不到ip也就无法上网) 一.安装爱快路由 爱快路…

【SCSS篇】Vite+Vue3项目全局引入scss文件

文章目录 前言一、安装与使用1.1 安装1.2 scss 全局文件编写1.2.1 概述 1.3 全局引入和配置1.4 组件内使用 vue2 项目引入 sass附:忽略ts类型检测 前言 Sass 是世界上最成熟、最稳定、最强大的专业级CSS扩展语言!在日常项目开发过程中使用非常广泛&…

信钰证券:9月以来A股20家银行 获机构不同批次调研

Wind数据显现,自9月份以来,已经有20家银行获安排不同批次调研。其间常熟银行、瑞丰银行被调研次数较多,别离为20次、11次;宁波银行、渝农商行获安排调研家数居前,别离为206家、128家。从上市银行宣布的调研情况来看&am…

知识图谱03——安装pytorch与torch-geometric

参考自https://blog.csdn.net/Andrew_zjc/article/details/117914736 下载pytorch 查阅自己电脑cuda版本 打开命令行,输入 nvidia-smi可以看到我电脑cuda版本12.0,pytorch版本向下兼容 登陆torch官网下载,https://pytorch.org/ 没有12.0,…

【保姆级】网络安全工程师学习成长路线,就业前景,薪资待遇分享

前言 最近总能在网上看到很多诸如:“怎样成为网络信息安全工程师”等相关问题,这可能与近几年网络安全事件频发,国家对于互联网信息安全和互联网舆情的重视程度不断提升有关,似乎网络信息安全工程师随之成为炙手可热的职业。 待…

智能照片修复软件Topaz Video AI mac中文新增功能

Topaz Video AI mac是一款使用人工智能技术对视频进行增强和修复的软件。它可以自动降噪、去除锐化、减少压缩失真、提高清晰度等等。Topaz Video AI可以处理各种类型的视频,包括低分辨率视频、老旧影片、手机录制的视频等等。 使用Topaz Video AI非常简单&#xf…

视频美颜SDK,提升企业视频通话质量与形象

在今天的数字时代,视频通话已经成为企业与客户、员工之间不可或缺的沟通方式。然而,由于网络环境、设备性能等因素的影响,视频通话中的画面质量往往难以达到预期效果。为了提升视频通话的质量与形象,美摄美颜SDK应运而生&#xff…

顶顶通ASR安装配置说明

联系顶顶通申请Asrproxy授权,勾选asrproxy和asrserver模块。 下载语音识别模型 链接:https://pan.baidu.com/s/1IuDkDeytZOqf7tAbIb6h1Q 提取码:6vg6 安装asrproxy到/ddt/asrproxy,模型解压到 /ddt/asrproxy/model 对接mod_vad asrproxy.…

如何一站式解决跨境电商难题?

跨境电商经营面临着众多挑战,如海外IP访问限制、账号封禁风险等。然而,借助指纹浏览器的一站式解决方案,跨境电商可以轻松应对这些难题,实现顺畅的全球业务拓展。 一、跨境电商面临的挑战: 跨境电商经营面临以下挑战…

安道亮相深圳国际全触与显示展,展示最新商显研发成果!

10月11日,2023深圳国际全触与显示展在深圳举行,安道及晟沃携最新智能交互一体机、会议配件等最新商显产品亮相,现场真实智能会议场景,全面展现安道在智慧终端方面的卓越研发实力和创新应用能力,吸引了众多观众前来展台…

【AGC】云托管状态一直是“上线中”的问题

【关键字】 AGC、云托管、网址域名 【问题描述】 有开发者反馈开通了云托管服务,然后进行了相关域名设定,等待激活,无法活动,状态一直是‘上线中’。 ​ ​ 开通托管已经一天了一直卡着,状态一直是“上线中”。并且…