在深度学习中训练模型的过程中读取图片数据,如果将图片数据全部读入内存是不现实的,所以有必要使用生成器来读取数据。

通过列表生成式,我们可以直接创建一个列表。但是,受到内存限制,列表容量肯定是有限的。而且,创建一个包含100万个元素的列表,不仅占用很大的存储空间,如果我们仅仅需要访问前面几个元素,那后面绝大多数元素占用的空间都白白浪费了。

所以,如果列表元素可以按照某种算法推算出来,那我们是否可以在循环的过程中不断推算出后续的元素呢?这样就不必创建完整的list,从而节省大量的空间。在Python中,这种一边循环一边计算的机制,称为生成器:generator。

创建generator有多种方法,第一种方法很简单,只要把一个列表生成式的[]改成(),就创建了一个generator:

>>> L = [x * x for x in range(10)]
>>> L
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
>>> g = (x * x for x in range(10))
>>> g
<generator object <genexpr> at 0x1022ef630>

list中的元素可以直接打印出来 ,generator要一个一个打印出来,可以通过next()函数获得generator的下一个返回值:

>>> next(g)
0
>>> next(g)
1
>>> next(g)
4
>>> next(g)
9
>>> next(g)
16

generator保存的是算法,每次调用next(g),就计算出g的下一个元素的值,直到计算到最后一个元素,没有更多的元素时,抛出StopIteration的错误。上面这种不断调用next(g)实在是太变态了,正确的方法是使用for循环,因为generator也是可迭代对象:

>>> g = (x * x for x in range(10))
>>> for n in g:
...     print(n)

著名的斐波拉契数列(Fibonacci),除第一个和第二个数外,任意一个数都可由前两个数相加得到:

1, 1, 2, 3, 5, 8, 13, 21, 34, ...

斐波拉契数列用列表生成式写不出来,但是,用函数把它打印出来却很容易:

def fib(max):n, a, b = 0, 0, 1while n < max:print(b)a, b = b, a + bn = n + 1return 'done'

仔细观察,可以看出,fib函数实际上是定义了斐波拉契数列的推算规则,可以从第一个元素开始,推算出后续任意的元素,这种逻辑其实非常类似generator。

也就是说,上面的函数和generator仅一步之遥。要把fib函数变成generator,只需要把print(b)改为yield b就可以了:

def fib(max):n, a, b = 0, 0, 1while n < max:yield ba, b = b, a + bn = n + 1return 'done'

这就是定义generator的另一种方法。如果一个函数定义中包含yield关键字,那么这个函数就不再是一个普通函数,而是一个generator:

>>> f = fib(6)
>>> f
<generator object fib at 0x104feaaa0>

这里,最难理解的就是generator和函数的执行流程不一样。函数是顺序执行,遇到return语句或者最后一行函数语句就返回。而变成generator的函数,在每次调用next()的时候执行,遇到yield语句返回,再次执行时从上次返回的yield语句处继续执行。

在循环过程中不断调用yield,就会不断中断。当然要给循环设置一个条件来退出循环,不然就会产生一个无限数列出来。

同样的,把函数改成generator后,我们基本上从来不会用next()来获取下一个返回值,而是直接使用for循环来迭代:

>>> for n in fib(6):
...     print(n)
...
1
1
2
3
5
8

最后在读取图片的实际应用中的代码如下:

def train_data(train_file,batch_size,resize_shape):datas, labels = read_data(train_file)num_batch = len(datas)//batch_sizefor i in range(num_batch):imgs = []train_datas = datas[batch_size*i:batch_size*(i+1)]train_lables = labels[batch_size*i:batch_size*(i+1)]for img_path in train_datas:img = cv2.imread(img_path)img = cv2.resize(img,resize_shape)img = img/255 #归一化处理imgs.append(img)yield np.array(imgs),np.array(train_lables)

参考:

廖雪峰 python编程

