Step1 实验室的服务器配置
参考: 1.服务器环境配置(Anaconda+pytorch)_是皮卡丘奥-CSDN博客_服务器配置anaconda
2.【Pytorch】在实验室linux系统服务器上搭建自己的pytorch-gpu环境过程详解!
一:下载软件:ZeroTier One 和MobaXterm
ZeroTier One会有一个node id(自动生成的)
node id记得给服务器管理员,然后他会给你账号和密码(默认:账号是名字,密码是123456)
然后加入上图中第四行的 3efa5巴拉巴拉.....
二:打开 MobaXterm
点击左上角的Session,选择SSH,输入服务器(192.168巴拉巴拉.....)还有自己的账号(可以先点击那个小正方框),点击ok就可以重新设定密码(第一次使用时会有)并使用服务器了
(在这步可能会出现许多问题,可以尝试1关闭电脑的防火墙 2 ZeroTier One中加入网络Join Network把所有的权限都打开,我当时遇到的问题是3实验室服务器崩溃了,过了一天就好了)
三.安装pytorch
首先,先在服务器上安装anaconda(linux)版本,这个可以去官网 找一下
一般来讲下载64-Bit(x86)那个就行,具体还是看服务器的要求(还有另一种直接在MobaXterm直接下载,亲测网速太慢),下载好的文件拖动到MobaXterm中(见下图,我直接放在目录里了,也建议放在目录里)
继续:
bash Anaconda3-2021.05-Linux-x86_64.sh
然后一路enter,然后输入yes
会提示你安装在哪个文件夹,可以自由发挥(最好新建一个文件夹,文件实在太多了,显得美观)例如:/home/ff/anaconda_anzhuang(看一下自己的文件路径,名字和我的是不一样的)
接着输入
vim ~/.bashrc
然后在文件中按 i 进入编辑
在最后一行添加
export PATH="/home/ff/anaconda_anzhuang/bin:$PATH"
然后按Esc退出
然后输入:w保存文件
然后输入 :q!退出文件(注意此处的路径,一定要和你自己一样)
依次输入以下:
source ~/.bashrc
然后输入以下,进入base
source activate
然后输入进行安装pytorch
conda create -n pytorch python=3.7
然后:
conda activate pytorch
就进入了pytorch环境
接下来可以安装一些包,自由发挥吧
刚运行了一个程序说没有torch 就去下了一个
先来个清华源
pip3 install torch torchvision -i https://pypi.tuna.tsinghua.edu.cn/simple/
然后又用到了matplotlib,所以
apt install python3-pip
pip3 install numpy
pip3 install scipy
pip3 install matplotlib
结束!下次再重新打开的时候运行 补充 中的3和4就可以正常使用pytorch了!
补充:
1. nvidia-smi 查看所有服务器
2.CUDA_VISIBLE_DEVICES=(此处是服务器代号) python (此处是程序名).py
例:CUDA_VISIBLE_DEVICES=0 python Shixun_week6.py
3.source activate进入base
4.conda activate pytorch 进入pytorch
注:进入pytorch才可以运行pytorch程序
5.cd (目录名):进入目录
例:
Step2 图像分类——cifar-10数据集
是一个很经典的案例,10个类6万张图片,5万张训练集和1万张测试集。代码是彩色的32*32大小。设计的其中代码如下
import torch
import torchvision #transforms 定义了一系列数据转化形式,并对数据进行处理
import torchvision.transforms as transforms
import torch.nn as nn
import torch.nn.functional as F
import numpy as np
import matplotlib.pyplot as plt
import torch.optim as optim
#一、数据导入:
#定义归一化方法:
transform=transforms.Compose(
[transforms.ToTensor(), #传入数据转化成张量形式
transforms.Normalize((0.5,0.5,0.5),(0.5,0.5,0.5)) #定义归一化方法
]
)
#训练数据集:
trainset=torchvision.datasets.CIFAR10(root='./data',train=True,download=True,transform=transform)
trainloader=torch.utils.data.DataLoader(trainset,batch_size=4,shuffle=False,num_workers=0)
#测试数据集:
testset=torchvision.datasets.CIFAR10(root='./data',train=False,download=True,transform=transform)
testloader=torch.utils.data.DataLoader(testset,batch_size=4,shuffle=False,num_workers=0)
classes = ('plane', 'car', 'bird', 'cat','deer', 'dog', 'frog', 'horse', 'ship', 'truck')
# 二、定义神经网络Net类:
class Net(nn.Module):
# 定义神经网络结构 1x32x32
def __init__(self):
# super()调用下一个父类,并返回父类实例的一个方法
super(Net, self).__init__()
#两个卷积层,三个全连接层
# 第一层:卷积层
self.conv1 = nn.Conv2d(3, 6, 3) # 输入频道:1 输出频道:6 3x3卷积核
# 第二层:卷积层 #上一层的输出频道是下一层的输入频道
self.conv2 = nn.Conv2d(6, 16, 3) # 输入频道:6 输出频道:16 3x3卷积核
# 第三层:全连接层 28:32-2-2
self.fc1 = nn.Linear(16 * 28 * 28, 512) # 输入维度:16x28x28 输出维度:512
# 第四层:全连接层
self.fc2 = nn.Linear(512, 64) # 输入维度:512 输出维度:64
# 第五层:全连接层
self.fc3 = nn.Linear(64, 10) # 输入维度:64 输出维度:10 输出10代表着0~9的不同分值
# 定义神经网络数据流向: 池化的代码F.max_pool2d写在这里(这里不用)
def forward(self, x):
# 第一层卷积层:
x = self.conv1(x)
x = F.relu(x) # 激活
# 传递到第二层卷积层:
x = self.conv2(x)
x = F.relu(x) # 激活
# 传递到第三层全连接层:
x = x.view(-1, 16 * 28 * 28) # 改变x的形状 用-1以动态调整
x = self.fc1(x)
x = F.relu(x)
# 传递到第四层全连接层:
x = self.fc2(x)
x = F.relu(x)
# 传递到第五层全连接层:
x = self.fc3(x)
return x
net = Net()
#三、定义损失函数和优化器:
criterion=nn.CrossEntropyLoss()
optimizer=optim.SGD(net.parameters(),lr=0.001,momentum=0.9) #使用的是SGD
#四、训练神经网络:
for epoch in range(2):
for i, data in enumerate(trainloader):
images, labels = data # 数据包括图像与标签两部分
outputs = net(images)
loss = criterion(outputs, labels) # 计算损失
# 更新神经网络权重:
optimizer.zero_grad() # 梯度清零
loss.backward() # 本次学习的梯度反向传递
optimizer.step() # 利用本次的梯度更新权值
# 定期输出:
if (i % 1000 == 0):
print("Epoch:%d,Step:%d,Loss:%.3f" % (epoch, i, loss.item()))
print("结束!")
#五、测试模型
# 1.总体准确率:
correct = 0.0 # 测试数据中正确个数
total = 0.0 # 总共测试数据数量
with torch.no_grad(): # 不需要梯度
for data in testloader: #测试集中有1w张图片
images, labels = data
outputs = net(images)
_, predicted = torch.max(outputs.data, 1) #这个 下划线_ 表示的就是具体的value,也就是输出的最大值。 由于后续用不到,所以写_
# 统计正确数量和总共数量
correct += (predicted == labels).sum()
total += labels.size(0)
print('准确率:',float(correct) / total)
#2.每一类的准确率:
class_correct = list(0. for i in range(10))
class_total = list(0. for i in range(10))
with torch.no_grad():
for data in testloader:
images, labels = data
outputs = net(images)
_, predicted = torch.max(outputs, 1)
c = (predicted == labels).squeeze()
for i in range(4):
label = labels[i]
class_correct[label] += c[i].item()
class_total[label] += 1
for i in range(10):
print('%5s的准确率 : %2d %%' % (classes[i], 100 * class_correct[i] / class_total[i]))
代码分为几个部分:
1.数据导入
包括:定义归一化方法,训练集,数据集
2.定义网络Net,其中包含两个卷积层以及三个全连接层(无池化层)
3.定义损失函数和优化器,其中优化器使用的是SGD
4.开始训练神经网络
其中:1.当所有的训练数据集中的数据都被加载并训练完一次被称作一个epoch(即50000张图片全部加载完毕)
2.batch_size设定为4,即每个step只加载4张图片,一个epoch中训练50000/4个step,设定每1000个step输出一下,则每个epoch内最多会显示到step=12000。
2.设定epoch的范围为2(即0和1)
5.最后进行测试,测试分为两个评价方法
a.测试集中1万张图片的整体准确性
b.测试集中1万张图片中每一类(共10类)的准确性
参考文章:
pytorch中transforms.Compose()函数_u013925378的博客-CSDN博客_transforms.composed
Pytorch中iter(dataloader)的使用_沐雲小哥的博客-CSDN博客
Pytorch中iter(dataloader)的使用_沐雲小哥的博客-CSDN博客
next()函数和iter()函数的用法_林镕琛的博客-CSDN博客
python中view()函数怎么用?_杨师傅的博客-CSDN博客_python view
深度学习中momentum的作用_竹馨shine的专栏-CSDN博客_momentum 深度学习
PyTorch系列 | _, predicted = torch.max(outputs.data, 1)的理解_麻瓜1号的博客-CSDN博客