Loading [MathJax]/jax/input/TeX/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >深度学习中超大规模数据集的处理

深度学习中超大规模数据集的处理

作者头像
云水木石
发布于 2019-07-02 06:52:05
发布于 2019-07-02 06:52:05
1.5K00
代码可运行
举报
运行总次数:0
代码可运行

机器学习项目中,如果使用的是比较小的数据集,数据集的处理上可以非常简单:加载每个单独的图像,对其进行预处理,然后输送给神经网络。但是,对于大规模数据集(例如ImageNet),我们需要创建一次只访问一部分数据集的数据生成器(比如mini batch),然后将小批量数据传递给网络。其实,这种方法在我们之前的示例中也有所涉及,在使用数据增强技术提升模型泛化能力一文中,我就介绍了通过数据增强技术批量扩充数据集,虽然那里并没有使用到超大规模的数据集。Keras提供的方法允许使用磁盘上的原始文件路径作为训练输入,而不必将整个数据集存储在内存中。

然而,这种方法的缺点也是很明显,非常低效。加载磁盘上的每个图像都需要I/O操作,学过计算机的同学都知道,I/O操作最耗时,这无疑会在整个训练管道中引入延迟。本来训练深度学习网络就够慢的,I/O瓶颈应尽可能避免。

HDF5

这个时候,该HDF5文件登场了。HDF是用于存储和分发科学数据的一种自我描述、多对象文件格式。HDF最早由美国国家超级计算应用中心NCSA开发,目前在非盈利组织HDF小组维护下继续发展。当前流行的版本是HDF5。HDF5拥有一系列的优异特性,使其特别适合进行大量科学数据的存储和操作,如它支持非常多的数据类型,灵活、通用、跨平台、可扩展、高效的I/O性能,支持几乎无限量(高达EB)的单文件存储等,详见其官方介绍:https://support.hdfgroup.org/HDF5/ 。

HDF5文件格式为何如此牛X?估计你也和我一样有强烈的好奇心。但是当我看到长达200页的spec,还是决定放弃深究其细节,毕竟我们需要聚焦到深度学习上。再说,python提供了hdf5库,让读写hdf5文件简单得如同读写普通文本文件。借助h5py模块,实现一个HDF5数据集读写类非常容易:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class HDF5DatasetWriter:
 def __init__(self, dims, output_path, data_key="images", buf_size=1000):
   # check to see if the output path exists, and if so, raise an exception
   if os.path.exists(output_path):
     raise ValueError("the supplied `output_path` already exists and cannot be overwritten.", output_path)   # open the HDF5 database for writing and create two datasets: one to store images/features
   # and another to store the class labels
   self.db = h5py.File(output_path, "w")
   self.data = self.db.create_dataset(data_key, dims, dtype="float")
   self.labels = self.db.create_dataset("labels", (dims[0],), dtype="int")   self.buf_size = buf_size
   self.buffer = {"data": [], "labels": []}
   self.idx = 0 def add(self, rows, labels):
   self.buffer["data"].extend(rows)
   self.buffer["labels"].extend(labels)   if len(self.buffer["data"]) >= self.buf_size:
     self.flush() def flush(self):
   i = self.idx + len(self.buffer["data"])
   self.data[self.idx:i] = self.buffer["data"]
   self.labels[self.idx:i] = self.buffer["labels"]
   self.idx = i
   self.buffer = {"data": [], "labels": []} def store_class_labels(self, class_labels):
   dt = h5py.special_dtype(vlen=str)
   labelset = self.db.create_dataset("label_names", (len(class_labels),), dtype=dt)
   labelset[:] = class_labels def close(self):
   if len(self.buffer["data"]) > 0:
     self.flush()   self.db.close()

其中主要用到的方法就是h5py.File和create_dataset,前一个方法生成HDF5文件,后一个方法创建数据集。

猫狗数据集

理论掌握再多,还是不如实例来得直接。对于个人开发者而言,收集超大规模数据集几乎是一个不可能完成的任务,幸运的是,由于互联网的开放性以及机器学习领域的共享精神,很多研究机构提供数据集公开下载。我们这里选用kaggle大赛使用的Kaggle: Dogs vs. Cats dataset。你可以前往 http://pyimg.co/xb5lb 下载,也可以在公众号平台对话框中回复”数据集“关键字,获取百度网盘下载链接。

