首页 > 其他分享 >深度学习中使用tqdm库

深度学习中使用tqdm库

时间:2024-03-17 11:56:32浏览次数:24  
标签:tqdm loss self 学习 深度 device import data

什么是tqdm?

tqdm是一个快速、可扩展的Python进度条,可以在Python长循环中添加一个进度提示信息,用户只需要封装任意的迭代器tqdm(iterator)。它可以帮助我们监测程序运行的进度,估计运行的时长,甚至可以协助debug。对于在长时间运行的任务中显示进度很有用,因为它可以让用户知道任务正在进行。

安装pip install tqdm

使用方法

1.传入可迭代对象

import time
from tqdm import *

for i in tqdm(range(1000)):
    time.sleep(0.01)    #进度条每0.01s前进一次,总时间为1000*0.01=10s

使用trange,trange(i)是 tqdm(range(i))的简单写法

import time
from tqdm import trange

for i in trange(1000):
    time.sleep(0.01)

2.为进度条设置描述

在for循环外部初始化tqdm,可以打印其他信息

import time
from tqdm import tqdm

pbar = tqdm(["a","b","c","d"])

for char in pbar:
    pbar.set_description("Processing %s" % char) # 设置描述
    time.sleep(1)  # 每个任务分配1s

# 结果如下
  0%|          | 0/4 [00:00<?, ?it/s]

Processing a:   0%|          | 0/4 [00:00<?, ?it/s]

Processing a:  25%|██▌       | 1/4 [00:01<00:03,  1.01s/it]

Processing b:  25%|██▌       | 1/4 [00:01<00:03,  1.01s/it]

Processing b:  50%|█████     | 2/4 [00:02<00:02,  1.01s/it]

Processing c:  50%|█████     | 2/4 [00:02<00:02,  1.01s/it]

Processing c:  75%|███████▌  | 3/4 [00:03<00:01,  1.01s/it]

Processing d:  75%|███████▌  | 3/4 [00:03<00:01,  1.01s/it]

Processing d: 100%|██████████| 4/4 [00:04<00:00,  1.01s/it]

3.tqdm的write方法

bar = trange(10)
for i in bar:
    time.sleep(0.1)
    if not (i % 3):
        tqdm.write("Done task %i" % i)
# 结果如下

Done task 0
0%|                                                                                           | 0/10 [00:10<?, ?it/s]
  0%|                                                                                           | 0/10 [00:00<?, ?it/s]
 10%|████████▎                                                                          | 1/10 [00:00<00:01,  8.77it/s]
 20%|████████████████▌                                                                  | 2/10 [00:00<00:00,  9.22it/s]


Done task 3


  0%|                                                                                           | 0/10 [00:10<?, ?it/s]
 30%|████████████████████████▉                                                          | 3/10 [00:00<00:01,  6.91it/s]
 40%|█████████████████████████████████▏                                                 | 4/10 [00:00<00:00,  9.17it/s]
 50%|█████████████████████████████████████████▌                                         | 5/10 [00:00<00:00,  9.28it/s]



Done task 6


  0%|                                                                                           | 0/10 [00:10<?, ?it/s]
 60%|█████████████████████████████████████████████████▊                                 | 6/10 [00:00<00:00,  7.97it/s]
 70%|██████████████████████████████████████████████████████████                         | 7/10 [00:00<00:00,  9.25it/s]
 80%|██████████████████████████████████████████████████████████████████▍                | 8/10 [00:00<00:00,  9.31it/s]





Done task 9


  0%|                                                                                           | 0/10 [00:11<?, ?it/s]
 90%|██████████████████████████████████████████████████████████████████████████▋        | 9/10 [00:01<00:00,  8.37it/s]
100%|██████████████████████████████████████████████████████████████████████████████████| 10/10 [00:01<00:00,  9.28it/s]

4.在深度学习中如何使用

下面是一段手写数字识别代码

(1)下载训练集数据集

