如何从 Keras 中的深度学习目录加载大型数据集
一、说明
数据集读取,使用、在磁盘上存储和构建图像数据集有一些约定,以便在训练和评估深度学习模型时能够快速高效地加载。本文介绍Keras 深度学习库中的ImageDataGenerator类等工具自动加载训练、测试和验证数据集。
二、ImageDataGenerator加载数据集
您可以使用Keras 深度学习库中的ImageDataGenerator类等工具自动加载训练、测试和验证数据集。此外,生成器将逐步加载数据集中的图像,使您可以处理包含数千或数百万张可能无法放入系统内存的图像的小型和非常大的数据集。
在本教程中,您将了解如何构建图像数据集以及如何在拟合和评估深度学习模型时逐步加载它。
完成本教程后,您将了解:
- 如何将训练、测试和验证图像数据集组织成一致的目录结构。
- 如何使用ImageDataGenerator类逐步加载给定数据集的图像。
- 如何使用准备好的数据生成器通过深度学习模型进行训练、评估和预测。
使用我的新书《计算机视觉深度学习》来启动您的项目,其中包括分步教程和所有示例的Python 源代码文件。让我们开始吧。
三、教程概述
本教程分为三个部分;他们是:
- 数据集目录结构
- 数据集结构示例
- 如何逐步加载图像
四、数据集目录结构
有一种标准方法可以布置用于建模的图像数据。
收集图像后,必须首先按数据集对它们进行排序,例如训练、测试和验证,然后按类别对它们进行排序。
例如,想象一个图像分类问题,我们希望根据汽车的颜色对照片进行分类,例如红色汽车、蓝色汽车等。
首先,我们有一个data/目录,我们将在其中存储所有图像数据。
接下来,我们将有一个用于训练数据集的data/train/目录和一个用于保留测试数据集的data/test/目录。在训练期间,我们还可能有用于验证数据集的数据/验证/ 。
到目前为止,我们已经:
1 2 3 4 | data/ data/train/ data/test/ data/validation/ |
在每个数据集目录下,我们都会有子目录,每个类都有一个子目录,其中将放置实际的图像文件。
例如,如果我们有一个将汽车照片分类为红色汽车或蓝色汽车的二元分类任务,则我们将有两个类“红色”和“蓝色”,因此每个数据集目录下有两个类目录。
例如:
1 2 3 4 5 6 7 8 9 10 | data/ data/train/ data/train/red/ data/train/blue/ data/test/ data/test/red/ data/test/blue/ data/validation/ data/validation/red/ data/validation/blue/ |
然后红色汽车的图像将被放置在适当的类目录中。
例如:
1 2 3 4 5 6 7 8 | data/train/red/car01.jpg data/train/red/car02.jpg data/train/red/car03.jpg ... data/train/blue/car01.jpg data/train/blue/car02.jpg data/train/blue/car03.jpg ... |
请记住,我们不会将相同的文件放在red/和blue/目录下;相反,分别有红色汽车和蓝色汽车的不同照片。
另请记住,我们在训练、测试和验证数据集中需要不同的照片。
用于实际图像的文件名通常并不重要,因为我们将加载具有给定文件扩展名的所有图像。
如果您能够一致地重命名文件,一个好的命名约定是使用某个名称,后跟一个填充零的数字,例如image0001.jpg(如果您有数千个类的图像)。
五、示例数据集结构
我们可以通过一个例子使图像数据集结构具体化。
想象一下,我们正在对汽车照片进行分类,正如我们在上一节中讨论的那样。具体来说,就是红色汽车和蓝色汽车的二元分类问题。
我们必须创建上一节中概述的目录结构,具体来说:
1 2 3 4 5 6 7 8 9 10 | data/ data/train/ data/train/red/ data/train/blue/ data/test/ data/test/red/ data/test/blue/ data/validation/ data/validation/red/ data/validation/blue/ |
让我们实际创建这些目录。
我们还可以将一些照片放在目录中。
您可以使用知识共享图像搜索来查找一些具有宽松许可的图像,您可以下载这些图像并将其用于此示例。
我将使用两张图片:
- 丹尼斯·贾维斯 (Dennis Jarvis) 的《红色汽车》。
- 蓝色汽车,比尔·史密斯 (Bill Smith) 着。
丹尼斯·贾维斯 (Dennis Jarvis) 的《红色汽车》
蓝色汽车,比尔·史密斯 (Bill Smith)
将照片下载到您当前的工作目录,并将红色汽车的照片保存为“red_car_01.jpg”,将蓝色汽车的照片保存为“blue_car_01.jpg”。
对于每个训练、测试和验证数据集,我们必须有不同的照片。
为了保持本教程的重点,我们将在三个数据集中的每一个数据集中重复使用相同的图像文件,但假装它们是不同的照片。
将“red_car_01.jpg”文件的副本放在 data/train/red/、data/test/red/ 和 data/validation/red/ 目录中。
现在,将“blue_car_01.jpg”文件的副本放在 data/train/blue/、data/test/blue/ 和 data/validation/blue/ 目录中。
现在,我们有一个非常基本的数据集布局,如下所示(tree 命令的输出):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | data ├── test │ ├── blue │ │ └── blue_car_01.jpg │ └── red │ └── red_car_01.jpg ├── train │ ├── blue │ │ └── blue_car_01.jpg │ └── red │ └── red_car_01.jpg └── validation ├── blue │ └── blue_car_01.jpg └── red └── red_car_01.jpg |
下面是目录结构的屏幕截图,取自 macOS 上的 Finder 窗口。
图像数据集目录和文件结构的屏幕截图
现在我们有了基本的目录结构,让我们练习从文件加载图像数据以用于建模。
六、如何逐步加载图像
可以编写代码来手动加载图像数据并返回准备建模的数据。
这将包括遍历数据集的目录结构、加载图像数据以及返回输入(像素数组)和输出(类整数)。
值得庆幸的是,我们不需要编写此代码。相反,我们可以使用 Keras 提供的 ImageDataGenerator 类。
使用此类加载数据的主要好处是,将批量加载单个数据集的图像,这意味着它既可用于加载小型数据集,也可用于加载具有数千或数百万个图像的超大型图像数据集。
在训练和评估深度学习模型时,它不会将所有图像加载到内存中,而是将刚好足够的图像加载到内存中,以供当前甚至接下来的几个小批量使用。我将其称为渐进式加载,因为数据集是从文件中渐进式加载的,只需检索足够的数据即可立即使用。
使用 ImageDataGenerator 类的另一个好处是,它还可以自动缩放图像的像素值,并且可以自动生成图像的增强版本。我们将把这些主题留到另一个教程中讨论,而是专注于如何使用 ImageDataGenerator 类从文件加载图像数据。
使用 ImageDataGenerator 类的模式如下所示:
- 构造和配置 ImageDataGenerator 类的实例。
- 通过调用 flow_from_directory() 函数检索迭代器。
- 在模型的训练或评估中使用迭代器。
让我们仔细看看每个步骤。
ImageDataGenerator 的构造函数包含许多参数,用于指定如何在加载图像数据后对其进行操作,包括像素缩放和数据增强。在此阶段,我们不需要任何这些功能,因此配置 ImageDataGenerator 很容易。
1 2 3 | ... # create a data generator datagen = ImageDataGenerator() |
接下来,需要一个迭代器来逐步加载单个数据集的图像。
这需要调用 flow_from_directory() 函数并指定数据集目录,例如训练、测试或验证目录。
该功能还允许您配置与图像加载相关的更多详细信息。值得注意的是“target_size”参数,它允许您将所有图像加载到特定大小,这在建模时通常需要。该函数默认为大小为 (256, 256) 的方形图像。
该函数还允许您通过“class_mode”参数指定分类任务的类型,特别是它是“二进制”还是“分类”的多类分类。
默认的“batch_size”是 32,这意味着在训练时,每批都会返回 32 张从数据集中各个类中随机选择的图像。可能需要更大或更小的批次。在评估模型时,您可能还希望以确定性顺序返回批次,这可以通过将“shuffle”设置为“False”来实现。
还有许多其他选项,我鼓励您查看 API 文档。
我们可以使用相同的 ImageDataGenerator 为单独的数据集目录准备单独的迭代器。如果我们希望将相同的像素缩放应用于多个数据集(例如 trian、test 等),这将非常有用。
1 2 3 4 5 6 7 | ... # load and iterate training dataset train_it = datagen.flow_from_directory('data/train/', class_mode='binary', batch_size=64) # load and iterate validation dataset val_it = datagen.flow_from_directory('data/validation/', class_mode='binary', batch_size=64) # load and iterate test dataset test_it = datagen.flow_from_directory('data/test/', class_mode='binary', batch_size=64) |
准备好迭代器后,我们可以在拟合和评估深度学习模型时使用它们。
例如,可以通过在模型上调用 fit_generator() 函数并传递训练迭代器 (train_it) 来实现使用数据生成器拟合模型。通过“validation_data”参数调用此函数时,可以指定验证迭代器 (val_it)。
必须为训练迭代器指定“steps_per_epoch”参数,以便定义定义单个纪元的图像批次。
例如,如果训练数据集中有 1,000 张图像(跨所有类),并且批处理大小为 64,则steps_per_epoch约为 16 或 1000/64。
同样,如果应用了验证迭代器,则还必须指定“validation_steps”参数,以指示定义一个纪元的验证数据集中的批次数。
1 2 3 4 5 | ... # define model model = ... # fit model model.fit_generator(train_it, steps_per_epoch=16, validation_data=val_it, validation_steps=8) |
模型拟合后,可以使用 evaluate_generator() 函数在测试数据集上对其进行评估,并传入测试迭代器 (test_it)。“steps”参数定义在停止之前评估模型时要逐步执行的样本批次数。
1 2 3 | ... # evaluate model loss = model.evaluate_generator(test_it, steps=24) |
最后,如果你想使用拟合模型对一个非常大的数据集进行预测,你也可以为该数据集创建一个迭代器(例如predict_it),并在模型上调用 predict_generator() 函数。
1 2 3 | ... # make a prediction yhat = model.predict_generator(predict_it, steps=24) |
让我们使用上一节中定义的小型数据集来演示如何定义 ImageDataGenerator 实例并准备数据集迭代器。
下面列出了一个完整的示例。
1 2 3 4 5 6 7 8 9 10 11 | # example of progressively loading images from file from keras.preprocessing.image import ImageDataGenerator # create generator datagen = ImageDataGenerator() # prepare an iterators for each dataset train_it = datagen.flow_from_directory('data/train/', class_mode='binary') val_it = datagen.flow_from_directory('data/validation/', class_mode='binary') test_it = datagen.flow_from_directory('data/test/', class_mode='binary') # confirm the iterator works batchX, batchy = train_it.next() print('Batch shape=%s, min=%.3f, max=%.3f' % (batchX.shape, batchX.min(), batchX.max())) |
运行该示例首先使用所有默认配置创建 ImageDataGenerator 的实例。
接下来,创建三个迭代器,分别用于训练、验证和测试二进制分类数据集。创建每个迭代器时,我们可以看到调试消息,其中报告了发现和准备的映像和类的数量。
最后,我们测试了用于拟合模型的训练迭代器。检索到第一批图像,我们可以确认该批次包含两个图像,因为只有两个图像可用。我们还可以确认图像被加载并强制到 256 行和 256 列像素的正方形尺寸,并且像素数据没有缩放并保持在 [0, 255] 范围内。
1 2 3 4 | Found 2 images belonging to 2 classes. Found 2 images belonging to 2 classes. Found 2 images belonging to 2 classes. Batch shape=(2, 256, 256, 3), min=0.000, max=255.000 |
七、总结
相关文章:

