30-31 利用GPU训练

一、第一种方法

1.找到能够调用.cuda()的位置

  • 网络模型
  • 数据(输入,标注)
  • 损失函数

2.计算训练的时间

  • 在CPU运行速度

代码:

点击查看代码
import torch
import torchvision
# 13. 计算时间
import time
from torch.utils.tensorboard import SummaryWriter


# 1. 准备数据集
from torch import nn
from torch.utils.data import DataLoader

train_data=torchvision.datasets.CIFAR10(root="./CIFAR10_dataset",train=True,transform=torchvision.transforms.ToTensor(),download=True) #注意ToTensor的括号不能忘,不让模型无法调用
test_data=torchvision.datasets.CIFAR10(root="./CIFAR10_dataset",train=False,transform=torchvision.transforms.ToTensor(),download=True)

# 2. 计算训练集和测试集的长度
train_data_size=len(train_data)
test_data_size=len(test_data)

# 2.1 输出训练集和测试集的长度
'''
训练数据集的长度为:50000
测试数据集的长度为:10000
'''
print("训练数据集的长度为:{}".format(train_data_size))
print("测试数据集的长度为:{}".format(test_data_size))

# 3. 利用DataLoader来加载数据集

train_dataloader=DataLoader(train_data,batch_size=64)
test_dataloader=DataLoader(test_data,batch_size=64)

# 4. 搭建神经网络
class Tudui(nn.Module):
    def __init__(self):
        super(Tudui, self).__init__()
        self.model1=nn.Sequential(
            nn.Conv2d(3, 32, 5, stride=1,padding=2),  # in_channel 3;out_channel 32;kernel 5;padding需要计算(一般不会太大)
            nn.MaxPool2d(2),  # kennel_Size=2
            nn.Conv2d(32, 32, 5,stride=1,padding=2),
            nn.MaxPool2d(2),
            nn.Conv2d(32, 64, 5,stride=1, padding=2),
            nn.MaxPool2d(2),
            nn.Flatten(),  # 展平 :可以把后面的删掉 获得输出的大小
            nn.Linear(64*4*4, 64),  # 看上一层的大小64*4*4=1024 ,可以看到是1024
            nn.Linear(64, 10)  # 输入大小 64 输出大小 10
        )
    def forward(self,x):
            x=self.model1(x)
            return x


# 5.创建网络模型
tudui=Tudui()

# 6.损失函数
loss_fn=nn.CrossEntropyLoss() #交叉熵

# 7.优化器
# 1e-2=1*(10)*(-2)=1/100=0.01
learning_rate=1e-2
optimizer=torch.optim.SGD(tudui.parameters(),lr=learning_rate)

# 8.设置训练网络的一些参数
total_train_step=0 #记录训练的次数
total_test_step=0 #记录测试的次数
epoch=10 #训练的轮数

# 9. 添加tensorboard
writer=SummaryWriter("./logs_27")
# 13.1 开始时间
start_time=time.time()
for i in range(epoch):
    print("------第{}轮训练开始-------".format(i+1))
    # 8.1 训练步骤开始
    tudui.train()
    for data in train_dataloader:
        imgs, targets = data
        outputs = tudui(imgs)
        loss = loss_fn(outputs, targets)

        # 优化器优化模型
        optimizer.zero_grad()
        loss.backward()
        optimizer.step()

        #训练次数
        total_train_step=total_train_step+1

        #限制输出的次数
        if total_train_step%100==0: #当训练次数为 100 200 时训练输出
            # 13.2 结束时间
            end_time=time.time()
            # 13.3 输出总共需要的时间
            print(end_time-start_time)
            print("训练次数:{},loss:{}".format(total_train_step,loss.item()))#loss tensor类型, loss.item() 数字类型
            # 9.1 训练的效果
            writer.add_scalar("train_loss",loss.item(),total_train_step)
    # 8.2 测试步骤开始
    '''
    判断训练的结果如何
    '''
    tudui.eval()
    total_test_loss=0  #整体的loss
    total_accuracy=0   #整体正确率
    with torch.no_grad(): #不再进行梯度更新,也就是不进行优化,单纯的测试
        for data in test_dataloader:
            imgs,targets=data
            outputs=tudui(imgs)
            loss=loss_fn(outputs,targets) #计算测试集上的误差(一部分数据)
            total_test_loss=total_test_loss + loss.item() #计算整体测试集上的loss
            # 11.计算正确率
            accuracy=(outputs.argmax(1)==targets).sum()
            total_accuracy+=accuracy
        print("整体测试集上的loss:{}".format(total_test_loss))
        # 11.1  输出准确率
        print("整体测试集上的正确率:{}".format(total_accuracy/test_data_size))
        # 9.2 测试的效果
        writer.add_scalar("test_loss",total_test_loss,total_test_step)
        # 11.2 添加显示正确率
        writer.add_scalar("test_accuracy",total_accuracy/test_data_size,total_test_step)

        total_test_step=total_test_step + 1 #测试完一次就+1,不让图像不会变化

        # 10. 模型保存
        '''
        存放每一轮保存的结果
        '''
        torch.save(tudui,"tudui_{}.pth".format(i))
        print("模型已保存")