import torch.cuda
from torch import nn    #导入神经网络模块
from torch.utils.data import DataLoader  #数据包管理工具
from torchvision import datasets    #数据处理工具,专门用于图像处理的包
from torchvision.transforms import ToTensor  #数据转换,张量

'''下载训练集数据集(包含训练图片和标签)'''
#datasets.MNIST来加载MNIST数据集作为训练数据集。
#root='data':指定数据集存储的根目录,可以根据需要进行更改。
#train=True:表示加载训练数据集
#download=True:如果数据集在指定路径中不存在,将自动从官方源下载并保存。
#transform=ToTensor():指定数据转换操作,将图像数据转换为PyTorch中的Tensor张量格式。
training_data = datasets.MNIST(
    root='data',
    train=True,
    download=True,
    transform=ToTensor(),  #张量
)     #对于pythorch库能够识别的数据一般是tensor张量

test_data = datasets.MNIST(
    root='data',
    train=False,
    download=True,
    transform=ToTensor()
)

创建数据DataLoader

train_dataloader = DataLoader(training_data,batch_size=64)  #64张图片为一个包
test_dataloader = DataLoader(test_data,batch_size=64)
for X,Y in train_dataloader:  #X表示打包好的每一个数据包
    print(f'Shape of X[N,C,H,W]:{X.shape}')
    print(f'Shape of Y:{Y.shape}{Y.dtype}')
    break
 
'''判断当前设备是否支持GPU,其中mps是苹果m系列芯片的GPU'''
device = 'cuda' if torch.cuda.is_available() else 'mps' if torch.backends.mps.is_available() else 'cpu'
print(f'Using  {device}  device')

补充:

bath_size:将数据集分成多份,每一份为bath_size个数据
优点:可以减少内存的使用,提高训练的速度
64: 表示批次大小(batch size),即该张量包含了64个样本。
1: 表示通道数(channel),在这里是灰度图像,所以通道数为1。
28: 表示图像的高度(height),即每个图像有28个像素点的高度。
28: 表示图像的宽度(width),即每个图像有28个像素点的宽度。

(2)创建神经网络模型

class NeuralNetwork(nn.Module):   #定义了一个名为 NeuralNetwork 的类,继承自 nn.Module 类,这是 PyTorch 中用于构建神经网络的基类。
    def __init__(self):
        super().__init__()      #调用父类(nn.Module)的构造函数,确保初始化神经网络的基类。
        self.flatten = nn.Flatten()     #创建一个展开对象 flatten,用于将输入的图像数据展平成一维向量
        self.hidden1 = nn.Linear(28*28,128)   #创建了第一个全连接层,输入大小为 28*28(即图像展开后的长度),输出大小为 128。
        self.hidden2 = nn.Linear(128,64)  #创建了第二个全连接层,输入大小为 128,输出大小为 64。
        self.hidden3 = nn.Linear(64,256)   # 创建了第三个全连接层,输入大小为 64,输出大小为 64。
        self.out = nn.Linear(256,10)       #创建了输出层,输入大小为 64,输出大小为 10,用于分类任务。
    def forward(self,x):     # 定义了模型的前向传播过程,指定了数据在网络中流动的路径和操作。
        x = self.flatten(x)   #将输入的图像数据 x 进行展平操作。
        x = self.hidden1(x)   #将展平后的数据 x 传入第一个全连接层 hidden1 进行线性变换和激活函数操作。
        x = torch.relu(x)   # 使用 ReLU (Rectified Linear Unit) 激活函数对 hidden1 层的输出进行非线性化
        x = self.hidden2(x)   # 将 hidden1 层的输出 x 传入第二个全连接层 hidden2 进行线性变换和激活函数操作。
        x = torch.sigmoid(x)
        x = self.hidden3(x)
        x = torch.relu(x)
        x = self.out(x)
        return x
model = NeuralNetwork().to(device)   # 创建一个神经网络模型的实例,将其移动到指定的设备上,

(3)模型训练和测试