python生成器generator:深度学习读取batch图片相关推荐

  1. python调用c++深度学习模型生成的dll(传入图片,返回多个结果)

    这里主要通过python调用c++深度学习模型,传入图片,c++处理,并返回结果,python接收结果,这个过程的接口如何设计转换. python端代码接口 # 定义dll返回的结果类型,这里应该和c ...

  2. Python机器学习、深度学习库总结(内含大量示例,建议收藏)

    Python机器学习.深度学习库总结(内含大量示例,建议收藏) 前言 python常用机器学习及深度学习库介绍 总结与分类 python 常用机器学习及深度学习库总结 分类 更多 前言 目前,随着人工 ...

  3. Python机器学习、深度学习库总结

    Python机器学习.深度学习库总结(内含大量示例,建议收藏) 前言 python常用机器学习及深度学习库介绍 总结与分类 python 常用机器学习及深度学习库总结 分类 更多 前言 为了大家能够对 ...

  4. Python实现的深度学习技术在水文水质领域应用

    当前,深度学习作为人工智能的热门技术发展迅速,以其强大的非线性和不确定性处理能力在图像识别.语音识别.自然语言处理等领域取得了显著的成效.它是一种端到端的处理方法,在训练算法的指导下,深层神经网络自发 ...

  5. 浅析深度学习中Batch Size大小对训练过程的影响

    点击上方"视学算法",选择加"星标"或"置顶" 重磅干货,第一时间送达 作者丨陈志远@知乎(已授权) 来源丨https://zhuanlan ...

  6. 如何用 Python 进行基于深度学习的计算机视觉项目开发?

    令人惊喜的"智能"年代 深度学习有着广阔的前景 我们正处在一个"智能"的年代,比如智能手机中的语音助手.机器翻译和人脸识别:战胜过日本将棋冠军.国际象棋冠军, ...

  7. 深度学习中 Batch Size 对训练过程的影响

    作者 | 陈志远 编辑丨极市平台 之前面试过程中被问到过两个问题: (1)深度学习中batch size的大小对训练过程的影响是什么样的? (2)有些时候不可避免地要用超大batch,比如人脸识别,可 ...

  8. 30个顶级Python库 | 用于深度学习、自然语言处理和计算机视觉

    CDA数据分析师 出品 作者:Matthew Mayo 编译:Mika 今天我们来盘点一下有哪些用于深度学习.自然语言处理和计算机视觉的顶级Python库. 我们尽力将每个库按预期的使用情况进行归类, ...

  9. 用深度学习破解12306图片验证码,识别率超96%- web效果版

    12306最新版图片验证码已被破解已是公开的秘密.比如市面上那么专业多抢票软件,早就破解了这个图片验证码.     那他们到底是怎么实现的呢???     据本人猜测,应该都是基于近2年流行的深度学习 ...

最新文章

  1. 解决Android 插件化方法找不到 问题
  2. 学习HTML5之塔克大战(详细记录)
  3. [C++ STL] map使用详解
  4. HTML中href src区别,html中 href 和 src 的定义与区别
  5. 逻辑代数01律的理解_零基础学习计算机原理:布尔逻辑和逻辑门
  6. 排球计分程序重构(四)
  7. 2_Recurrent Neural Networks (RNNs)循环神经网络 —Simple RNNs
  8. 汇编dos系统调用(输入输出篇)
  9. EXCEL-批量下拉填充
  10. moTzxx-CMS —— [一个基于PHP代码的后台管理系统(ThinkPHP5.1.40)]
  11. 3-2-1 程序控制结构-while循环结构-多次求解一元二次方程?-while循环常见错误?
  12. 基于Ti Omap3x 分析v4l2架构
  13. 最新:亚马逊运营思路
  14. DavaV大屏装饰组件
  15. Caused by: java.lang.NumberFormatException: For input string: “?2130969371“
  16. 【新观点】孙悟空其实是太上老君炼的丹药变成的
  17. 如何在网站中安装51啦
  18. java 操作图片 叠加图片 覆盖
  19. 数据产品经理=数据+产品经理?
  20. PLL锁相环基本原理介绍

热门文章

  1. java选择排序百度_java选择排序
  2. Mybatis传入多参问题
  3. Ajax入门总结--jquery实现Ajax
  4. Caffe2:添加CUDA路径
  5. ProE常用曲线方程:Python Matplotlib 版本代码(蝴蝶曲线)
  6. RabbitMQ code=200, text=Goodbye比较萌新的问题大佬绕道,乌拉~!
  7. shell中的字符串操作
  8. 【云栖大会】探索云时代下的游戏开发模式
  9. GridView+ZedGraph【转】
  10. iOS图片编辑功能实现