# 9.3 关闭writer
writer.close()


运行结果

点击查看代码
Downloading https://www.cs.toronto.edu/~kriz/cifar-10-python.tar.gz to ./CIFAR10_dataset/cifar-10-python.tar.gz
170499072/? [00:03<00:00, 51354686.99it/s]
Extracting ./CIFAR10_dataset/cifar-10-python.tar.gz to ./CIFAR10_dataset
Files already downloaded and verified
训练数据集的长度为:50000
测试数据集的长度为:10000
------第1轮训练开始-------
11.110987186431885
训练次数:100,loss:2.2877604961395264
22.01622247695923
训练次数:200,loss:2.2849936485290527
32.905092000961304
训练次数:300,loss:2.2703661918640137
43.75894856452942
训练次数:400,loss:2.2159266471862793
54.58061337471008
训练次数:500,loss:2.1416776180267334
65.39709186553955
训练次数:600,loss:2.0643601417541504
76.2299473285675
训练次数:700,loss:1.9848488569259644
整体测试集上的loss:312.2365174293518
整体测试集上的正确率:0.28209999203681946
模型已保存
------第2轮训练开始-------
95.73316836357117
训练次数:800,loss:1.8631683588027954
106.56938028335571
训练次数:900,loss:1.8136553764343262
117.3673300743103
训练次数:1000,loss:1.915215253829956
128.19729018211365
训练次数:1100,loss:1.9833741188049316
139.0181097984314
训练次数:1200,loss:1.6905808448791504
149.85367798805237
训练次数:1300,loss:1.629398226737976
160.67061710357666
训练次数:1400,loss:1.7097036838531494
171.5266809463501
训练次数:1500,loss:1.7631858587265015
整体测试集上的loss:297.0589954853058
整体测试集上的正确率:0.32010000944137573
模型已保存
------第3轮训练开始-------
191.06091499328613
训练次数:1600,loss:1.707668662071228
201.981027841568
训练次数:1700,loss:1.6452357769012451
212.8516628742218
训练次数:1800,loss:1.9550222158432007
223.75627636909485
训练次数:1900,loss:1.6798380613327026
234.6314036846161
训练次数:2000,loss:1.9116848707199097
245.548077583313
训练次数:2100,loss:1.4848814010620117
256.40956473350525
训练次数:2200,loss:1.4536629915237427
267.30272603034973
训练次数:2300,loss:1.786560297012329
整体测试集上的loss:261.26172029972076
整体测试集上的正确率:0.3970000147819519
模型已保存
------第4轮训练开始-------
286.85681414604187
训练次数:2400,loss:1.7242145538330078
297.7175645828247
训练次数:2500,loss:1.3175177574157715
308.64505910873413
训练次数:2600,loss:1.606272578239441
319.58935928344727
训练次数:2700,loss:1.6576868295669556
330.47361755371094
训练次数:2800,loss:1.4555641412734985
341.3601791858673
训练次数:2900,loss:1.5828633308410645
352.24713039398193
训练次数:3000,loss:1.3251534700393677
363.1433353424072
训练次数:3100,loss:1.5461094379425049
整体测试集上的loss:251.17172074317932
整体测试集上的正确率:0.41990000009536743
模型已保存
------第5轮训练开始-------
382.7338662147522
训练次数:3200,loss:1.3294955492019653
393.5845491886139
训练次数:3300,loss:1.4597337245941162
404.45455741882324
训练次数:3400,loss:1.4898042678833008
415.293363571167
训练次数:3500,loss:1.5291085243225098
426.17122054100037
训练次数:3600,loss:1.5570412874221802
437.08485531806946
训练次数:3700,loss:1.294222354888916
447.9350402355194
训练次数:3800,loss:1.2661834955215454
458.80909299850464
训练次数:3900,loss:1.4822486639022827
整体测试集上的loss:239.8183652162552
整体测试集上的正确率:0.44440001249313354
模型已保存
------第6轮训练开始-------
478.3040735721588
训练次数:4000,loss:1.3907177448272705
489.2052643299103
训练次数:4100,loss:1.4482570886611938
500.0663561820984
训练次数:4200,loss:1.585627794265747
510.9110174179077
训练次数:4300,loss:1.2001267671585083
521.7662646770477
训练次数:4400,loss:1.0922006368637085
532.5904085636139
训练次数:4500,loss:1.3374173641204834
543.4123511314392
训练次数:4600,loss:1.4145660400390625
整体测试集上的loss:231.92839086055756
整体测试集上的正确率:0.4611999988555908
模型已保存
------第7轮训练开始-------
562.9477961063385
训练次数:4700,loss:1.3356484174728394
573.7838807106018
训练次数:4800,loss:1.5377393960952759
584.6722838878632
训练次数:4900,loss:1.400399088859558
595.5435521602631
训练次数:5000,loss:1.4183498620986938
606.4164087772369
训练次数:5100,loss:0.9900897145271301
617.2879509925842
训练次数:5200,loss:1.2673202753067017
628.1238553524017
训练次数:5300,loss:1.178088903427124
638.9806408882141
训练次数:5400,loss:1.3776136636734009
整体测试集上的loss:227.1547429561615
整体测试集上的正确率:0.4796999990940094
模型已保存
------第8轮训练开始-------
658.4881916046143
训练次数:5500,loss:1.255350947380066
669.3180439472198
训练次数:5600,loss:1.1750385761260986
680.1810879707336
训练次数:5700,loss:1.2195059061050415
690.9893569946289
训练次数:5800,loss:1.2203878164291382
701.83780169487
训练次数:5900,loss:1.3593213558197021
712.6908051967621
训练次数:6000,loss:1.5081361532211304
723.5127925872803
训练次数:6100,loss:1.0833954811096191
734.3284862041473
训练次数:6200,loss:1.0904277563095093
整体测试集上的loss:222.00016403198242
整体测试集上的正确率:0.4966999888420105
模型已保存
------第9轮训练开始-------
753.840104341507
训练次数:6300,loss:1.4123660326004028
764.6953125
训练次数:6400,loss:1.1005157232284546
775.505446434021
训练次数:6500,loss:1.51044762134552
786.3773076534271
训练次数:6600,loss:1.0844604969024658
797.2431457042694
训练次数:6700,loss:1.0497959852218628
808.145026922226
训练次数:6800,loss:1.2178071737289429
818.9774401187897
训练次数:6900,loss:1.0795538425445557
829.8596458435059
训练次数:7000,loss:0.9014005661010742
整体测试集上的loss:215.3285013437271
整体测试集上的正确率:0.5152999758720398
模型已保存
------第10轮训练开始-------
849.4030301570892
训练次数:7100,loss:1.129699468612671
860.2384145259857
训练次数:7200,loss:0.927510142326355
871.0975918769836
训练次数:7300,loss:1.1657779216766357
881.9566361904144
训练次数:7400,loss:0.8315598368644714
892.8183481693268
训练次数:7500,loss:1.2595139741897583
903.6350629329681
训练次数:7600,loss:1.2293405532836914
914.4600555896759
训练次数:7700,loss:0.823930561542511
925.3196330070496
训练次数:7800,loss:1.2183678150177002
整体测试集上的loss:208.68356120586395
整体测试集上的正确率:0.5336999893188477
模型已保存
  • 在GPU运行速度