# 定义训练函数,输入参数包括数据加载器,模型,损失函数和优化器
def train(dataloader,model,loss_fn,optimizer):
    model.train()  # 设定模型为训练模式

    batch_size_num = 1  # 初始化批次编号为1
    for x,y in dataloader:  # 遍历数据加载器,每次提供一批数据
        x,y = x.to(device),y.to(device)  # 将数据移到指定设备,例如GPU
        pred = model.forward(x)  # 通过模型计算预测结果
        loss = loss_fn(pred,y)  # 计算预测结果与实际结果的损失值
        optimizer.zero_grad()  # 清空优化器的梯度缓存
        loss.backward()  # 反向传播,计算梯度
        optimizer.step()  # 使用优化器更新模型参数

        loss_value = loss.item()  # 获取损失值的item,以便后续操作
        # 打印损失值和批次编号
        # print(f'loss:{loss_value:>7f}[num:{batch_size_num}]')
        batch_size_num += 1  # 批次编号加1,以便在每个批次后更新批次编号。

# 定义损失函数,这里使用交叉熵损失函数
loss_fn = nn.CrossEntropyLoss()
# 定义优化器,这里使用Adam优化器,学习率为0.0015
optimizer = torch.optim.Adam(model.parameters(),lr=0.0015)  #可以用Adam 最好的模型
# 调用训练函数进行模型训练
train(train_dataloader,model,loss_fn,optimizer)

# 定义测试函数,输入参数包括数据加载器,模型和损失函数
def test(dataloader,model,loss_fn):
    size = len(dataloader.dataset)  # 获取测试集的数量
    num_batches = len(dataloader)  # 获取数据加载器的批次数量
    model.eval()  # 设定模型为评估模式,关闭dropout等影响结果的因素
    test_loss,correct = 0,0  # 初始化测试损失和正确率
    with torch.no_grad():  # 关闭梯度计算,节省内存,因为这里不需要反向传播计算梯度
        for x,y in dataloader:  # 遍历数据加载器,每次提供一批数据用于测试
            x,y = x.to(device),y.to(device)  # 将数据移到指定设备,例如GPU
            pred = model.forward(x)  # 通过模型计算预测结果
            test_loss += loss_fn(pred,y).item()  # 计算预测结果与实际结果的损失值并累加到总损失中
            correct += (pred.argmax(1) == y).type(torch.float).sum().item()  # 计算预测正确的数量并累加到总数中
    test_loss /= num_batches  # 平均损失值,得到最终的测试损失
    correct /= size  # 平均正确率,得到最终的测试正确率
    return test_loss, correct  # 返回测试损失和正确率作为测试结果

(4)训练深度学习模型

# 定义训练的轮数,即迭代次数
epochs = 5

# 导入进度条模块,tqdm可以让我们在训练过程中看到每个epoch的进度
from tqdm import tqdm

# 循环进行指定轮数的训练
for epoch in range(epochs):
    # for data,targets in tqdm(train_loadr,leave=False) # 进度显示在一行
    for data,targets in tqdm(train_dataloader):
        # 将数据移动到指定设备,如果可能的话。例如,如果你使用GPU进行计算,这将会把数据移到GPU上。
        data = data.to(device=device)
        targets = targets.to(device=device)

        # 正向传播,模型对输入的数据进行计算,得到预测的结果
        scores = model(data)

        # 计算损失,这个损失是模型预测的结果与实际目标之间的差距
        loss = loss_fn(scores,targets)

        # 反向传播,根据损失计算出梯度,这个过程是在每个训练步骤中计算损失对模型参数的梯度
        optimizer.zero_grad()  # 清空之前的梯度缓存  
        loss.backward()  # 计算梯度  

        # 使用优化器更新模型参数,这个过程是根据前面计算的梯度来更新模型参数,实现下降学习。
        optimizer.step()  # 使用优化器更新模型参数

输出结果

image

Reference

【python第三方库】tqdm——超详细解读

标签:tqdm,loss,self,学习,深度,device,import,data
From: https://www.cnblogs.com/guanghui-hua/p/18078385