请下载kaggle - dogs vs cats下的train.zip文件。下载train.zip文件后,解开压缩文件,你可以看到train目录下包含猫狗图片文件,从文件名可以推断出其所属的类别:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
kaggle_dogs_vs_cats/train/cat.11866.jpg
...
kaggle_dogs_vs_cats/train/dog.11046.jpg
构建数据集

由于Kaggle: Dogs vs. Cats dataset的类别包含在文件名中间,我们很容易写出如下代码提取类别标签:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
train_paths = list(paths.list_images(config.IMAGES_PATH))
train_labels = [p.split(os.path.sep)[-1].split(".")[0] for p in train_paths]

接下来划分数据集,学过吴恩达《机器学习》课程的同学可能知道,通常我们将数据集划分为 训练集、验证集和测试集 ,通常比例为6:2:2,但是对于大规模数据集来说,验证集和测试集分配20%,数量太大,也没有必要,这时通常给一个两千左右的固定值即可。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
split = train_test_split(train_paths, train_labels, test_size=config.NUM_TEST_IMAGES, stratify=train_labels,
                        random_state=42)
(train_paths, test_paths, train_labels, test_labels) = splitsplit = train_test_split(train_paths, train_labels, test_size=config.NUM_VAL_IMAGES, stratify=train_labels,
                        random_state=42)
(train_paths, val_paths, train_labels, val_labels) = split

接下来就是遍历图片文件,并分别为训练集、验证集和测试集生成HDF5文件。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
datasets = [
 ("train", train_paths, train_labels, config.TRAIN_HDF5),
 ("val", val_paths, val_labels, config.VAL_HDF5),
 ("test", test_paths, test_labels, config.TEST_HDF5)
]aap = AspectAwarePreprocessor(256, 256)
(R, G, B) = ([], [], [])for (dtype, paths, labels, output_path) in datasets:
 writer = HDF5DatasetWriter((len(paths), 256, 256, 3), output_path) # loop over the image paths
 for (i, (path, label)) in enumerate(zip(paths, labels)):
   image = cv2.imread(path)
   image = aap.preprocess(image)   if dtype == "train":
     (b, g, r) = cv2.mean(image)[:3]
     R.append(r)
     G.append(g)
     B.append(b)   writer.add([image], [label]) writer.close()

注意到,代码中累计了RGB均值,可以使用以下代码计算RGB均值:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
D = {"R": np.mean(R), "G": np.mean(G), "B": np.mean(B)}
f = open(config.DATASET_MEAN, "w")
f.write(json.dumps(D))
f.close()

为啥需要RGB均值呢?这就涉及到深度学习中的一个正则化技巧,在我们之前的代码中,都是RGB值除以255.0进行正则化,但实践表明,将RGB值减去均值,效果更好,所以在此计算RGB的均值。需要注意的是,正则化只针对训练数据集,目的是让训练出的模型具有更强的泛化能力。

构建数据集用时最长的是训练数据集,用时大约两分半,而验证集和测试集则比较快,大约20秒。这额外的3分钟时间是否值得花,在后面的文章中,我们将继续分析。

让我们看看最后生成的HDF5文件:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
-rw-rw-r-- 1 alex alex  3932182048 Feb 18 11:33 test.hdf5
-rw-rw-r-- 1 alex alex 31457442048 Feb 18 11:31 train.hdf5
-rw-rw-r-- 1 alex alex  3932182048 Feb 18 11:32 val.hdf5

是的,你没看错,train.hdf5高达30G,害得我不得不删掉硬盘上许多文件,才腾出这么多空间。

为什么这样,要知道原始的图像包train.zip文件才500多M?这是因为,JPEG和PNG等图像文件格式使用了数据压缩算法,以保持较小的图像文件大小。但是,在我们的处理中,将图像存储为原始NumPy阵列(即位图)。虽然这样大大增加了存储成本,但也有助于加快训练时间,因为不必浪费处理器时间解码图像。

在下一篇文章中,我将演示如何读取HDF5文件,进行猫狗识别模型训练。

以上实例均有完整的代码,点击阅读原文,跳转到我在github上建的示例代码。

