Pytorch系列教程:可视化Pytorch模型训练过程

news2025/3/14 1:08:16

深度学习和理解训练过程中的学习和进步机制对于优化性能、诊断欠拟合或过拟合等问题至关重要。将训练过程可视化的过程为学习的动态提供了有价值的见解,使我们能够做出合理的决策。训练进度必须可视化的两种方法是:使用Matplotlib和Tensor Board。在本文中,我们将学习如何在Pytorch中可视化模型训练进度。

使用Matplotlib在PyTorch中可视化训练进度

Matplotlib是Python中广泛使用的绘图库,它为在Python中创建静态,动画和交互式可视化提供了灵活而强大的工具。它特别适合于创建出版质量的图表。
在这里插入图片描述

**步骤1:**导入必要的库并生成样本数据集

在这一步中,我们将导入必要的库并生成样本数据集。

import torch
import torch.nn as nn
import torch.optim as optim
import matplotlib.pyplot as plt
# Sample data
X = torch.randn(100, 1)  # Sample features
y = 3 * X + 2 + torch.randn(100, 1)  # Sample labels with noise

**步骤2:**定义模型

  1. PyTorch中的LinearRegression类定义了一个简单的线性回归模型。它继承自nn。模块的类,使其成为一个神经网络模型。
  2. 构造函数(__init__方法)初始化模型的结构,创建具有一个输入特征和一个输出特征的单一线性层(‘nn.Linear’)。
  3. 这个线性层被存储为名为 self.linear的属性。“forward”方法定义了如何通过这个线性层处理输入数据“x”以产生模型的输出。
  4. 具体来说,输入x是通过 self.linear,并返回结果输出。该方法封装了神经网络的前向传递计算,决定了模型如何将输入转换为输出。
# Define a simple linear regression model
class LinearRegression(nn.Module):
    def __init__(self):
        super(LinearRegression, self).__init__()
        self.linear = nn.Linear(1, 1)  # One input feature, one output

    def forward(self, x):
        return self.linear(x)

model = LinearRegression()

**步骤3:**定义损失函数、优化器和训练循环

在下面的代码中,我们将均方误差定义为损失函数,将随机梯度下降(SGD)优化器定义为优化器,该优化器通过使用学习率为0.01的计算梯度来修改模型的参数。

# Define loss function and optimizer
criterion = nn.MSELoss()
optimizer = optim.SGD(model.parameters(), lr=0.01)

这段代码运行了一个神经网络模型在多个时代的训练循环,使用梯度下降计算和优化损失。损失值被存储以进行绘图,进度每10次打印一次。

# Training loop
num_epochs = 100
losses = []
for epoch in range(num_epochs):
    # Forward pass
    outputs = model(X)
    loss = criterion(outputs, y)

    # Backward pass and optimization
    optimizer.zero_grad()
    loss.backward()
    optimizer.step()

    # Print progress
    if (epoch+1) % 10 == 0:
        print(f'Epoch [{epoch+1}/{num_epochs}], Loss: {loss.item():.4f}')

    # Store loss for plotting
    losses.append(loss.item())

**步骤4:**使用Matplotlib在PyTorch中可视化训练进度

使用下面的代码,我们可以使用matplotlib可视化训练损失曲线。

  • plot(损失)线根据epoch号绘制存储在损失列表中的损失值。
  • x轴表示历元数,y轴表示相应的损失值。
  • plt.xlabel(‘Epoch’), plt.ylabel(‘Loss‘)和plt.xlabel(’Epoch’).title()‘Training Loss’)行设置情节的标签和标题。
  • 最后,plot .show()显示该图,允许您可视化地分析损失如何在训练期间减少(或收敛)。
# Plot the loss curve
plt.plot(losses)
plt.xlabel('Epoch')
plt.ylabel('Loss')
plt.title('Training Loss')
plt.show()

通常,您会期望在损失曲线中看到下降的趋势,这表明模型正在随着时间的推移而学习和改进。

完整的代码:

import torch
import torch.nn as nn
import torch.optim as optim
import matplotlib.pyplot as plt

# Sample data
X = torch.randn(100, 1)  # Sample features
y = 3 * X + 2 + torch.randn(100, 1)  # Sample labels with noise