可以在colab运行,每周30h
修改->笔记本设置->选择GPU

image

执行以下代码:

点击查看代码
import torch
import torchvision
# 13. 计算时间
import time
from torch.utils.tensorboard import SummaryWriter

# 1. 准备数据集
from torch import nn
from torch.utils.data import DataLoader

train_data=torchvision.datasets.CIFAR10(root="./CIFAR10_dataset",train=True,transform=torchvision.transforms.ToTensor(),download=True) #注意ToTensor的括号不能忘,不让模型无法调用
test_data=torchvision.datasets.CIFAR10(root="./CIFAR10_dataset",train=False,transform=torchvision.transforms.ToTensor(),download=True)

# 2. 计算训练集和测试集的长度
train_data_size=len(train_data)
test_data_size=len(test_data)

# 2.1 输出训练集和测试集的长度
'''
训练数据集的长度为:50000
测试数据集的长度为:10000
'''
print("训练数据集的长度为:{}".format(train_data_size))
print("测试数据集的长度为:{}".format(test_data_size))

# 3. 利用DataLoader来加载数据集

train_dataloader=DataLoader(train_data,batch_size=64)
test_dataloader=DataLoader(test_data,batch_size=64)

# 4. 搭建神经网络
class Tudui(nn.Module):
    def __init__(self):
        super(Tudui, self).__init__()
        self.model1=nn.Sequential(
            nn.Conv2d(3, 32, 5, stride=1,padding=2),  # in_channel 3;out_channel 32;kernel 5;padding需要计算(一般不会太大)
            nn.MaxPool2d(2),  # kennel_Size=2
            nn.Conv2d(32, 32, 5,stride=1,padding=2),
            nn.MaxPool2d(2),
            nn.Conv2d(32, 64, 5,stride=1, padding=2),
            nn.MaxPool2d(2),
            nn.Flatten(),  # 展平 :可以把后面的删掉 获得输出的大小
            nn.Linear(64*4*4, 64),  # 看上一层的大小64*4*4=1024 ,可以看到是1024
            nn.Linear(64, 10)  # 输入大小 64 输出大小 10
        )
    def forward(self,x):
            x=self.model1(x)
            return x

