7.3基础概念/文件、文件路径/batch_size,length,total/acc、loss计算/ect

news2024/11/23 12:05:50

一、

一些基础术语:
util是utility的缩写,意思为实用工具。一般用于描述和业务逻辑没有关系的数据处理分析工具。
logger :日志
meter : 记录表
使用下划线 _ 表示不需要的变量是一种常见的开发者的约定,(Python 解释器本身对下划线并没有特殊处理,它不会自动忽略赋值给下划线的值或在未使用的情况下跳过它。下划线只是一个普通的变量名,与其他变量名没有区别。)

二、

N = len(trainloader.dataset),其中trainloader.dataset表示数据加载器所加载的数据集对象。这将返回训练数据集中的样本数量。
每次从trainloader中获取的是一个批次(batch)的数据B = len(trainloader)返回的是trainloader中批次的数量,也就是数据集被分成了多少个批次。这个值可以用于迭代训练数据集,或者用于确定训练的总步数或迭代次数。
将N(全部数据集)分成B个batch,每次update(compute gradient & optimizer.step() )是update一个batch的参数量,所以这也就说明了为什么每个batch里面要先进行optimizer.zero_grad()
而一个epoch是指把全部的数据集过了一遍,称为一个epoch

三、

训练集、验证集、测试集的关系:
abbrtrain、val、test
(1) 训练集相当于课后的练习题,用于日常的知识巩固。
(2) 验证集相当于周考,用来纠正和强化学到的知识。
(3) 测试集相当于期末考试,用来最终评估学习效果。
大部分时候,没有验证集,为了让测试集有更好的表现,不从训练集中抽取20%作为验证集。
在这里插入图片描述

四、

model.eval()with torch.no_grad()的配合:
model.eval() 是一种模型状态转换操作,用于将模型切换到评估模式。在评估模式下,模型的行为可能会有所不同,例如,对于某些层(如 Dropout)来说,它们可能会被禁用或修改。评估模式下的模型通常更接近实际应用场景,并用于计算测试集上的指标。
with torch.no_grad() 是一个上下文管理器,用于在代码块中临时关闭梯度计算。在这个代码块内部,所有的操作都不会被跟踪,也不会计算梯度。这对于在测试阶段或者不需要进行反向传播的代码段非常有用,可以提高代码的执行效率。
with torch.no_grad() 控制梯度计算,model.eval() 控制模型的行为模式,二者常常一起使用以确保测试阶段的有效评估。

五、

文件读写f.close() & f.flush()

  • f.close() 关闭文件对象,执行一系列清理操作,使文件对象不再可用。一旦文件被关闭,无法再对其进行读取或写入操作。
  • f.flush() 刷新文件缓冲区,确保缓冲区中的数据被写入文件。文件对象仍然保持打开状态,可以继续对其进行读取或写入操作。

为了保险起见,建议在关闭文件对象之前手动调用 f.flush() 来刷新缓冲区,确保所有未写入的数据都被写入文件
通常情况下,在处理完文件操作后,应该调用 f.close() 来关闭文件,释放相关资源。而 f.flush() 则常用于在文件操作过程中手动刷新缓冲区,确保数据写入文件,特别是在需要保证数据实时写入的场景下。
虽然最后Python 解释器会在程序执行结束时自动关闭所有打开的文件对象。这是因为在程序退出时,Python 会清理和释放所有资源,包括打开的文件对象。但为了代码的可维护性和文件的完整性,建议在不再使用文件对象时显式地调用 f.close() 关闭文件。
或者,你也可以使用 with 语句来自动管理文件对象的关闭,它会在代码块执行完毕后自动关闭文件对象

with open('file.txt', 'r') as f:
    # 进行文件读取操作
    # 不需要手动关闭文件对象

六、文件& 文件路径操作

1、
如果想创建子目录,必须用参数-p,不然就会认为你的当前要创建的文件夹名字中有/
mkdir -p dir1/dir2/dir3
这将递归地创建 dir1、dir2 和 dir3 目录,无论它们是否已存在。

