day 46 神经网络-简版
关于神经网络需要知道的:
1、梯度下降的思想
2、激活函数的作用
3、损失函数的作用
4、优化器
5、神经网络的概念我们后续完成深度学习项目中,主要使用的包为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 (如果conda无法安装jupyter就参考环境配置文档的pip安装方法)
pip insatll scikit-learn
然后对着下列教程安装pytorch```
深度学习主要是简单的并行计算,所以gpu优势更大,简单的计算cpu发挥不出来他的价值,我们之前说过显卡和cpu的区别:
1. cpu是1个博士生,能够完成复杂的计算,串行能力强。
2. gpu是100个小学生,能够完成简单的计算,人多计算的快。这里的gpu指的是英伟达的显卡,它支持cuda可以提高并行计算的能力。如果你是amd的显卡、苹果的电脑,那样就不需要安装cuda了,直接安装pytorch-gpu版本即可。cuda只支持nvidia的显卡。
[安装教程](https://blog.csdn.net/Little_Carter/article/details/135934842?ops_request_misc=%257B%2522request%255Fid%2522%253A%25226f4f98b061723def7702948a6b9272a7%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=6f4f98b061723def7702948a6b9272a7&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~top_positive~default-1-135934842-null-null.142^v101^pc_search_result_base9&utm_term=pytorch%E5%AE%89%E8%A3%85&spm=1018.2226.3001.4187)或者去b站随便搜个pytorch安装视频。
1. 怕麻烦直接安装cpu版本的pytorch,跑通了用云服务器版本的pytorch-gpu
2. gpu的pytorch还需要额外安装cuda cudnn组件import torch
torch.cudaimport torch
# 检查cuda 是否可用
if torch.cuda.is_available():print("CUDA is available")# 获取可用的cuda 设备数量device_count=torch.cuda.device_count()print(f"Available CUDA devices: {device_count}")# 获取当前使用的cuda设备索引current_device=torch.cuda.current_device()print(f"Current CUDA device: {current_device}")# 获取当前cuda设备的名称device_name=torch.cuda.get_device_name(current_device)print(f"Current CUDA device name: {device_name}")# 获取cuda 版本cuda_version=torch.version.cudaprint(f"CUDA version: {cuda_version}")
else:print("CUDA is not available")数据准备
# 仍用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_size=0.2,random_state=42)
# 打印下尺寸
print(X_train.shape)
print(X_test.shape)
print(y_train.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的张量
import torch
X_train=torch.tensor(X_train,dtype=torch.float32)
X_test=torch.tensor(X_test,dtype=torch.float32)
y_train=torch.tensor(y_train,dtype=torch.long)
y_test=torch.tensor(y_test,dtype=torch.long)
模型架构定义
定义一个简单的全链接神经网络模型,包含一个输入层、一个隐藏层和一个输出层。
定义层数+定义前向传播顺序
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)# 隐藏层到输出层# 输出层不需要激活函数,因为后面会用到交叉熵函数,交叉熵函数内部有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)# return x
模型训练(cpu版本)
定义损失函数和优化器
# 分类问题使用交叉熵损失函数
criterion=nn.CrossEntropyLoss()
# 使用随机梯度下降优化器
optimizer=torch.optim.SGD(model.parameters(),lr=0.01)
## 使用自适应学习率优化器
# optimizer=torch.optim.Adam(model.parameters(),lr=0.01)
开始循环训练
实际上在训练的时候,可以同时观察每个epoch 训练完后的训练集的表现:测试集的loss 和准确度
# 训练模型
num_epochs=20000
# 用于存储每个epoch的损失值
losses=[]
for epoch in range(num_epochs):# 前向传播outputs=model.forward(X_train)#outputs=model(X_train)loss=criterion(outputs,y_train)# 反向传播和优化optimizer.zero_grad()# 梯度清零,因为pytorch 会积累梯度,所以每次迭代需要清零,梯度累计是那种小的bitchsize 模拟大的bitchsizeloss.backward()# 反向传播计算梯度optimizer.step()# 更新参数# 记录损失值losses.append(loss.item())#打印训练信息if(epoch+1)%100==0:print(f"Epoch [{epoch+1}/{num_epochs}], Loss: {loss.item():.4f}")可视化结果
import matplotlib.pyplot as plt
# 可视化损失曲线
plt.plot(range(num_epochs),losses)
plt.xlabel('Epochs')
plt.ylabel('Loss')
plt.title('Training Loss')
plt.show()
@浙大疏锦行