# 5.创建网络模型
tudui=Tudui()

# 12.1 模型调用cuda
# if torch.cuda.is_available():#没有GPU就用CPU
tudui=tudui.cuda()

# 6.损失函数
loss_fn=nn.CrossEntropyLoss() #交叉熵

# 12.2 损失函数调用cuda
# if torch.cuda.is_available():
loss_fn=loss_fn.cuda()

# 7.优化器
# 1e-2=1*(10)*(-2)=1/100=0.01
learning_rate=1e-2
optimizer=torch.optim.SGD(tudui.parameters(),lr=learning_rate)

# 8.设置训练网络的一些参数
total_train_step=0 #记录训练的次数
total_test_step=0 #记录测试的次数
epoch=10 #训练的轮数

# 9. 添加tensorboard
writer=SummaryWriter("./logs_27")
# 13.1 开始时间
start_time=time.time()
for i in range(epoch):
    print("------第{}轮训练开始-------".format(i+1))
    # 8.1 训练步骤开始
    tudui.train()
    for data in train_dataloader:
        imgs, targets = data
        # 12.3 训练数据添加.cuda
        # if torch.cuda.is_available() :
        imgs=imgs.cuda()
        targets=targets.cuda()

        outputs = tudui(imgs)
        loss = loss_fn(outputs, targets)

        # 优化器优化模型
        optimizer.zero_grad()
        loss.backward()
        optimizer.step()

        #训练次数
        total_train_step=total_train_step+1

        #限制输出的次数
        if total_train_step%100==0: #当训练次数为 100 200 时训练输出
            # 13.2 结束时间
            end_time = time.time()
            # 13.3 输出总共需要的时间
            print(end_time - start_time)
            print("训练次数:{},loss:{}".format(total_train_step,loss.item()))#loss tensor类型, loss.item() 数字类型
            # 9.1 训练的效果
            writer.add_scalar("train_loss",loss.item(),total_train_step)
    # 8.2 测试步骤开始
    '''
    判断训练的结果如何
    '''
    tudui.eval()
    total_test_loss=0  #整体的loss
    total_accuracy=0   #整体正确率
    with torch.no_grad(): #不再进行梯度更新,也就是不进行优化,单纯的测试
        for data in test_dataloader:
            imgs,targets=data
            # 12.4 测试数据添加.cuda
            # if torch.cuda.is_available() :
            imgs = imgs.cuda()
            targets = targets.cuda()
            outputs=tudui(imgs)
            loss=loss_fn(outputs,targets) #计算测试集上的误差(一部分数据)
            total_test_loss=total_test_loss + loss.item() #计算整体测试集上的loss
            # 11.计算正确率
            accuracy=(outputs.argmax(1)==targets).sum()
            total_accuracy+=accuracy
        print("整体测试集上的loss:{}".format(total_test_loss))
        # 11.1  输出准确率
        print("整体测试集上的正确率:{}".format(total_accuracy/test_data_size))
        # 9.2 测试的效果
        writer.add_scalar("test_loss",total_test_loss,total_test_step)
        # 11.2 添加显示正确率
        writer.add_scalar("test_accuracy",total_accuracy/test_data_size,total_test_step)

        total_test_step=total_test_step + 1 #测试完一次就+1,不让图像不会变化

        # 10. 模型保存
        '''
        存放每一轮保存的结果
        '''
        torch.save(tudui,"tudui_{}.pth".format(i))
        print("模型已保存")

# 9.3 关闭writer
writer.close()

运行结果:

