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

相关推荐
大模型最新论文速读2 分钟前
在Text-to-SQL任务中应用过程奖励模型
数据库·人工智能·sql·深度学习·语言模型·自然语言处理
测试者家园6 分钟前
安装Python和配置开发环境
开发语言·软件测试·人工智能·python·职场和发展·零基础·质量效能
明明跟你说过17 分钟前
深入理解Embedding Models(嵌入模型):从原理到实战(下)
人工智能·语言模型·embedding
满怀101541 分钟前
【人工智能核心技术全景解读】从机器学习到深度学习实战
人工智能·python·深度学习·机器学习·tensorflow
Blossom.1181 小时前
探索边缘计算:赋能物联网的未来
开发语言·人工智能·深度学习·opencv·物联网·机器学习·边缘计算
-曾牛1 小时前
Spring AI 与 Hugging Face 深度集成:打造高效文本生成应用
java·人工智能·后端·spring·搜索引擎·springai·deepseek
modest —YBW1 小时前
Ollama+OpenWebUI+docker完整版部署,附带软件下载链接,配置+中文汉化+docker源,适合内网部署,可以局域网使用
人工智能·windows·docker·语言模型·llama
迪捷软件1 小时前
从概念表达到安全验证:智能驾驶功能迎来系统性规范
大数据·人工智能
非凡ghost1 小时前
透视相机:创意摄影新体验,解锁照片无限可能
人工智能·数码相机
weixin_307779132 小时前
使用FastAPI微服务在AWS EKS中构建上下文增强型AI问答系统
人工智能·python·云计算·fastapi·aws