2、

if not os.path.exists(path) # 对于路径中的 /,它会被视为普通的字符,而不是路径的分隔符
	os.makedirs()
if not os.path.isdir(path) # 用这一套,会把 / 视为路径逐级创建文件夹
	os.makedirs()

使用 os.path.isdir() 函数来逐级检查路径中的目录。这样可以确保路径中的每个目录都存在,而不仅仅是最后一个目录或文件
os.makedirs 中,斜杠 / 不会被解释为文件夹名字的一部分。它只是用来表示目录结构的层次关系。

3、
下面两个的区别:

a = os.path.join(a, b) # 调用函数
a = a + b # 字符串拼接

二者效果一样,但推荐使用os.path.join因为它可以正确处理路径分隔符,以适应不同的操作系统。即,你不需要在乎是用\还是/,会根据你操作系统自动给你创建,

4、
“w”:会覆盖之前的文件
“a”:追加
二者在文件不存在的时候都会自动创建文件

with open(file_path, 'a') as file:
    if file.tell() != 0:
        file.write('\n')  # 写入空行
    file.write(data)  # 追加数据

file.tell() 方法用于获取当前文件指针的位置。如果文件指针位置为 0,表示文件为空

七、

几个参数:

  1. batch_size 你自己设置的一个batch的数量
  2. labels.size(0)等价于len(labels),它表示理想情况下一个批次中的样本数量。一个批次中的样本数量不一定等于batch_size,因为可能有整除不了的情况。
  3. total += labels.size(0) 这样获得的是精确的样本的数量
  4. len(trainloader)是一共有多少个batch
    第35 / 200(epoch)轮:选的batch_size=64,所以一个dataset划分为642(len(trainloader))个小的batch
    一个epoch下来要把整个dataset跑一遍,不过最小单位是batch
    在这里插入图片描述
total += labels.size(0)

用于累积所有批次中的样本数量。通过每个批次的样本数量相加,可以得到总样本数量。

八、

1、准确率计算

outputs = model(inputs)
_, predicted = torch.max(outputs.data, 1)
total += labels.size(0)
correct += predicted.eq(labels.data).cpu().sum()
# correct += (predicted == labels).sum()

outputs 是模型的输出,通常是一个张量,其形状为 [batch_size, num_classes],其中 batch_size 是当前批次的大小,num_classes 是分类的类别数。
torch.max(outputs.data, 1) 是一个函数调用,它对 outputs.data 张量沿着指定的维度进行最大值的计算第二个参数 1 表示沿着第二个维度(即列维度,即num_classes!)进行计算
返回:
第一个张量是最大值的张量,不需要使用,用 ‘_’ 忽略
第二个张量是最大值的索引张量,表示每个样本在输出类别上的最大值的索引。它是一个形状为 [batch_size] 的张量(一维张量same as labels,一共有bs个样本,就有bs个最大值),其中每个元素表示相应样本的预测类别
total += labels.size(0)total 的作用是跟踪训练过程中已处理的样本总数,用于(实时args.print_freq)计算训练准确率,它是根据每个批次中处理的样本数进行累加的,因此它不等于数据集的总样本数量。
correct += predicted.eq(labels.data).cpu().sum() 将预测结果与真实标签进行逐元素比较,返回一个布尔张量(最简单的一维数组,size:(batch_size,) ),其中相等的位置为 True,不相等的位置为 False。(将布尔张量转移到 CPU 上,因为默认情况下模型和数据可能在 GPU 上。)sum()计算布尔张量中 True 的数量,也就是预测正确的样本数量(scalar标量)。
最后,将预测正确的样本数量累加到 correct 中,以便在训练过程中跟踪正确的样本数量。
2、loss计算

loss = criterion(outputs, labels)
loss.backward()
sum_loss += loss.item()

平均损失的计算是基于每个批次的损失值