点击查看代码
训练数据集的长度为:50000
测试数据集的长度为:10000
------第1轮训练开始-------
4.33272910118103
训练次数:100,loss:2.2884974479675293
5.493952512741089
训练次数:200,loss:2.281789779663086
6.413592100143433
训练次数:300,loss:2.2716212272644043
7.30815863609314
训练次数:400,loss:2.2252750396728516
8.214631795883179
训练次数:500,loss:2.092320680618286
9.104838132858276
训练次数:600,loss:2.0375611782073975
10.00234079360962
训练次数:700,loss:2.012112617492676
整体测试集上的loss:313.2297248840332
整体测试集上的正确率:0.28509998321533203
模型已保存
------第2轮训练开始-------
12.371474981307983
训练次数:800,loss:1.8864545822143555
13.280489683151245
训练次数:900,loss:1.870816946029663
14.181978225708008
训练次数:1000,loss:1.9185900688171387
15.075580835342407
训练次数:1100,loss:1.9517053365707397
15.980042934417725
训练次数:1200,loss:1.6900173425674438
16.911458253860474
训练次数:1300,loss:1.6750991344451904
17.81891131401062
训练次数:1400,loss:1.7436320781707764
18.733550310134888
训练次数:1500,loss:1.811186671257019
整体测试集上的loss:288.15271389484406
整体测试集上的正确率:0.34119999408721924
模型已保存
------第3轮训练开始-------
20.92395305633545
训练次数:1600,loss:1.77822744846344
21.847413778305054
训练次数:1700,loss:1.655598521232605
22.78502058982849
训练次数:1800,loss:1.9148616790771484
23.688599348068237
训练次数:1900,loss:1.7271881103515625
24.588708639144897
训练次数:2000,loss:1.8844763040542603
25.49996304512024
训练次数:2100,loss:1.5405311584472656
26.680898904800415
训练次数:2200,loss:1.4970617294311523
27.771580696105957
训练次数:2300,loss:1.7908413410186768
整体测试集上的loss:265.59271264076233
整体测试集上的正确率:0.38509997725486755
模型已保存
------第4轮训练开始-------
29.94524621963501
训练次数:2400,loss:1.6934089660644531
30.865198135375977
训练次数:2500,loss:1.363931655883789
31.763295650482178
训练次数:2600,loss:1.5953984260559082
32.67670917510986
训练次数:2700,loss:1.6671370267868042
33.571396827697754
训练次数:2800,loss:1.4739454984664917
34.468915700912476
训练次数:2900,loss:1.5968403816223145
35.377769231796265
训练次数:3000,loss:1.3682552576065063
36.28901982307434
训练次数:3100,loss:1.5051652193069458
整体测试集上的loss:262.48951256275177
整体测试集上的正确率:0.39559999108314514
模型已保存
------第5轮训练开始-------
38.50037908554077
训练次数:3200,loss:1.36240816116333
39.39479875564575
训练次数:3300,loss:1.457019567489624
40.28350615501404
训练次数:3400,loss:1.4686907529830933
41.185163736343384
训练次数:3500,loss:1.549347996711731
42.10871362686157
训练次数:3600,loss:1.5798014402389526
43.264132499694824
训练次数:3700,loss:1.363492727279663
44.163246154785156
训练次数:3800,loss:1.2952622175216675
45.06690216064453
训练次数:3900,loss:1.449944257736206
整体测试集上的loss:260.5120462179184
整体测试集上的正确率:0.4099999964237213
模型已保存
------第6轮训练开始-------
47.25864911079407
训练次数:4000,loss:1.4141969680786133
48.160966873168945
训练次数:4100,loss:1.4095240831375122
49.100165128707886
训练次数:4200,loss:1.5366352796554565
50.25661325454712
训练次数:4300,loss:1.227867841720581
51.15277934074402
训练次数:4400,loss:1.154367446899414
52.340696573257446
训练次数:4500,loss:1.384210467338562
53.255535364151
训练次数:4600,loss:1.4147766828536987
整体测试集上的loss:248.26019895076752
整体测试集上的正确率:0.43609997630119324
模型已保存
------第7轮训练开始-------
55.41539120674133
训练次数:4700,loss:1.3197097778320312
56.33135747909546
训练次数:4800,loss:1.5068280696868896
57.23777985572815
训练次数:4900,loss:1.3645864725112915
58.16762137413025
训练次数:5000,loss:1.3748646974563599
59.07088613510132
训练次数:5100,loss:0.999653160572052
59.98392128944397
训练次数:5200,loss:1.3277932405471802
60.89016318321228
训练次数:5300,loss:1.1706973314285278
61.82019829750061
训练次数:5400,loss:1.3529413938522339
整体测试集上的loss:230.41336357593536
整体测试集上的正确率:0.4745999872684479
模型已保存
------第8轮训练开始-------
64.00623440742493
训练次数:5500,loss:1.2114841938018799
64.91326403617859
训练次数:5600,loss:1.192514419555664
65.81842613220215
训练次数:5700,loss:1.251175880432129
66.98505425453186
训练次数:5800,loss:1.24003005027771
67.89593315124512
训练次数:5900,loss:1.3413259983062744
68.82185506820679
训练次数:6000,loss:1.4932656288146973
69.74867939949036
训练次数:6100,loss:1.0106247663497925
70.67207860946655
训练次数:6200,loss:1.136347770690918
整体测试集上的loss:213.7305462360382
整体测试集上的正确率:0.5126999616622925
模型已保存
------第9轮训练开始-------
73.09997987747192
训练次数:6300,loss:1.4074432849884033
74.06448864936829
训练次数:6400,loss:1.1067496538162231
75.49039149284363
训练次数:6500,loss:1.571216344833374
76.73335886001587
训练次数:6600,loss:1.1042038202285767
77.68112564086914
训练次数:6700,loss:1.0891891717910767
78.60149669647217
训练次数:6800,loss:1.163199782371521
79.51327633857727
训练次数:6900,loss:1.0899041891098022
80.45919966697693
训练次数:7000,loss:0.9244132041931152
整体测试集上的loss:201.28431105613708
整体测试集上的正确率:0.5447999835014343
模型已保存
------第10轮训练开始-------
82.65863108634949
训练次数:7100,loss:1.2787412405014038
83.56685018539429
训练次数:7200,loss:0.9970508813858032
84.47589230537415
训练次数:7300,loss:1.075785756111145
85.37683248519897
训练次数:7400,loss:0.8845826387405396
86.2892529964447
训练次数:7500,loss:1.1827806234359741
87.18609189987183
训练次数:7600,loss:1.2525413036346436
88.12955236434937
训练次数:7700,loss:0.8950385451316833
89.03755688667297
训练次数:7800,loss:1.2916812896728516
整体测试集上的loss:191.76686906814575
整体测试集上的正确率:0.56659996509552
模型已保存