# Define a simple linear regression model
class LinearRegression(nn.Module):
    def __init__(self):
        super(LinearRegression, self).__init__()
        self.linear = nn.Linear(1, 1)  # One input feature, one output

    def forward(self, x):
        return self.linear(x)

model = LinearRegression()

# Define loss function and optimizer
criterion = nn.MSELoss()
optimizer = optim.SGD(model.parameters(), lr=0.01)

# Training loop
num_epochs = 100
losses = []
for epoch in range(num_epochs):
    # Forward pass
    outputs = model(X)
    loss = criterion(outputs, y)

    # Backward pass and optimization
    optimizer.zero_grad()
    loss.backward()
    optimizer.step()

    # Print progress
    if (epoch+1) % 10 == 0:
        print(f'Epoch [{epoch+1}/{num_epochs}], Loss: {loss.item():.4f}')

    # Store loss for plotting
    losses.append(loss.item())
    
# Plot the loss curve
plt.plot(losses)
plt.xlabel('Epoch')
plt.ylabel('Loss')
plt.title('Training Loss')
plt.show()
  

在这里插入图片描述

输出图显示了训练损失如何随时间变化,并根据迭代次数绘制。这种可视化使人们能够看到模型在训练时是如何减少损失的。此外,Matplotlib图还有其他东西,如轴标签、标题,可能还有标记或线条,表示特定事件,如最小实现损失或损失急剧下降。

使用TensorBoard可视化训练进度

为了在深度学习模型中可视化训练过程,我们可以使用torch.utils.tensorboard模块中的SummaryWriter类,该模块与TensorFlow开发的可视化工具TensorBoard无缝集成。
在这里插入图片描述

  • 集成:PyTorch在torch.utils.tensorboard模块中提供了一个SummaryWriter类,它与TensorBoard无缝集成以实现可视化。
  • 日志记录:在训练循环中,您可以使用SummaryWriter记录各种指标,如损失,准确性等,以实现可视化。
  • 可视化:TensorBoard提供了记录指标的交互式和实时可视化,允许您动态监控训练进度。
  • 监控:TensorBoard使您能够监控训练的多个方面,例如学习曲线,模型图和权重直方图,为优化您的模型提供见解。

使用以下命令安装TensorBoard库:

pip install tensorboard

步骤1:导入库

import torch
import torch.nn as nn
import torch.optim as optim
import torchvision
import torchvision.transforms as transforms
from torch.utils.data import DataLoader
from torch.utils.tensorboard import SummaryWriter

步骤2:定义简单的神经网络

让我们定义SimpleNN一个简单神经网络的类声明,它包含两个完全连接的层,以及定义网络前向传递的forward函数。

# Define a simple neural network
class SimpleNN(nn.Module):
    def __init__(self):
        super(SimpleNN, self).__init__()
        self.fc1 = nn.Linear(784, 128)
        self.fc2 = nn.Linear(128, 10)

    def forward(self, x):
        x = torch.flatten(x, 1)
        x = torch.relu(self.fc1(x))
        x = self.fc2(x)
        return x

步骤3:加载MNIST数据集

让我们加载用于训练的MINST数据,将其分成批次并使用一些预处理技术进行转换。

# Load a smaller subset of MNIST dataset
transform = transforms.Compose([
    transforms.ToTensor(),
    transforms.Normalize((0.5,), (0.5,))
])

train_dataset = torchvision.datasets.MNIST(root='./data', train=True, transform=transform, download=True)
small_train_dataset = torch.utils.data.Subset(train_dataset, range(1000))  # Subset of first 1000 samples
train_loader = DataLoader(small_train_dataset, batch_size=64, shuffle=True)

步骤4:初始化模型、损失函数和优化器

现在,初始化模型。与此同时,我们将使用交叉熵损失函数和adam优化器来更新模型参数。

# Initialize model, loss function, and optimizer
model = SimpleNN()
criterion = nn.CrossEntropyLoss()
optimizer = optim.Adam(model.parameters(), lr=0.001)

步骤5:初始化用于日志记录的SummaryWriter

SummaryWriter是导入模块的对象,用于编写要在TensorBoard中可视化的日志。