相关文章

  • 【洛谷 P8602】[蓝桥杯 2013 省 A] 大臣的旅费 题解(图论+深度优先搜索+树的直径+链式
    [蓝桥杯2013省A]大臣的旅费题目描述很久以前,T王国空前繁荣。为了更好地管理国家,王国修建了大量的快速路,用于连接首都和王国内的各大城市。为节省经费,T国的大臣们经过思考,制定了一套优秀的修建方案,使得任何一个大城市都能从首都直接或者通过其他大城市间接到达。同......
  • 时间序列预测的零样本学习是未来还是炒作:TimeGPT和TiDE的综合比较
    最近时间序列预测预测领域的最新进展受到了各个领域(包括文本、图像和语音)成功开发基础模型的影响,例如文本(如ChatGPT)、文本到图像(如Midjourney)和文本到语音(如ElevenLabs)。这些模型的广泛采用导致了像TimeGPT[1]这样的模型的出现,这些模型利用了类似于它们在文本、图像和语音方面获......
  • AI 学习时代:大语言模型领域的行业黑话和专业术语解析
    近年来,深度学习技术的快速发展带动了大语言模型在自然语言处理领域的广泛应用。在这个激动人心的领域里,我们常常会遇到一些行业黑话和专业术语。为了帮助大家更好地入门,让我们深入探讨一些关键概念,以及它们在大型语言模型开发中的作用。掌握这些术语可以帮助我们更好地理解、开发......
  • ros2学习之报错分析:
    CMakeGeneratestepfailed. Buildfilescannotberegeneratedcorrectly.gmake:***[Makefile:267:cmake_check_build_system]错误1---Failed  <<<village_wang[0.43s,exitedwithcode2]Summary:0packagesfinished[0.56s] 1packagefailed:v......
  • [IEEE TIV]基于transformer和深度学习的多层交通流预测模型
    目录简介创新点基于transformer的特征提取基于CNN与MFNN模型相结合的预测论文地址:论文简介利用交通数据准确预测未来某一时刻的交通流量,可以缓解交通拥堵等问题,对城市交通健康发展和经济发展具有重要作用。然而,目前的交通流量预测模型依赖于人的经验,只考虑了单一机......
  • 51单片机学习
    3.上面说了点亮一个Led灯,还有控制Led灯的闪烁,下面可以用一个比较笨的方法来做一个流水灯,思路就是先点亮第一个灯,然后点亮第二个,剩下的也是依次点亮,在每一个亮灭中间进行停顿,这样就能够形成所谓的流水灯效果了。代码如下#include<REGX52.H>#include<INTRINS.H>voidDelay500ms......
  • 算法学习笔记(46): 离散余弦变换(DCT)
    前置知识:离散傅里叶变换傅里叶变换在上文中更多的是OI中的理解以及应用。但是傅里叶变换奥秘还很多。回顾\(\omega_n\)在傅里叶变换中的定义:\(e^{i\frac{2\pi}n}\),存在\(\omega_n^n=1\)的性质。意味着离散傅里叶变换实际上是周期性的,这也变相的解释了为什么存在循环......
  • JavaScript学习 第三天
    一、数组(一)数组基本知识声明按顺序保存数据的数据类型<body><script>letarr=[1,2,'猪儿',true]</script></body>声明数组函数<body><script>letarr=newArray(1,2,'猪儿',true)</script></body>......
  • JavaScript学习 第一天
    一、什么是JavaScript(一)介绍是一种运行在浏览器的编程语言,进行人机交互(二)可以做什么可以做网页特效,表单验证,进行数据交互,还有服务端编程node.js(三)组成由ECMAScript和WebAPIs组成其中WebAPIs由DOM和BOM组成ECMAScript:js基础语法知识WebAPIs:DOM:操作文......
  • 动态代理和反射的基本学习
    今天在跟着视频学习的时候发现老师讲的知识点都只简单的了解过但是没有深入学习,导致在跟着视频敲代码的时候完全不知道自己是在写什么东西。所以决定先把基础补一补再继续跟老师做项目。打算先把自定义注解的编写和解析学好,想要学号这一块,又涉及到了Aop和java中反射的学习,那么话......