week8(2021.11.5~2021.11.12)

本文详细介绍了如何在Linux服务器上通过Anaconda搭建PyTorch-GPU环境,包括ZeroTierOne和MobaXterm的下载与使用,以及PyTorch的安装步骤。同时,展示了CIFAR-10数据集的图像分类案例,包括数据预处理、神经网络模型定义、训练与测试过程。
摘要由CSDN通过智能技术生成

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博客​​​​​​​

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值