# Initialize SummaryWriter for logging
writer = SummaryWriter('logs_small')

第六步:循环训练

  • 训练循环:通过时代和批次,执行向前传递,计算损失,向后传递和更新模型参数。
  • 日志损失和准确性:记录划时代的训练损失和准确性。
# Training loop
epochs = 5
for epoch in range(epochs):
    running_loss = 0.0
    correct = 0
    total = 0

    for i, (inputs, labels) in enumerate(train_loader):
        optimizer.zero_grad()
        outputs = model(inputs)
        loss = criterion(outputs, labels)
        loss.backward()
        optimizer.step()

        running_loss += loss.item()

        # Calculate accuracy
        _, predicted = torch.max(outputs, 1)
        total += labels.size(0)
        correct += (predicted == labels).sum().item()

        # Log loss
        writer.add_scalar('Loss/train', loss.item(), epoch * len(train_loader) + i)

    # Log accuracy
    accuracy = 100 * correct / total
    writer.add_scalar('Accuracy/train', accuracy, epoch)

    print(f'Epoch [{epoch+1}/{epochs}], Loss: {running_loss / len(train_loader)}, Accuracy: {accuracy}%')

print('Finished Training')
writer.close()

完整代码:

import torch
import torch.nn as nn
import torch.optim as optim
import torchvision
import torchvision.transforms as transforms
from torch.utils.data import DataLoader
from torch.utils.tensorboard import SummaryWriter

# Define a simple neural network
class SimpleNN(nn.Module):
    def __init__(self):
        super(SimpleNN, self).__init__()
        self.fc1 = nn.Linear(784, 128)
        self.fc2 = nn.Linear(128, 10)

    def forward(self, x):
        x = torch.flatten(x, 1)
        x = torch.relu(self.fc1(x))
        x = self.fc2(x)
        return x
      
# Load a smaller subset of MNIST dataset
transform = transforms.Compose([
    transforms.ToTensor(),
    transforms.Normalize((0.5,), (0.5,))
])

train_dataset = torchvision.datasets.MNIST(root='./data', train=True, transform=transform, download=True)
small_train_dataset = torch.utils.data.Subset(train_dataset, range(1000))  # Subset of first 1000 samples
train_loader = DataLoader(small_train_dataset, batch_size=64, shuffle=True)

# Initialize model, loss function, and optimizer
model = SimpleNN()
criterion = nn.CrossEntropyLoss()
optimizer = optim.Adam(model.parameters(), lr=0.001)

# Initialize SummaryWriter for logging
writer = SummaryWriter('logs_small')


# Training loop
epochs = 5
for epoch in range(epochs):
    running_loss = 0.0
    correct = 0
    total = 0

    for i, (inputs, labels) in enumerate(train_loader):
        optimizer.zero_grad()
        outputs = model(inputs)
        loss = criterion(outputs, labels)
        loss.backward()
        optimizer.step()

        running_loss += loss.item()

        # Calculate accuracy
        _, predicted = torch.max(outputs, 1)
        total += labels.size(0)
        correct += (predicted == labels).sum().item()

        # Log loss
        writer.add_scalar('Loss/train', loss.item(), epoch * len(train_loader) + i)

    # Log accuracy
    accuracy = 100 * correct / total
    writer.add_scalar('Accuracy/train', accuracy, epoch)

    print(f'Epoch [{epoch+1}/{epochs}], Loss: {running_loss / len(train_loader)}, Accuracy: {accuracy}%')

print('Finished Training')
writer.close()

运行示例,输出如下:

Epoch [1/5], Loss: 1.8145772516727448, Accuracy: 47.1%
Epoch [2/5], Loss: 1.0121613591909409, Accuracy: 78.8%
Epoch [3/5], Loss: 0.6829517856240273, Accuracy: 84.1%
Epoch [4/5], Loss: 0.5442189555615187, Accuracy: 85.4%
Epoch [5/5], Loss: 0.46599634923040867, Accuracy: 87.0%
Finished Training

TensorBoard提供了一个基于web的仪表板,其中包含代表各种培训方面的选项卡和可视化。标量度量将损失或准确度等值可视化,为训练动态提供了不同的视角。此外,TensorBoard可以显示直方图、嵌入和基于日志信息的专门可视化。

