南充建设企业网站,群晖下搭建wordpress,行唐网站建设,阿里云网站建设怎么样知识点回顾#xff1a;
1. PyTorch和cuda的安装
2. 查看显卡信息的命令行命令#xff08;cmd中使用#xff09;
3. cuda的检查
4. 简单神经网络的流程
a. 数据预处理#xff08;归一化、转换成张量#xff09;
b. 模型的定义
i. 继承nn.Module类
ii. 定义…知识点回顾
1. PyTorch和cuda的安装
2. 查看显卡信息的命令行命令cmd中使用
3. cuda的检查
4. 简单神经网络的流程
a. 数据预处理归一化、转换成张量
b. 模型的定义
i. 继承nn.Module类
ii. 定义每一个层
iii. 定义前向传播流程
c. 定义损失函数和优化器
d. 定义训练流程
e. 可视化loss过程
预处理补充
注意事项
1. 分类任务中若标签是整数如 0/1/2 类别需转为long类型对应 PyTorch 的torch.long否则交叉熵损失函数会报错。
2. 回归任务中标签需转为float类型如torch.float32。
作业今日的代码要做到能够手敲。这已经是最简单最基础的版本了。
import torch
torch.cuda
# 仍然用4特征3分类的鸢尾花数据集作为我们今天的数据集
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
import numpy as np# 加载鸢尾花数据集
iris load_iris()
X iris.data # 特征数据
y iris.target # 标签数据
# 划分训练集和测试集
X_train, X_test, y_train, y_test train_test_split(X, y, test_size0.2, random_state42)# 打印下尺寸
print(X_train.shape)
print(y_train.shape)
print(X_test.shape)
print(y_test.shape)
# 归一化数据神经网络对于输入数据的尺寸敏感归一化是最常见的处理方式
from sklearn.preprocessing import MinMaxScaler
scaler MinMaxScaler()
X_train scaler.fit_transform(X_train)
X_test scaler.transform(X_test) #确保训练集和测试集是相同的缩放
# 将数据转换为 PyTorch 张量因为 PyTorch 使用张量进行训练
# y_train和y_test是整数所以需要转化为long类型如果是float32会输出1.0 0.0
X_train torch.FloatTensor(X_train)
y_train torch.LongTensor(y_train)
X_test torch.FloatTensor(X_test)
y_test torch.LongTensor(y_test)
import torch
import torch.nn as nn
import torch.optim as optim
class MLP(nn.Module): # 定义一个多层感知机MLP模型继承父类nn.Moduledef __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()
# 分类问题使用交叉熵损失函数
criterion nn.CrossEntropyLoss()# 使用随机梯度下降优化器
optimizer optim.SGD(model.parameters(), lr0.01)# # 使用自适应学习率的化器
# optimizer optim.Adam(model.parameters(), lr0.001)
# 训练模型
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模拟大的bitchsizeloss.backward() # 反向传播计算梯度optimizer.step() # 更新参数# 记录损失值losses.append(loss.item())# 打印训练信息if (epoch 1) % 100 0: # range是从0开始所以epoch1是从当前epoch开始每100个epoch打印一次print(fEpoch [{epoch1}/{num_epochs}], Loss: {loss.item():.4f})
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()
浙大疏锦行