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

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

相关推荐
火山引擎和TA的超级拍档们2 分钟前
Seedance 平遥专场:AI 为动画人架起一座桥
人工智能
Industio_触觉智能7 分钟前
把NPU检测直接嵌进采集终端|RK3576 AI采集终端全链路拆解教程-上
人工智能·嵌入式硬件·硬件架构·硬件工程·智能硬件·npu·rk3576
tellmewhoisi8 分钟前
深度学习8:神经网络学习5:随机梯度下降法(基本概念,基本原理)
深度学习·神经网络·学习
专注仿真11 分钟前
多智能体强化学习实战:从 Dec-POMDP 到 QMIX/MADDPG/MAPPO 的可运行 PyTorch 实现
人工智能·pytorch·python
IT大白鼠2 小时前
彭大帅的AI运维助手——怎么给AI写运维SOP:提示词设计实战
运维·人工智能·彭大帅
xsd202411187 小时前
3D双目相机 vs 面阵激光雷达:机器人的“眼睛“到底怎么选?
人工智能
2601_965619698 小时前
把开源项目Changelog自动做成更新视频,AI工作流
人工智能·开源·音视频
Json____9 小时前
PHP 突发严重安全漏洞,AI 开始改变网络安全的攻防方式
人工智能·web安全·php·it学习·wwwoop.com
fxss9 小时前
我用AI给娃写了个拼音闯关大冒险
人工智能