def train_one_epoch(args,model,epoch,trainloader,optimizer,criterion,f2):
    print('\nEpoch: %d' % (epoch + 1))
    model.train()
    sum_loss = 0.0
    correct = 0.0
    total = 0.0
    for i, (inputs, labels) in enumerate(tqdm(trainloader), 0): 
        # 1.准备数据
        length = len(trainloader)
        if args.cuda == True:
            inputs, labels = inputs.cuda(), labels.cuda()
        # 2.前向传播+计算损失
        outputs = model(inputs)
        loss = criterion(outputs, labels)
        # 3.清零梯度反向传播更新参数
        optimizer.zero_grad()
        loss.backward()
        optimizer.step()
        
        sum_loss += loss.item()

        _, predicted = torch.max(outputs.data, 1)
        total += labels.size(0)
        correct += predicted.eq(labels.data).cpu().sum()
        
        if i % args.print_freq == 0:
            f2.write('Epoch:[%03d][%03d/%03d] |Loss: %.03f | Acc: %.3f%%\n'
                    % (epoch + 1, i, length, sum_loss / (i + 1), 100. * correct / total))
        f2.flush()

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringBoot3 事件和监听器

1. 生命周期监听 场景:监听应用的 生命周期 1. 监听器-SpringApplicationRunListener 自定义SpringApplicationRunListener来监听事件; 编写SpringApplicationRunListener 实现类在 META-INF/spring.factories 中配置 org.springframework.boot.SpringA…

【数据挖掘】时间序列教程【八】

4.4 时间混淆 我们先考虑一个简单的线性回归模型, 哪里 和是具有平均值的高斯过程00和自协方差 .现在,在不失去一般性的情况下,让我们假设 而那瓦尔

【UGUI控件全面解析】 教程专栏目录贴

🎬【UGUI控件全面解析】 教程专栏目录贴🐱‍🏍UGUI系列内容介绍🎁文章内容结构介绍 💯总结 🎬 博客主页:https://xiaoy.blog.csdn.net 🎥 本文由 呆呆敲代码的小Y 原创,…

“金九银十”和秋招通过率达 95% 的 Java 面试要点集锦

前言 这才刚刚进入 7 月,我就看到了许多朋友在焦急的准备“金九银十”跳槽面试,甚至很多即将毕业的大学生都在备战秋招,对于学历还算优秀的大学生来说,这是一次离大厂最近的机会,毕竟是应届毕业生,不会对技…

Selenium Wire编辑header破解反爬机制和访问限制

一、selenium Wire介绍 介绍 Selenium Wire扩展了Selenium的Python绑定,使您能够访问浏览器发出的底层请求。您已使用Selenium相同的方式编写代码,但是您获得了额外的api,用于检查请求和响应,并动态地对它们进行更改。&#xff08…

oracle 基础1

目录 Oracle表空间-创建 Oracle表空间-删除 Oracle常用用户 Oracle常用角色 Oracle用户创建 Oracle常用数据类型 Oracle表创建 Oracle增删改查 Oracle表常见约束 0.oracle手动开启方式 1.Oracle 表空间-创建 plsql登录system用户 新建sql窗口 创建表空间 2.Oracle表…

化亿级海量于秒级瞬间:大表关联计算提速

5G 时代,意味着数据通信将会拥有更高的速率、更大的容量和更低的时延。随着数据量的爆发式增长,对海量数据存储和实时分析成为数据淘金者的刚需,数据量暴增导致数据间的关联分析也越来越频繁。如何快速对数据进行分析,并获取其中有…

Jmeter接口测试参数化详解

目录 前言: RandomString函数 CSVRead函数 CSV Data Set Config配置元件 前言: 在进行接口测试时,参数化是一项重要的技术,可以帮助测试人员有效地模拟不同的场景和数据,增加测试用例的覆盖范围。JMeter提供了多种…

2023 年 10 大前端发展趋势

新技术的出现和老技术的淘汰让前端开发者们需要不断地学习和更新知识。特别是在经济不好的情况下,是否掌握新的技术很大程度决定着你是否被淘汰。 虽然应用程序试图将网站替代,但前端 Web 开发业务仍在快速变化和增长,前端开发人员的功能并没…