如何从 Keras 中的深度学习目录加载大型数据集
一、说明 数据集读取,使用、在磁盘上存储和构建图像数据集有一些约定,以便在训练和评估深度学习模型时能够快速高效地加载。本文介绍Keras 深度学习库中的ImageDataGenerator类等工具自动加载训练、测试和验证数据集。 二、ImageDataGenerator加载数据集…...

【大数据】Flink 详解(八):SQL 篇 Ⅰ
《Flink 详解》系列(已完结),共包含以下 10 10 10 篇文章: 【大数据】Flink 详解(一):基础篇【大数据】Flink 详解(二):核心篇 Ⅰ【大数据】Flink 详解&…...

如何从命令行运行testng.xml?
目录 创建一个新的java项目并从命令行运行testng.xml 使用命令行运行XML文件 从命令行运行现有maven项目的XML文件 在这篇文章中,我们将使用命令行运行testng.xml。有多种场景需要使用命令行工具运行testng.xml。也许您已经创建了一个maven项目,现在想…...

MongoDB-数据库文档操作(2)
任务描述 文档数据在 MongoDB 中的查询和删除。 相关知识 本文将教你掌握: 查询文档命令;删除文档命令。 查询文档 我们先插入文档到集合 stu1 : document([{ name:张小华, sex:男, age:20, phone:12356986594, hobbies:[打篮球,踢足球…...
文件包含介绍
本地文件包含 常见的文件包含漏洞的形式为 <?php include("inc/" . $_GET[file]); ?> 考虑常用的几种包含方式为 同目录包含file.htaccess目录遍历?file…/…/…/…/…/…/…/…/…/var/lib/locate.db日志注入?file…/…/…/…/…/…/…/…/…/var/log/a…...

C语言——小细节和小知识9
一、大小端字节序 1、介绍 在计算机系统中,大小端(Endianness)是指多字节数据的存储和读取顺序。它是数据在内存中如何排列的问题,特别是与字节顺序相关。C语言中的数据存储大小端字节序指的是在内存中存储的多字节数据类型&…...
uni-app基础详解(组件、弹窗、数据缓存、页面跳转)
uni-app基础详解(组件、弹窗、数据缓存、页面跳转) uni-app组件scroll-viewswipertext 文本button 按钮input 输入框radio 单选checkbox 多选picker 选择器slider 滑块textarea 文本域 弹窗提示框 uni.showLoading提示弹窗 uni.showToast确定取消框 uni.…...

LabVIEW模拟荧光显微管滑动实验
LabVIEW模拟荧光显微管滑动实验 在现代生物医学研究中,对微观生物过程的精准模拟和观察至关重要。本案例展示了如何利用LabVIEW软件和专业硬件平台,创新地模拟荧光显微管在滑动实验中的动态行为,这一过程不仅提升了实验效率,还为…...
Springboot项目:解决@Async注解获取不到上下文信息问题
问题描述 springboot项目中,需要使用到异步调用某个方法,此时 第一个想到的就是 Async 注解,但是 发现 方法执行报错了,具体报错如下: java.lang.NullPointerExceptionat com.ruoyi.common.utils.ServletUtils.getRe…...

国内镜像:极速下载编译WebRTC源码(For Android/Linux/IOS)(二十四)
简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 优质专栏:多媒体系统工程师系列【原创干货持续更新中……】🚀 人生格言: 人生从来没有捷径,只…...
ThinkPHP为什么用PHP+Swoole协程模式部署运行
看很多ThinkPHP框架的程序商城等系统,现在都用PHPSwoole协程来运行。在说Swoole前我们先了解下传统PHP模式。 PHP-FPM 的对象常驻内存问题 互联网发展早期,大部分项目的业务逻辑并没有那么复杂,技术生态相对比较简单,也没有 Com…...

Vulnhub-tr0ll-1
一、信息收集 端口收集 PORT STATE SERVICE VERSION 21/tcp open ftp vsftpd 3.0.2 | ftp-anon: Anonymous FTP login allowed (FTP code 230) |_-rwxrwxrwx 1 1000 0 8068 Aug 09 2014 lol.pcap [NSE: writeable] | ftp-syst: | STAT: | FTP …...

服务器和电脑有啥区别?
服务器可以说是“高配的电脑”,两者都有CPU、硬盘、电源等基础硬件组成,但服务器和电脑也是有一定区别的,让小编带大家了解一下吧! #秋天生活图鉴# 1、稳定性需求不同:服务器是全年无休,需要高稳定性&…...

C语言——编译和链接
(图片由AI生成) 0.前言 C语言是最受欢迎的编程语言之一,以其接近硬件的能力和高效性而闻名。理解C语言的编译和链接过程对于深入了解其运行原理至关重要。本文将详细介绍C语言的翻译环境和运行环境,重点关注编译和链接的各个阶段…...

Kubernetes (K8S) 3 小时快速上手 + 实践
1. Kubernetes 简介 k8s即Kubernetes。其为google开发来被用于容器管理的开源应用程序,可帮助创建和管理应用程序的容器化。用一个的例子来描述:"当虚拟化容器Docker有太多要管理的时候,手动管理就会很麻烦,于是我们便可以通…...

如何画出优秀的系统架构图-架构师系列-学习总结
--- 后之视今,亦犹今之视昔! 目录 早期系统架构图 早期系统架构视图 41视图解读 41架构视图缺点 现代系统架构图的指导实践 业务架构 例子 使用场景 画图技巧 客户端架构、前端架构 例子 使用场景 画图技巧 系统架构 例子 定义 使用场…...
VR转接器:打破界限,畅享虚拟现实
你是否曾梦想过踏入另一个世界,体验那种仿佛置身其中的感觉?随着科技的飞速发展,虚拟现实(VR)已经成为了现实。而VR转接器,正是让你畅享虚拟现实的关键所在。 添加图片注释,不超过 140 字&…...

C++学习笔记——用C++实现树(区别于C)
树是一种非常重要的数据结构,它在计算机科学中的应用非常广泛。在本篇博客中,我们将介绍树的基本概念和C中如何实现树。 目录 一、树的基本概念 2.C中实现树 2.1创建一个树的实例,并向其添加节点 2.2三种遍历方式的实现代码 3.与C语言相…...

工业平板定制方案_基于联发科、紫光展锐平台的工业平板电脑方案
工业平板主板采用联发科MT6762平台方案,搭载Android 11.0操作系统, 主频最高2.0GHz,效能有大幅提升;采用12nm先进工艺,具有低功耗高性能的特点。 该工业平板主板搭载了IMG GE8320图形处理器,最高主频为680MHz, 支持108…...
JPA查询PostgreSQL行排序问题
文章目录 问题处理PostgreSQL排序相关JPA相关介绍 问题 我们项目使用Spring Boot构建,使用JHipster生成业务代码,包含基础的增删改查代码使用PostgreSQL作为业务数据库,使用自动生成的JPA构建数据更新语查询在查询某个实体类的列表时&#x…...
谷歌浏览器插件
项目中有时候会用到插件 sync-cookie-extension1.0.0:开发环境同步测试 cookie 至 localhost,便于本地请求服务携带 cookie 参考地址:https://juejin.cn/post/7139354571712757767 里面有源码下载下来,加在到扩展即可使用FeHelp…...
java 实现excel文件转pdf | 无水印 | 无限制
文章目录 目录 文章目录 前言 1.项目远程仓库配置 2.pom文件引入相关依赖 3.代码破解 二、Excel转PDF 1.代码实现 2.Aspose.License.xml 授权文件 总结 前言 java处理excel转pdf一直没找到什么好用的免费jar包工具,自己手写的难度,恐怕高级程序员花费一年的事件,也…...
Linux云原生安全:零信任架构与机密计算
Linux云原生安全:零信任架构与机密计算 构建坚不可摧的云原生防御体系 引言:云原生安全的范式革命 随着云原生技术的普及,安全边界正在从传统的网络边界向工作负载内部转移。Gartner预测,到2025年,零信任架构将成为超…...

CMake 从 GitHub 下载第三方库并使用
有时我们希望直接使用 GitHub 上的开源库,而不想手动下载、编译和安装。 可以利用 CMake 提供的 FetchContent 模块来实现自动下载、构建和链接第三方库。 FetchContent 命令官方文档✅ 示例代码 我们将以 fmt 这个流行的格式化库为例,演示如何: 使用 FetchContent 从 GitH…...
JDK 17 新特性
#JDK 17 新特性 /**************** 文本块 *****************/ python/scala中早就支持,不稀奇 String json “”" { “name”: “Java”, “version”: 17 } “”"; /**************** Switch 语句 -> 表达式 *****************/ 挺好的ÿ…...

多模态大语言模型arxiv论文略读(108)
CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文标题:CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文作者:Sayna Ebrahimi, Sercan O. Arik, Tejas Nama, Tomas Pfister ➡️ 研究机构: Google Cloud AI Re…...

如何理解 IP 数据报中的 TTL?
目录 前言理解 前言 面试灵魂一问:说说对 IP 数据报中 TTL 的理解?我们都知道,IP 数据报由首部和数据两部分组成,首部又分为两部分:固定部分和可变部分,共占 20 字节,而即将讨论的 TTL 就位于首…...
【碎碎念】宝可梦 Mesh GO : 基于MESH网络的口袋妖怪 宝可梦GO游戏自组网系统
目录 游戏说明《宝可梦 Mesh GO》 —— 局域宝可梦探索Pokmon GO 类游戏核心理念应用场景Mesh 特性 宝可梦玩法融合设计游戏构想要素1. 地图探索(基于物理空间 广播范围)2. 野生宝可梦生成与广播3. 对战系统4. 道具与通信5. 延伸玩法 安全性设计 技术选…...
智能AI电话机器人系统的识别能力现状与发展水平
一、引言 随着人工智能技术的飞速发展,AI电话机器人系统已经从简单的自动应答工具演变为具备复杂交互能力的智能助手。这类系统结合了语音识别、自然语言处理、情感计算和机器学习等多项前沿技术,在客户服务、营销推广、信息查询等领域发挥着越来越重要…...

CVE-2020-17519源码分析与漏洞复现(Flink 任意文件读取)
漏洞概览 漏洞名称:Apache Flink REST API 任意文件读取漏洞CVE编号:CVE-2020-17519CVSS评分:7.5影响版本:Apache Flink 1.11.0、1.11.1、1.11.2修复版本:≥ 1.11.3 或 ≥ 1.12.0漏洞类型:路径遍历&#x…...