自己造轮子:深度学习dataloader自己实现

2024-06-13 10:08

本文主要是介绍自己造轮子:深度学习dataloader自己实现,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

自己造轮子:深度学习dataloader自己实现

**摘要:**因为计算机性能的限制,所有的深度学习框架都是采用批量随机梯度下降,所以每次计算都要读取batch_size的数据。这里以自己实现的方式介绍深度学习框架实现批量读取数据的原理,不涉及具体细节和一些逻辑,只注重大体流程和原理。

总体流程:

  • 采用yield写一个生成器函数实现批量图片/标注信息的读取
  • 采用multiprocessing/threading加速文件读取
  • 时间对比

深度学习大体流程

for i in range(epoch):data, lable = dataloader.next(batch_size=16)         # 读取batch_size的数据output = model(data)            # 前向传播loss = crition(output, label)   # 求损失函数loss.backward()                 # 反向传播

在dataloader的时候,一般会采用多个进程(num_workers
)加快文件I/O的速度,避免网络反向传播过了,还没有数据。

1. 用yield写一个生成器函数

# coding:utf-8
# 自己造轮子,实现深度学习批量数据的读取
import os
import glob
import numpy as np 
import cv2  def get_images(path):files = []for ext in ['jpg', 'png', 'jpeg', 'JPG']:files.extend(glob.glob(os.path.join(path, '*.{}'.format(ext))))return filesdef dataset(batch_size=2, path='/media/chenjun/data/1_deeplearning/7_ammeter_data/test'):"""写一个读取图片的生成器batch_size:批量大小path:图片路径"""# 1. 读取所有图片名字image_list = get_images(path)index = np.arange(0, len(image_list))while True:np.random.shuffle(index)images = []image_names = []for i in index:try:im_name = image_list[i]im = cv2.imread(im_name)    # 读取图片# 读取相应图片的标注信息# text_polys = fun1()images.append(im[:,:, ::-1].astype(np.float32))     # cv2读取图片的顺序为BGR,转换成RGB格式image_names.append(im_name)if len(images) == batch_size:yield images, image_names        # 采用函数生成器,生成一个可迭代对象images = []image_names = []except Exception as e:import tracebacktraceback.print_exc()continue                # 所有图片已经读完一遍,跳出for循环,再打乱图片的顺序进行第二次读取

2. 使用muitlprocessing加速文件读取速度

<!-- 采用正常模式进行图片读取,读取100个batch -->
import time
mydataset = dataset()
start = time.time()
for _ in range(100):im, im_name = next(mydataset)
#     print(im_name)
print('use time:{}'.format(time.time() - start))
>>>  use time:0.16786599159240723<!-- 采用muitlprocessing模式进行图片读取,读取100个batch -->
import multiprocessing
def data_generator(data, q):for _ in range(100):                # 循环多少次generator_output = next(data)q.put(generator_output)q = multiprocessing.Queue()
start2 = time.time()
thread = multiprocessing.Process(target=data_generator, args=(dataset(), q))
thread.start()              # 多进程开始读取图片
print('mulprocess time is:{}'.format(time.time() - start2))
>>>  mulprocess time is:0.002292633056640625

可以看到读取100个batch,时间提高了80倍。
同时,一般的深度学习框架都会使用几个多进程处理上面的功能。
eg:

for _ in range(workers):if self._use_multiprocessing:# Reset random seed else all children processes# share the same seednp.random.seed(self.random_seed)thread = multiprocessing.Process(target=data_generator_task)

网上的资料显示threading的效率没有muitlprocessing高,这里就不测试了。

reference

[1] 莫烦python
[2] argman/EAST

这篇关于自己造轮子:深度学习dataloader自己实现的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


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

相关文章

C#代码实现解析WTGPS和BD数据