另外,我在阅读《Deep Learning for Computer Vision with Python》这本书,在微信公众号后台回复“计算机视觉”关键字,可以免费下载这本书的电子版

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-02-20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 云水木石 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
深度学习入门数据集--2.fasion-mnist数据集
数据可以从git仓库上下载,https://github.com/zalandoresearch/fashion-mnist fasion-mnist 作为tensorflow分类教程数据,通过访问链接可以获得更多内容https://www.tensorflow.org/tutorials/keras/basic_classification
birdskyws
2019/03/06
1.8K0
kaggle 图像分类竞赛实战(一):数据集下载和清洗
本文集以 Kaggle 网站真实竞赛《dogs-vs-cats-redux-kernels-edition》为主线,讲解如何使用深度学习技术解决图像分类问题。本文作为文集第一篇,讲解图像数据集的下载和清洗。
我是一条小青蛇
2019/10/23
3.3K0
kaggle 图像分类竞赛实战(一):数据集下载和清洗
TensorFlow 2.0 - tf.data.Dataset 数据预处理 & 猫狗分类
项目及数据地址:https://www.kaggle.com/c/dogs-vs-cats-redux-kernels-edition/overview
Michael阿明
2021/02/19
2.4K0
TensorFlow 2.0 - tf.data.Dataset 数据预处理 & 猫狗分类
VGG16 训练猫狗数据集
准备数据应该是一件比较麻烦的过程,所以一般都去找那种公开的数据集。在网上找到的可以用于猫狗分类的数据集有 Kaggle 的 “Dogs vs. Cats”数据集,还有牛津大学提供的 Oxford-IIIT Pet 数据集,包含猫和狗的图片,都是非常适合做猫狗分类任务的公开数据集。
繁依Fanyi
2025/03/24
1070
TensorFlow 2.0 - TFRecord存储数据集、@tf.function图执行模式、tf.TensorArray、tf.config分配GPU
注意:@tf.function修饰的函数内,尽量只用 tf 的内置函数,变量只用 tensor、numpy 数组
Michael阿明
2021/02/19
8710
TensorFlow 2.0 - TFRecord存储数据集、@tf.function图执行模式、tf.TensorArray、tf.config分配GPU
机器学习分类,损失函数中为什么要用Log,机器学习的应用
​Loss 在使用似然函数最大化时,其形式是进行连乘,但是为了便于处理,一般会套上log,这样便可以将连乘转化为求和,求和形式更容易求偏导,应用到梯度下降中求最优解;
zhangjiqun
2024/12/14
1750
机器学习分类,损失函数中为什么要用Log,机器学习的应用
关于深度学习系列笔记十二(关于猫狗判断实验)
首先小小的庆祝一下自己的微信公众号订阅用户已达到100人了,是小小的虚荣心也是收获也是鞭策,希望自己砥砺前行,努力进步,做到更好。
python与大数据分析
2022/03/11
4880
关于深度学习系列笔记十二(关于猫狗判断实验)
Python 深度学习第二版(GPT 重译)(三)
您现在对 Keras 有了一些经验——您熟悉 Sequential 模型、Dense 层以及用于训练、评估和推断的内置 API——compile()、fit()、evaluate() 和 predict()。您甚至在第三章中学习了如何从 Layer 类继承以创建自定义层,以及如何使用 TensorFlow 的 GradientTape 实现逐步训练循环。
ApacheCN_飞龙
2024/03/21
3340
Python 深度学习第二版(GPT 重译)(三)
开源图书《Python完全自学教程》12.6机器学习案例12.6.2猫狗二分类
深度学习是机器学习的一个分支,目前常用的深度学习框架有 TensorFlow、PyTorch和飞桨等(飞桨,即 PaddlePaddle,全中文的官方文档,让学习者不为语言而担忧)。本小节中将以 PyTorch 演示一个经典的案例,让初学 Python 的读者对深度学习有感性地认识。所以,以下代码可不求甚解,只要能认识到所涉及到的基础知识并不陌生即可——除了 PyTorch 部分。
老齐
2022/12/09
7520
开源图书《Python完全自学教程》12.6机器学习案例12.6.2猫狗二分类
python h5文件读取_python读取整个txt文件
这篇文章是一个工具类,用来辅助医学图像分割实战 unet实现(二) 4、数据存储 这一小节的内容。
全栈程序员站长
2022/10/03
9100
h5 Python_python做h5网站
  HDF(Hierarchical Data Format层次数据格式)是一种设计用于存储和组织大量数据的文件格式,最开始由美国国家超算中心研发,后来由一个非盈利组织HDF Group支持。HDF支持多种商业及非商业的软件平台,包括MATLAB、Java、Python、R和Julia等等,现在也提供了Spark。其版本包括了HDF4和现在大量用的HDF5。h5是HDF5文件格式的后缀。h5文件对于存储大量数据而言拥有极大的优势,这里安利大家多使用h5文件来存储数据,既高逼格又高效率。
