Day33 MLP神经网络的训练

目录

一、PyTorch和cuda的安装

二、查看显卡信息的命令行命令(cmd中使用)

三、cuda的检查

四、简单神经网络的流程

1、数据预处理(归一化、转换成张量)

2、模型的定义

3、定义损失函数和优化器

4、定义训练流程

5、可视化loss过程


一、PyTorch和cuda的安装

后续完成深度学习项目中,主要使用的包为pytorch,所以需要安装,需要去配置一个新的环境。

未来在复现具体项目时候,新环境命名最好是python版本_pytorch版本_cuda版本,例如 py3.10_pytorch2.0_cuda12.2 ,因为复杂项目对运行环境有要求,所以需要安装对应版本的包。

目前主要不用这么严格,先创建一个命名为DL的新环境即可:

conda create -n DL python=3.8
conda env list 
conda activate DL
conda install jupyter 
pip insatll scikit-learn

pytorch安装:

安装教程:

【超详细教程】2024最新Pytorch安装教程(同时讲解安装CPU和GPU版本)-CSDN博客

pytorch相关版本(官网):

Previous PyTorch Versionshttps://pytorch.org/get-started/previous-versions/找到自己想要安装的版本,如:
pip install torch==1.13.1+cu117 torchvision==0.14.1+cu117 torchaudio==0.13.1 --extra-index-url https://download.pytorch.org/whl/cu117

深度学习主要是简单的并行计算,所以gpu优势更大,简单的计算cpu发挥不出来他的价值,显卡和cpu的区别:

  1. cpu是1个博士生,能够完成复杂的计算,串行能力强。
  2. gpu是100个小学生,能够完成简单的计算,人多计算的快。

这里的gpu指的是英伟达的显卡,它支持cuda可以提高并行计算的能力。

如果是amd的显卡、苹果的电脑,那样就不需要安装cuda了,直接安装pytorch-gpu版本即可。cuda只支持nvidia的显卡。

二、查看显卡信息的命令行命令(cmd中使用)

可以在电脑的cmd中输入nvidia-smi来查看下显卡信息

Day33 MLP神经网络的训练_第1张图片

其中最重要的2个信息,分别是:

  1. 显卡目前驱动下最高支持的cuda版本,12.7
  2. 显存大小,12288 MiB ÷ 1024 = 12

三、cuda的检查

import torch
torch.cuda
import torch

# 检查CUDA是否可用
if torch.cuda.is_available():
    print("CUDA可用!")
    # 获取可用的CUDA设备数量
    device_count = torch.cuda.device_count()
    print(f"可用的CUDA设备数量: {device_count}")
    # 获取当前使用的CUDA设备索引
    current_device = torch.cuda.current_device()
    print(f"当前使用的CUDA设备索引: {current_device}")
    # 获取当前CUDA设备的名称
    device_name = torch.cuda.get_device_name(current_device)
    print(f"当前CUDA设备的名称: {device_name}")
    # 获取CUDA版本
    cuda_version = torch.version.cuda
    print(f"CUDA版本: {cuda_version}")
else:
    print("CUDA不可用。")

这里的cuda版本是实际安装的cuda驱动的版本,需要小于显卡所支持的最高版本

上述这段代码,可以以后不断复用,检查是否有pytorch及cuda相关信息

四、简单神经网络的流程

1、数据预处理(归一化、转换成张量)

Day33 MLP神经网络的训练_第2张图片

Day33 MLP神经网络的训练_第3张图片

Day33 MLP神经网络的训练_第4张图片

2、模型的定义

定义一个简单的全连接神经网络模型,包含一个输入层、一个隐藏层和一个输出层。

定义层数+定义前向传播顺序。

import torch
import torch.nn as nn
import torch.optim as optim

a、继承nn.Module类

b、定义每一个层

c、定义前向传播流程

class MLP(nn.Module): # 定义一个多层感知机(MLP)模型,继承父类nn.Module
    def __init__(self): # 初始化函数
        super(MLP, self).__init__() # 调用父类的初始化函数
 # 前三行是八股文,后面的是自定义的

        self.fc1 = nn.Linear(4, 10)  # 输入层到隐藏层
        self.relu = nn.ReLU()
        self.fc2 = nn.Linear(10, 3)  # 隐藏层到输出层
# 输出层不需要激活函数,因为后面会用到交叉熵函数cross_entropy,交叉熵函数内部有softmax函数,会把输出转化为概率

    def forward(self, x):
        out = self.fc1(x)
        out = self.relu(out)
        out = self.fc2(out)
        return out

# 实例化模型
model = MLP()

其实模型层的写法有很多,relu也可以不写,在后面前向传播的时候计算下即可,因为relu其实不算一个层,只是个计算而已。

  # def forward(self,x): #前向传播
    #     x=torch.relu(self.fc1(x)) #激活函数
    #     x=self.fc2(x) #输出层不需要激活函数,因为后面会用到交叉熵函数cross_entropy
    #     return x

3、定义损失函数和优化器

# 分类问题使用交叉熵损失函数
criterion = nn.CrossEntropyLoss()

# 使用随机梯度下降优化器
optimizer = optim.SGD(model.parameters(), lr=0.01)

# # 使用自适应学习率的化器
# optimizer = optim.Adam(model.parameters(), lr=0.001)

4、定义训练流程

实际上在训练的时候,可以同时观察每个epoch训练完后测试集的表现:测试集的loss和准确度

# 训练模型
num_epochs = 20000 # 训练的轮数

# 用于存储每个 epoch 的损失值
losses = []

for epoch in range(num_epochs): # range是从0开始,所以epoch是从0开始
    # 前向传播
    outputs = model.forward(X_train)   # 显式调用forward函数
    # outputs = model(X_train)  # 常见写法隐式调用forward函数,其实是用了model类的__call__方法
    loss = criterion(outputs, y_train) # output是模型预测值,y_train是真实标签

    # 反向传播和优化
    optimizer.zero_grad() #梯度清零,因为PyTorch会累积梯度,所以每次迭代需要清零,梯度累计是那种小的bitchsize模拟大的bitchsize
    loss.backward() # 反向传播计算梯度
    optimizer.step() # 更新参数

    # 记录损失值
    losses.append(loss.item())

    # 打印训练信息
    if (epoch + 1) % 100 == 0: # range是从0开始,所以epoch+1是从当前epoch开始,每100个epoch打印一次
        print(f'Epoch [{epoch+1}/{num_epochs}], Loss: {loss.item():.4f}')

Day33 MLP神经网络的训练_第5张图片

如果重新运行上面这段训练循环,模型参数、优化器状态和梯度会继续保留,导致训练结果叠加,模型参数和优化器状态(如动量、学习率等)不会被重置。这会导致训练从之前的状态继续,而不是从头开始

5、可视化loss过程

import matplotlib.pyplot as plt
# 可视化损失曲线
plt.plot(range(num_epochs), losses)
plt.xlabel('Epoch')
plt.ylabel('Loss')
plt.title('Training Loss over Epochs')
plt.show()

Day33 MLP神经网络的训练_第6张图片

@浙大疏锦行

你可能感兴趣的:(python打卡,神经网络,人工智能,深度学习,python)