colab提供的GPU:
image

3. 用自己的GPU跑

image

部分运行结果:

点击查看代码
Files already downloaded and verified
Files already downloaded and verified
训练数据集的长度为:50000
测试数据集的长度为:10000
------第1轮训练开始-------
19.179653882980347
训练次数:100,loss:2.2851109504699707
26.198033094406128
训练次数:200,loss:2.284975528717041
31.406862258911133
训练次数:300,loss:2.256366491317749
35.1027147769928
训练次数:400,loss:2.1797103881835938
39.66706681251526
训练次数:500,loss:2.0768096446990967
45.883233070373535
训练次数:600,loss:2.067444086074829
51.83834958076477
训练次数:700,loss:2.0041518211364746
整体测试集上的loss:314.1395843029022
整体测试集上的正确率:0.28329998254776
模型已保存

版本太低,升级cuda

问题:Key already registered with the same priority: GroupSpatialSoftmax

二、第二种方法(常用)

1.基本方法

.to(device)

torch.device("cpu")
torch.device("cuda")
torch.device("cuda:0") #指定不同的gpu
torch.device("cuda:1")

常用语句:

device=torch.device("cuda" if torch.cuda.is_available() else "cpu")

模型和损失函数可以不重新赋值,直接调用也行

2.CPU版本

点击查看代码
import torch
import torchvision
# 13. 计算时间
import time
from torch.utils.tensorboard import SummaryWriter


from torch import nn
from torch.utils.data import DataLoader

# 12.定义训练的设备
device=torch.device("cpu")

# 1. 准备数据集
train_data=torchvision.datasets.CIFAR10(root="./CIFAR10_dataset",train=True,transform=torchvision.transforms.ToTensor(),download=True) #注意ToTensor的括号不能忘,不让模型无法调用
test_data=torchvision.datasets.CIFAR10(root="./CIFAR10_dataset",train=False,transform=torchvision.transforms.ToTensor(),download=True)

# 2. 计算训练集和测试集的长度
train_data_size=len(train_data)
test_data_size=len(test_data)

# 2.1 输出训练集和测试集的长度
'''
训练数据集的长度为:50000
测试数据集的长度为:10000
'''
print("训练数据集的长度为:{}".format(train_data_size))
print("测试数据集的长度为:{}".format(test_data_size))

# 3. 利用DataLoader来加载数据集

train_dataloader=DataLoader(train_data,batch_size=64)
test_dataloader=DataLoader(test_data,batch_size=64)