全栈程序员站长
2022/09/30
1.3K0
h5 Python_python做h5网站
Python深耕之图像深度学习必备工具包
因为研究方向的变动将本号更名为《R语言交流中心与Python深耕之路》,从R语言扩展到Python编程。今天给大家介绍下一个完整的深度学习模型的构建所需要的必备python模块。
一粒沙
2022/11/21
6530
Python深耕之图像深度学习必备工具包
caffe详解之工具篇
convert_imageset是将我们准备的数据集文件转换为caffe接口更快读取的LMDB或HDF5数据类型。
AI异构
2020/07/29
6260
caffe详解之工具篇
【TensorFlow2.x开发—基础】 模型保存、加载、使用
本文主要介绍在TensorFlow2 中使用Keras API保存整个模型,以及如果使用保存好的模型。保存整个模型时,有两种格式可以实现,分别是SaveModel和HDF5;在TF2.x中默认使用SavedModel格式。
一颗小树x
2021/05/15
4.6K0
【TensorFlow2.x开发—基础】 模型保存、加载、使用
深度学习实战-CNN猫狗识别
本文记录了第一个基于卷积神经网络在图像识别领域的应用:猫狗图像识别。主要内容包含:
皮大大
2023/08/23
7070
[Deep-Learning-with-Python]计算机视觉中的深度学习
卷积网络接收(image_height,image_width,image_channels)形状的张量作为输入(不包括batch size)。MNIST中,将图片转换成(28,28,1)形状,然后在第一层传递input_shape参数。 显示网络架构
用户1631856
2018/08/01
2.2K0
[Deep-Learning-with-Python]计算机视觉中的深度学习
使用PyTorch实现鸟类音频检测卷积网络模型
大约在一年前,在我高二的时候,我第一次听到这种音频深度学习的用例。事实上,鸟音频检测是我做深度学习和计算机科学的第一个项目。我参与了一个研究项目,在北阿拉斯加的郊区用纯粹的声音来探测鸟类的存在。跳入其中,鸟的音频检测出现了这样一个利基(有利可图的形式),在本文中,我将向您展示如何在BirdVox-70k数据集上使用一个简单的卷积神经网络(CNN)来实现这一点。
deephub
2020/07/14
1.6K0
深度学习(七)U-Net原理以及keras代码实现医学图像眼球血管分割
原文链接:https://www.cnblogs.com/DOMLX/p/9780786.html
徐飞机
2018/10/15
7.9K0
深度学习(七)U-Net原理以及keras代码实现医学图像眼球血管分割
从零开始学keras(七)之kaggle猫狗分类器
【导读】Keras是一个由Python编写的开源人工神经网络库,可以作为Tensorflow、和Theano的高阶应用程序接口,进行深度学习模型的设计、调试、评估、应用和可视化。本系列将教你如何从零开始学Keras,从搭建神经网络到项目实战,手把手教你精通Keras。相关内容参考《Python深度学习》这本书。
墨明棋妙27
2022/08/24
1.3K0
从零开始学keras(七)之kaggle猫狗分类器
如何为Keras中的深度学习模型建立Checkpoint
深度学习模式可能需要几个小时,几天甚至几周的时间来训练。 如果运行意外停止,你可能就白干了。 在这篇文章中,你将会发现在使用Keras库的Python训练过程中,如何检查你的深度学习模型。 让我们开始
AiTechYun
2018/03/02
14.9K0
如何为Keras中的深度学习模型建立Checkpoint
推荐阅读
相关推荐
深度学习入门数据集--2.fasion-mnist数据集
更多 >
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文