深度学习中的yield

以下为例:

复制代码
def data_iter(batch_size, features, labels):
    num_examples = len(features)
    indices = list(range(num_examples))
    # 这些样本是随机读取的,没有特定的顺序
    random.shuffle(indices)
    for i in range(0, num_examples, batch_size):
        batch_indices = torch.tensor(
            indices[i: min(i + batch_size, num_examples)])
        yield features[batch_indices], labels[batch_indices]

在 Python 中,yield是一个关键字,使用yield的函数是一个生成器函数

生成器函数的基本概念

  • 普通函数在执行时,遇到return语句就会终止函数执行,并返回相应的值。而生成器函数在执行过程中,遇到yield语句时,会暂停函数的执行,保存当前的执行状态(包括局部变量的值等),并返回yield后面表达式的值(如果有的话)。当下一次通过某种方式(比如在循环中迭代这个生成器)来请求生成器继续执行时,函数会从上次暂停的地方(也就是yield语句处)继续往下执行,直到再次遇到yield语句或者函数执行完毕(如果没有更多的yield语句了)。

data_iter 函数中的具体作用

  • data_iter 函数里,目的是将给定的数据集(featureslabels)按照指定的 batch_size 划分成一个个小批次(batch)数据来方便后续的批量训练等操作。
  • 当循环执行到 yield features[batch_indices], labels[batch_indices] 这一行时:
    • 首先,它会基于当前批次对应的索引(batch_indices)从总的特征数据 features 和标签数据 labels 中取出相应的批次数据。
    • 然后,将取出的该批次的特征数据和标签数据作为一个元组返回,这个返回值可以被外部代码获取到(比如在循环中迭代这个生成器来依次获取每个批次的数据)。
    • 执行完这次 yield 后,函数就暂停在这里了,等到下一次继续迭代这个生成器(比如下一次循环到这里来获取下一个批次的数据),函数会接着从这个 yield 语句之后继续执行,重新去处理下一组索引范围,取出下一个批次的数据并返回,如此反复,直到整个数据集的样本都被划分成批次并返回完。

总的来说,yielddata_iter 函数变成了一个生成器,能方便地按批次逐个生成数据,避免一次性把所有数据都处理好放入内存,节省内存空间并且符合按批次处理数据的常见深度学习训练流程需求。

相关推荐
简简单单做算法26 分钟前
基于mediapipe深度学习的虚拟画板系统python源码
人工智能·python·深度学习·mediapipe·虚拟画板
qq_3140098328 分钟前
Windows+VSCode搭建小智(xiaozhi)开发环境
ide·人工智能·vscode·编辑器·开源软件
技术便签39 分钟前
第一篇:揭示模型上下文协议(MCP):AI的通用连接器
人工智能·ai编程·language model·多智能体·智能体
AI视觉网奇40 分钟前
opencv 可视化函数
人工智能·opencv·计算机视觉
zstar-_2 小时前
【Ragflow】24.Ragflow-plus开发日志:增加分词逻辑,修复关键词检索失效问题
人工智能·python·llm
love530love2 小时前
【笔记】2025 年 Windows 系统下 abu 量化交易库部署与适配指南
大数据·运维·人工智能·windows·笔记·python·conda
love530love2 小时前
【笔记】为 Python 项目安装图像处理与科学计算依赖(MINGW64 环境)
开发语言·图像处理·人工智能·windows·笔记·python·numpy
YYXZZ。。2 小时前
PyTorch-Transforms的使用(二)
人工智能·pytorch·python
东临碣石823 小时前
【AI论文】推理语言模型的强化学习熵机制
人工智能·语言模型·自然语言处理
老兵发新帖3 小时前
BiliNote部署实践
人工智能