# 4. 搭建神经网络
class Tudui(nn.Module):
    def __init__(self):
        super(Tudui, self).__init__()
        self.model1=nn.Sequential(
            nn.Conv2d(3, 32, 5, stride=1,padding=2),  # in_channel 3;out_channel 32;kernel 5;padding需要计算(一般不会太大)
            nn.MaxPool2d(2),  # kennel_Size=2
            nn.Conv2d(32, 32, 5,stride=1,padding=2),
            nn.MaxPool2d(2),
            nn.Conv2d(32, 64, 5,stride=1, padding=2),
            nn.MaxPool2d(2),
            nn.Flatten(),  # 展平 :可以把后面的删掉 获得输出的大小
            nn.Linear(64*4*4, 64),  # 看上一层的大小64*4*4=1024 ,可以看到是1024
            nn.Linear(64, 10)  # 输入大小 64 输出大小 10
        )
    def forward(self,x):
            x=self.model1(x)
            return x


# 5.创建网络模型
tudui=Tudui()

# 12.1 模型指定设备
tudui=tudui.to(device)

# 6.损失函数
loss_fn=nn.CrossEntropyLoss() #交叉熵

# 12.2 损失函数指定设备
loss_fn=loss_fn.to(device)

# 7.优化器
# 1e-2=1*(10)*(-2)=1/100=0.01
learning_rate=1e-2
optimizer=torch.optim.SGD(tudui.parameters(),lr=learning_rate)

# 8.设置训练网络的一些参数
total_train_step=0 #记录训练的次数
total_test_step=0 #记录测试的次数
epoch=10 #训练的轮数

# 9. 添加tensorboard
writer=SummaryWriter("./logs_27")
# 13.1 开始时间
start_time=time.time()
for i in range(epoch):
    print("------第{}轮训练开始-------".format(i+1))
    # 8.1 训练步骤开始
    tudui.train()
    for data in train_dataloader:
        imgs, targets = data
        # 12.3 训练数据指定设备
        imgs=imgs.to(device)
        targets=targets.to(device)

        outputs = tudui(imgs)
        loss = loss_fn(outputs,targets)

        # 优化器优化模型
        optimizer.zero_grad()
        loss.backward()
        optimizer.step()

        #训练次数
        total_train_step=total_train_step+1

        #限制输出的次数
        if total_train_step%100==0: #当训练次数为 100 200 时训练输出
            # 13.2 结束时间
            end_time=time.time()
            # 13.3 输出总共需要的时间
            print(end_time-start_time)
            print("训练次数:{},loss:{}".format(total_train_step,loss.item()))#loss tensor类型, loss.item() 数字类型
            # 9.1 训练的效果
            writer.add_scalar("train_loss",loss.item(),total_train_step)
    # 8.2 测试步骤开始
    '''
    判断训练的结果如何
    '''
    tudui.eval()
    total_test_loss=0  #整体的loss
    total_accuracy=0   #整体正确率
    with torch.no_grad(): #不再进行梯度更新,也就是不进行优化,单纯的测试
        for data in test_dataloader:
            imgs,targets=data
            # 12.4 训练数据指定设备
            imgs=imgs.to(device)
            targets=targets.to(device)
            outputs=tudui(imgs)
            loss=loss_fn(outputs,targets) #计算测试集上的误差(一部分数据)
            total_test_loss=total_test_loss + loss.item() #计算整体测试集上的loss
            # 11.计算正确率
            accuracy=(outputs.argmax(1)==targets).sum()
            total_accuracy+=accuracy
        print("整体测试集上的loss:{}".format(total_test_loss))
        # 11.1  输出准确率
        print("整体测试集上的正确率:{}".format(total_accuracy/test_data_size))
        # 9.2 测试的效果
        writer.add_scalar("test_loss",total_test_loss,total_test_step)
        # 11.2 添加显示正确率
        writer.add_scalar("test_accuracy",total_accuracy/test_data_size,total_test_step)

        total_test_step=total_test_step + 1 #测试完一次就+1,不让图像不会变化

        # 10. 模型保存
        '''
        存放每一轮保存的结果
        '''
        torch.save(tudui,"tudui_{}.pth".format(i))
        print("模型已保存")

# 9.3 关闭writer
writer.close()

3.GPU版本

点击查看代码
import torch
import torchvision
# 13. 计算时间
import time
from torch.utils.tensorboard import SummaryWriter


from torch import nn
from torch.utils.data import DataLoader

# 12.定义训练的设备
device=torch.device("cuda")

# 1. 准备数据集
train_data=torchvision.datasets.CIFAR10(root="./CIFAR10_dataset",train=True,transform=torchvision.transforms.ToTensor(),download=True) #注意ToTensor的括号不能忘,不让模型无法调用
test_data=torchvision.datasets.CIFAR10(root="./CIFAR10_dataset",train=False,transform=torchvision.transforms.ToTensor(),download=True)

# 2. 计算训练集和测试集的长度
train_data_size=len(train_data)
test_data_size=len(test_data)