《C#代码实现解析WTGPS和BD数据》在现代的导航与定位应用中,准确解析GPS和北斗(BD)等卫星定位数据至关重要,本文将使用C#语言实现解析WTGPS和BD数据,需要的可以了解下... 目录一、代码结构概览1. 核心解析方法2. 位置信息解析3. 经纬度转换方法4. 日期和时间戳解析5. 辅助方法二、L

使用Python和Matplotlib实现可视化字体轮廓(从路径数据到矢量图形)

《使用Python和Matplotlib实现可视化字体轮廓(从路径数据到矢量图形)》字体设计和矢量图形处理是编程中一个有趣且实用的领域,通过Python的matplotlib库,我们可以轻松将字体轮廓... 目录背景知识字体轮廓的表示实现步骤1. 安装依赖库2. 准备数据3. 解析路径指令4. 绘制图形关键

C/C++中OpenCV 矩阵运算的实现

《C/C++中OpenCV矩阵运算的实现》本文主要介绍了C/C++中OpenCV矩阵运算的实现,包括基本算术运算(标量与矩阵)、矩阵乘法、转置、逆矩阵、行列式、迹、范数等操作,感兴趣的可以了解一下... 目录矩阵的创建与初始化创建矩阵访问矩阵元素基本的算术运算 ➕➖✖️➗矩阵与标量运算矩阵与矩阵运算 (逐元

C/C++的OpenCV 进行图像梯度提取的几种实现

《C/C++的OpenCV进行图像梯度提取的几种实现》本文主要介绍了C/C++的OpenCV进行图像梯度提取的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的... 目录预www.chinasem.cn备知识1. 图像加载与预处理2. Sobel 算子计算 X 和 Y

C/C++和OpenCV实现调用摄像头

《C/C++和OpenCV实现调用摄像头》本文主要介绍了C/C++和OpenCV实现调用摄像头,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录准备工作1. 打开摄像头2. 读取视频帧3. 显示视频帧4. 释放资源5. 获取和设置摄像头属性

c/c++的opencv图像金字塔缩放实现

《c/c++的opencv图像金字塔缩放实现》本文主要介绍了c/c++的opencv图像金字塔缩放实现,通过对原始图像进行连续的下采样或上采样操作,生成一系列不同分辨率的图像,具有一定的参考价值,感兴... 目录图像金字塔简介图像下采样 (cv::pyrDown)图像上采样 (cv::pyrUp)C++ O

c/c++的opencv实现图片膨胀

《c/c++的opencv实现图片膨胀》图像膨胀是形态学操作,通过结构元素扩张亮区填充孔洞、连接断开部分、加粗物体,OpenCV的cv::dilate函数实现该操作,本文就来介绍一下opencv图片... 目录什么是图像膨胀?结构元素 (KerChina编程nel)OpenCV 中的 cv::dilate() 函

Python使用FFmpeg实现高效音频格式转换工具

《Python使用FFmpeg实现高效音频格式转换工具》在数字音频处理领域,音频格式转换是一项基础但至关重要的功能,本文主要为大家介绍了Python如何使用FFmpeg实现强大功能的图形化音频转换工具... 目录概述功能详解软件效果展示主界面布局转换过程截图完成提示开发步骤详解1. 环境准备2. 项目功能结

SpringBoot使用ffmpeg实现视频压缩

《SpringBoot使用ffmpeg实现视频压缩》FFmpeg是一个开源的跨平台多媒体处理工具集,用于录制,转换,编辑和流式传输音频和视频,本文将使用ffmpeg实现视频压缩功能,有需要的可以参考... 目录核心功能1.格式转换2.编解码3.音视频处理4.流媒体支持5.滤镜(Filter)安装配置linu

在Spring Boot中实现HTTPS加密通信及常见问题排查

《在SpringBoot中实现HTTPS加密通信及常见问题排查》HTTPS是HTTP的安全版本,通过SSL/TLS协议为通讯提供加密、身份验证和数据完整性保护,下面通过本文给大家介绍在SpringB... 目录一、HTTPS核心原理1.加密流程概述2.加密技术组合二、证书体系详解1、证书类型对比2. 证书获