在PyTorch中可视化训练进度

为了运行TensorBoard,你应该打开终端,然后运行tensorboard use命令:

tensorboard --logdir=./logs_small

注意,这里logdir指定上节示例的路径,采用相对路径表示。访问TensorBoard需要:打开浏览器,输入TensorBoard提供的网址(通常为http://localhost:6006/)。

a
b

TensorBoard提供了一个基于web的仪表板,其中包含代表各种培训方面的选项卡和可视化。标量度量将损失或准确度等值可视化,为训练动态提供了不同的视角。此外,TensorBoard可以显示直方图、嵌入和基于日志信息的专门可视化。

在这篇博客中,我们介绍了如何使用matplotlib和tensorboard来可视化深度学习框架的训练过程。

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

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

相关文章

electron+vue+webview内嵌网页并注入js

vue内嵌网页可以使用iframe实现内嵌网页,但是只能通过postMessage间接通信,在electron环境下,vue可以直接使用webview来内嵌网页,支持 executeJavaScript、postMessage、send 等丰富的通信机制。 使用 webview的优势 性能更佳&…

利用OpenResty拦截SQL注入

需求 客户的一个老项目被相关部门检测不安全,报告为sql注入。不想改代码,改项目,所以想到利用nginx去做一些数据校验拦截。也就是前端传一些用于sql注入的非法字符或者数据库的关键字这些,都给拦截掉,从而实现拦截sql…

CAD文件转换为STL

AutoCAD与STL格式简介 AutoCAD软件是由美国欧特克有限公司(Autodesk)出品的一款自动计算机辅助设计软件,可以用于绘制二维制图和基本三维设计,通过它无需懂得编程,即可自动制图,因此它在全球广泛使用&…

QT:串口上位机

创建工程 布局UI界面 设置名称 设置数据 设置波特率 波特率默认9600 设置数据位 数据位默认8 设置停止位 设置校验位 调整串口设置、接收设置、发送设置为Group Box 修改配置 QT core gui serialport 代码详解 mianwindow.h 首先在mianwindow.h当中定义一个串口指…

win32汇编环境,网络编程入门之二

;运行效果 ;win32汇编环境,网络编程入门之二 ;本教程在前一教程的基础上,研究一下如何得到服务器的返回的信息 ;正常的逻辑是连接上了,然后我发送什么,它返回什么,但是这有一个很尴尬的问题。 ;就是如何表现出来。因为网络可能有延…

【认识OpenThread协议】

OpenThread 是一种基于 IPv6 、IEEE 802.15.4 标准的低功耗无线 Mesh 网络协议,主要用于智能家居、物联网设备等场景。它的设计目标是实现设备之间的高效通信、低功耗运行和高可靠性。 OpenThread官方文档 ① 特性 低功耗: 适合电池供电的设备。 Mesh 网络: 支持多…

字节跳动 —— 建筑物组合(滑动窗口+溢出问题)

原题描述: 题目精炼: 给定N个建筑物的位置和一个距离D,选取3个建筑物作为埋伏点,找出所有可能的建筑物组合,使得每组中的建筑物之间的最大距离不超过D。最后,输出不同埋伏方案的数量并对99997867取模。 识…

开源数字人模型Heygem

一、Heygem是什么 Heygem 是硅基智能推出的开源数字人模型,专为 Windows 系统设计。基于先进的AI技术,仅需1秒视频或1张照片,能在30秒内完成数字人形象和声音克隆,在60秒内合成4K超高清视频。Heygem支持多语言输出、多表情动作&a…

Linux远程工具SecureCRT下载安装和使用

SecureCRT下载安装和使用 SecureCRT是一款功能强大的终端仿真软件,它支持SSH、Telnet等多种协议,可以连接和管理基于Unix和Windows的远程主机和网络设备。SecureCRT提供了语法高亮、多标签页管理、会话管理、脚本编辑等便捷功能,安全性高、操…

江科大51单片机笔记【15】直流电机驱动(PWM)

写在前言 此为博主自学江科大51单片机(B站)的笔记,方便后续重温知识 在后面的章节中,为了防止篇幅过长和易于查找,我把一个小节分成两部分来发,上章节主要是关于本节课的硬件介绍、电路图、原理图等理论…

【网络协议详解】——QOS技术(学习笔记)

目录 QoS简介 QoS产生的背景 QoS服务模型 基于DiffServ模型的QoS组成 MQC简介 MQC三要素 MQC配置流程 优先级映射配置(DiffServ域模式) 优先级映射概述 优先级映射原理描述 优先级映射 PHB行为 流量监管、流量整形和接口限速简介 流量监管 流量整形 接口限速…

Spring学习笔记:工厂模式与反射机制实现解耦

1.什么是Spring? spring是一个开源轻量级的java开发应用框架,可以简化企业级应用开发 轻量级 1.轻量级(对于运行环境没有额外要求) 2.代码移植性高(不需要实现额外接口) JavaEE的解决方案 Spring更像是一种解决方案,对于控制层,它有Spring…

pytest数据库测试文章推荐

参考链接: 第一部分:http://alextechrants.blogspot.fi/2013/08/unit-testing-sqlalchemy-apps.html第二部分:http://alextechrants.blogspot.fi/2014/01/unit-testing-sqlalchemy-apps-part-2.html

vue3 二次封装uni-ui中的组件,并且组件中有 v-model 的解决方法

在使用uniappvue3开发中&#xff0c; 使用了uni-ui的组件&#xff0c;但是我们也需要自定义组件&#xff0c;比如我要自定一个picker 的组件&#xff0c; 是在 uni-data-picker 组件的基础上进行封装的 父组件中的代码 <classesselect :selectclass"selectclass"…

探索高性能AI识别和边缘计算 | NVIDIA Jetson Orin Nano 8GB 开发套件的全面测评

随着边缘计算和人工智能技术的迅速发展&#xff0c;性能强大的嵌入式AI开发板成为开发者和企业关注的焦点。NVIDIA近期推出的Jetson Orin Nano 8GB开发套件&#xff0c;凭借其40 TOPS算力、高效的Ampere架构GPU以及出色的边缘AI能力&#xff0c;引起了广泛关注。本文将从配置性…

【学习笔记】《逆向工程核心原理》03.abex‘crackme-2、函数的调用约定、视频讲座-Tut.ReverseMe1

文章目录 abexcrackme-21. Visual Basic文件的特征1.1. VB专用引擎1.2. 本地代码与伪代码1.3. 事件处理程序1.4. 未文档化的结构体 2. 开始调试2.1. 间接调用2.2. RT_MainStruct结构体2.3. ThunRTMain()函数 3. 分析crackme3.1. 检索字符串3.2. 查找字符串地址3.3. 生成Serial的…

React基础之项目实战

规范的项目结构 安装scss npm install sass -D 安装Ant Design组件库 内置了一些常用的组件 npm install antd --save 路由基础配置 npm i react-router-dom 路由基本入口 import Layout from "../page/Layout"; import Login from "../page/Login"; impor…

SAP-ABAP:SAP数据库视图的创建图文详解

在SAP ABAP中&#xff0c;数据库视图&#xff08;Database View&#xff09;是通过ABAP字典&#xff08;ABAP Dictionary&#xff09;创建的。数据库视图是基于一个或多个数据库表的虚拟表&#xff0c;它允许你定义一种逻辑视图来访问数据。以下是创建数据库视图的步骤&#xf…

基于深度学习的肺炎X光影像自动诊断系统实现,真实操作案例分享,值得学习!

医疗影像智能化的技术演进 医学影像分析正经历从人工判读到AI辅助诊断的革命性转变。传统放射科医师分析胸部X光片需要8-12年专业训练&#xff0c;而基于深度学习的智能系统可在秒级完成检测。本文将以肺炎X光检测为切入点&#xff0c;详解从数据预处理到模型部署的全流程实现。…

Unity Shader学习总结

1.帧缓冲区和颜色缓冲区区别 用于存储每帧每个像素颜色信息的缓冲区 帧缓冲区包括&#xff1a;颜色缓冲区 深度缓冲区 模板缓冲区 自定义缓冲区 2.ImageEffectShader是什么 后处理用的shader模版 3.computerShader 独立于渲染管线之外&#xff0c;在显卡上运行&#xff0c;大量…