# 2.1 输出训练集和测试集的长度
'''
训练数据集的长度为:50000
测试数据集的长度为:10000
'''
print("训练数据集的长度为:{}".format(train_data_size))
print("测试数据集的长度为:{}".format(test_data_size))

# 3. 利用DataLoader来加载数据集

train_dataloader=DataLoader(train_data,batch_size=64)
test_dataloader=DataLoader(test_data,batch_size=64)

# 4. 搭建神经网络
class Tudui(nn.Module):
    def __init__(self):
        super(Tudui, self).__init__()
        self.model1=nn.Sequential(
            nn.Conv2d(3, 32, 5, stride=1,padding=2),  # in_channel 3;out_channel 32;kernel 5;padding需要计算(一般不会太大)
            nn.MaxPool2d(2),  # kennel_Size=2
            nn.Conv2d(32, 32, 5,stride=1,padding=2),
            nn.MaxPool2d(2),
            nn.Conv2d(32, 64, 5,stride=1, padding=2),
            nn.MaxPool2d(2),
            nn.Flatten(),  # 展平 :可以把后面的删掉 获得输出的大小
            nn.Linear(64*4*4, 64),  # 看上一层的大小64*4*4=1024 ,可以看到是1024
            nn.Linear(64, 10)  # 输入大小 64 输出大小 10
        )
    def forward(self,x):
            x=self.model1(x)
            return x


# 5.创建网络模型
tudui=Tudui()

# 12.1 模型指定设备
tudui=tudui.to(device)

# 6.损失函数
loss_fn=nn.CrossEntropyLoss() #交叉熵

# 12.2 损失函数指定设备
loss_fn=loss_fn.to(device)

# 7.优化器
# 1e-2=1*(10)*(-2)=1/100=0.01
learning_rate=1e-2
optimizer=torch.optim.SGD(tudui.parameters(),lr=learning_rate)

# 8.设置训练网络的一些参数
total_train_step=0 #记录训练的次数
total_test_step=0 #记录测试的次数
epoch=10 #训练的轮数

# 9. 添加tensorboard
writer=SummaryWriter("./logs_27")
# 13.1 开始时间
start_time=time.time()
for i in range(epoch):
    print("------第{}轮训练开始-------".format(i+1))
    # 8.1 训练步骤开始
    tudui.train()
    for data in train_dataloader:
        imgs, targets = data
        # 12.3 训练数据指定设备
        imgs=imgs.to(device)
        targets=targets.to(device)

        outputs = tudui(imgs)
        loss = loss_fn(outputs,targets)

        # 优化器优化模型
        optimizer.zero_grad()
        loss.backward()
        optimizer.step()

        #训练次数
        total_train_step=total_train_step+1

        #限制输出的次数
        if total_train_step%100==0: #当训练次数为 100 200 时训练输出
            # 13.2 结束时间
            end_time=time.time()
            # 13.3 输出总共需要的时间
            print(end_time-start_time)
            print("训练次数:{},loss:{}".format(total_train_step,loss.item()))#loss tensor类型, loss.item() 数字类型
            # 9.1 训练的效果
            writer.add_scalar("train_loss",loss.item(),total_train_step)
    # 8.2 测试步骤开始
    '''
    判断训练的结果如何
    '''
    tudui.eval()
    total_test_loss=0  #整体的loss
    total_accuracy=0   #整体正确率
    with torch.no_grad(): #不再进行梯度更新,也就是不进行优化,单纯的测试
        for data in test_dataloader:
            imgs,targets=data
            # 12.4 训练数据指定设备
            imgs=imgs.to(device)
            targets=targets.to(device)
            outputs=tudui(imgs)
            loss=loss_fn(outputs,targets) #计算测试集上的误差(一部分数据)
            total_test_loss=total_test_loss + loss.item() #计算整体测试集上的loss
            # 11.计算正确率
            accuracy=(outputs.argmax(1)==targets).sum()
            total_accuracy+=accuracy
        print("整体测试集上的loss:{}".format(total_test_loss))
        # 11.1  输出准确率
        print("整体测试集上的正确率:{}".format(total_accuracy/test_data_size))
        # 9.2 测试的效果
        writer.add_scalar("test_loss",total_test_loss,total_test_step)
        # 11.2 添加显示正确率
        writer.add_scalar("test_accuracy",total_accuracy/test_data_size,total_test_step)

        total_test_step=total_test_step + 1 #测试完一次就+1,不让图像不会变化

        # 10. 模型保存
        '''
        存放每一轮保存的结果
        '''
        torch.save(tudui,"tudui_{}.pth".format(i))
        print("模型已保存")

# 9.3 关闭writer
writer.close()

posted @ 2022-05-27 11:27  Trouvaille_fighting  阅读(249)  评论(0)    收藏  举报