Debezium系列之:支持数据库存储系统,把ddl信息存储到数据库表中

Debezium系列之:支持数据库存储系统,把ddl信息存储到数据库表中 一、需求背景二、实现的效果三、核心参数四、创建存储ddl表五、创建采集表六、完整配置七、提交connector八、插入数据九、查看ddl数据十、修改表结构十一、清空存储ddl表十二、总结和延展一、需求背景 目前deb…

基于transformer的人群计数论文汇总

文章目录 2022TransCrowd: weakly-supervised crowd counting with transformersAn End-to-End Transformer Model for Crowd Localization 参考 2022 TransCrowd: weakly-supervised crowd counting with transformers code: https://github.com/dk-liang/TransCrowd 摘要&a…

达梦数据库性能分析

目录 数据库常用性能分析方法... 3 一、服务器监控... 3 1、cpu监控... 3 2、内存... 3 3、swap内存... 3 4、磁盘... 4 5、网络监测... 4 二、数据库实例监控... 6 1、v$sessions. 6 2、慢sql、阻塞、锁... 7 3、内存监控... 10 4、monitor监控工具使用及开启sql日…

五年Java学习心路历程

五年Java学习心路历程 从大学毕业到工作的过程中,我度过了五年学习Java的岁月。从基础语法到各种细节技术再到分布式和微服务架构,经历了许多的挑战与成长。接下来,我将详细记录这段心路历程,与大家分享学习Java的经验与感悟。 …

Java基础---String str=new String(“tang“)创建了几个对象

目录 典型回答 常量池基本概念 字符串常量池的结构 再看字面量和运行时常量池 intern 还是创建了几个对象 intern的正确用法 典型回答 创建的对象数应该是1个或者2个如果常量池中存在,则直接new一个对象如果常量池不存在,则在常量池中创建一个对象…

KubeEdge官方示例运行成功_Counter Demo 计数器

运行KubeEdge官方示例_Counter Demo 计数器 KubeEdge Counter Demo 计数器是一个伪设备,用户无需任何额外的物理设备即可运行此演示。计数器在边缘侧运行,用户可以从云侧在 Web 中对其进行控制,也可以从云侧在 Web 中获得计数器值,原理图如下…

前端web入门-移动web-day10

(创作不易,感谢有你,你的支持,就是我前行的最大动力,如果看完对你有帮助,请留下您的足迹) 目录 移动Web基础 手机模拟器 屏幕分辨率 视口 二倍图 适配方案 rem 适配方案 rem 媒体查询 rem – …

使用java生成mvt切片的方法

如何使用java生成geoserver的矢量切片供前端(mapbox等)调用 目录新的想法Java能为切片做什么如何生成切片如何转换xyz数据如何查询如何输出mvt格式给前端前端如何调用 目录 好久没发博客了,每日或忙碌、或悠闲、或喜或悲、时怅时朗&#xff…

访问学者怎样准备申请推荐信

作为访问学者,申请推荐信是非常重要的一步,它能够在您的申请过程中增加信誉度和竞争力。一个优秀的推荐信可以更好地展现您的学术能力、研究潜力和个人品质。以下是知识人网小编整理的关于如何准备申请推荐信的建议: 1. 确定推荐人&#xff1…

阿里云OSS上传文件工具类

个人主页:金鳞踏雨 个人简介:大家好,我是金鳞,一个初出茅庐的Java小白 目前状况:22届普通本科毕业生,几经波折了,现在任职于一家国内大型知名日化公司,从事Java开发工作 我的博客&am…

20本期刊影响因子上涨,7月SCI/SSCI/AHCI/EI刊源表已更新!

2023年7月SCI/SSCI/AHCI/EI期刊目录更新 2023年6月28日发布的最新《期刊引证报告》中,我处合作期刊中,7月刊源表有20本期刊影响因子上涨,同时新增多本快刊! 重磅!2023年JCR正式发布(附影响因子名单下载&a…