14. 完整模型验证套路

news2024/11/24 19:37:52

14.1 GPU训练30轮次

import torchvision
import torch
from torch import nn
from torch.utils.data import DataLoader
from torch.utils.tensorboard import SummaryWriter
import time

# 定义训练的设备
#device = torch.device("cpu")
device = torch.device("cuda")   # 使用 GPU 方式一 
#device = torch.device("cuda:0") # 使用 GPU 方式二
#device = torch.device("cuda" if torch.cuda.is_available() else "cpu")

# from model import * 相当于把 model中的所有内容写到这里,这里直接把 model 写在这里
class Tudui(nn.Module):
    def __init__(self):
        super(Tudui, self).__init__()        
        self.model1 = nn.Sequential(
            nn.Conv2d(3,32,5,1,2),  # 输入通道3,输出通道32,卷积核尺寸5×5,步长1,填充2    
            nn.MaxPool2d(2),
            nn.Conv2d(32,32,5,1,2),
            nn.MaxPool2d(2),
            nn.Conv2d(32,64,5,1,2),
            nn.MaxPool2d(2),
            nn.Flatten(),  # 展平后变成 64*4*4 了
            nn.Linear(64*4*4,64),
            nn.Linear(64,10)
        )
        
    def forward(self, x):
        x = self.model1(x)
        return x

# 准备数据集
train_data = torchvision.datasets.CIFAR10("./dataset",train=True,transform=torchvision.transforms.ToTensor(),download=True)       
test_data = torchvision.datasets.CIFAR10("./dataset",train=False,transform=torchvision.transforms.ToTensor(),download=True)       

# length 长度
train_data_size = len(train_data)
test_data_size = len(test_data)
# 如果train_data_size=10,则打印:训练数据集的长度为:10
print("训练数据集的长度:{}".format(train_data_size))
print("测试数据集的长度:{}".format(test_data_size))

# 利用 Dataloader 来加载数据集
train_dataloader = DataLoader(train_data, batch_size=64)        
test_dataloader = DataLoader(test_data, batch_size=64)

# 创建网络模型
tudui = Tudui() 
tudui = tudui.to(device) # 也可以不赋值,直接 tudui.to(device) 


# 损失函数
loss_fn = nn.CrossEntropyLoss() # 交叉熵,fn 是 fuction 的缩写
loss_fn = loss_fn.to(device) # 也可以不赋值,直接loss_fn.to(device)

# 优化器
learning = 0.01  # 1e-2 就是 0.01 的意思
optimizer = torch.optim.SGD(tudui.parameters(),learning)   # 随机梯度下降优化器  

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

# 训练的轮次
epoch = 30

# 添加 tensorboard
writer = SummaryWriter("logs")
start_time = time.time()

for i in range(epoch):
    print("-----第 {} 轮训练开始-----".format(i+1))
    
    # 训练步骤开始
    tudui.train() # 当网络中有dropout层、batchnorm层时,这些层能起作用
    for data in train_dataloader:
        imgs, targets = data            
        imgs = imgs.to(device) # 也可以不赋值,直接 imgs.to(device)
        targets = targets.to(device) # 也可以不赋值,直接 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:
            end_time = time.time()
            print(end_time - start_time) # 运行训练一百次后的时间间隔
            print("训练次数:{},Loss:{}".format(total_train_step,loss.item()))  # 方式二:获得loss值
            writer.add_scalar("train_loss",loss.item(),total_train_step)
    
    # 测试步骤开始(每一轮训练后都查看在测试数据集上的loss情况)
    tudui.eval()  # 当网络中有dropout层、batchnorm层时,这些层不能起作用
    total_test_loss = 0
    total_accuracy = 0
    with torch.no_grad():  # 没有梯度了
        for data in test_dataloader: # 测试数据集提取数据
            imgs, targets = data # 数据放到cuda上
            imgs = imgs.to(device) # 也可以不赋值,直接 imgs.to(device)
            targets = targets.to(device) # 也可以不赋值,直接 targets.to(device)
            outputs = tudui(imgs)
            loss = loss_fn(outputs, targets) # 仅data数据在网络模型上的损失
            total_test_loss = total_test_loss + loss.item() # 所有loss
            accuracy = (outputs.argmax(1) == targets).sum()
            total_accuracy = total_accuracy + accuracy
            
    print("整体测试集上的Loss:{}".format(total_test_loss))
    print("整体测试集上的正确率:{}".format(total_accuracy/test_data_size))
    writer.add_scalar("test_loss",total_test_loss,total_test_step)
    writer.add_scalar("test_accuracy",total_accuracy/test_data_size,total_test_step)  
    total_test_step = total_test_step + 1
    
    torch.save(tudui, "./model/tudui_{}.pth".format(i)) # 保存每一轮训练后的结果
    #torch.save(tudui.state_dict(),"tudui_{}.path".format(i)) # 保存方式二         
    print("模型已保存")
    
writer.close()

结果:

Files already downloaded and verified
Files already downloaded and verified
训练数据集的长度:50000
测试数据集的长度:10000
-----第 1 轮训练开始-----
5.685762882232666
训练次数:100,Loss:2.2807211875915527
6.8356146812438965
训练次数:200,Loss:2.2813711166381836
7.945774078369141
训练次数:300,Loss:2.2436840534210205
9.072552680969238
训练次数:400,Loss:2.139457941055298
10.142128705978394
训练次数:500,Loss:1.9927244186401367
11.256510734558105
训练次数:600,Loss:2.020139217376709
12.32331919670105
训练次数:700,Loss:1.9936145544052124
整体测试集上的Loss:305.39513182640076
整体测试集上的正确率:0.29249998927116394
模型已保存
-----第 2 轮训练开始-----
14.885101795196533
训练次数:800,Loss:1.8381659984588623
15.946402072906494
训练次数:900,Loss:1.8096566200256348
17.04418158531189
训练次数:1000,Loss:1.8778941631317139
18.129207611083984
训练次数:1100,Loss:1.943365216255188
19.237319469451904
训练次数:1200,Loss:1.6915777921676636
20.327224731445312
训练次数:1300,Loss:1.6145961284637451
21.416797161102295
训练次数:1400,Loss:1.6929054260253906
22.50489115715027
训练次数:1500,Loss:1.7844973802566528
整体测试集上的Loss:288.42822670936584
整体测试集上的正确率:0.33959999680519104
模型已保存
-----第 3 轮训练开始-----
25.12572717666626
训练次数:1600,Loss:1.7492048740386963
26.190120220184326
训练次数:1700,Loss:1.6514606475830078
27.24756360054016
训练次数:1800,Loss:1.9523682594299316
28.325439929962158
训练次数:1900,Loss:1.6749478578567505
29.425256729125977
训练次数:2000,Loss:1.8842331171035767
30.521796941757202
训练次数:2100,Loss:1.498270034790039
31.60054850578308
训练次数:2200,Loss:1.479935646057129
32.69549083709717
训练次数:2300,Loss:1.7259459495544434
整体测试集上的Loss:261.9053739309311
整体测试集上的正确率:0.3955000042915344
模型已保存
-----第 4 轮训练开始-----
35.35346078872681
训练次数:2400,Loss:1.7560359239578247
36.50753092765808
训练次数:2500,Loss:1.3551620244979858
37.62624526023865
训练次数:2600,Loss:1.583783745765686
38.73269581794739
训练次数:2700,Loss:1.6835883855819702
39.81805419921875
训练次数:2800,Loss:1.5066486597061157
40.89897561073303
训练次数:2900,Loss:1.6178346872329712
41.978501081466675
训练次数:3000,Loss:1.3419572114944458
43.079394578933716
训练次数:3100,Loss:1.5225186347961426
整体测试集上的Loss:253.58813428878784
整体测试集上的正确率:0.4153999984264374
模型已保存
-----第 5 轮训练开始-----
45.72289848327637
训练次数:3200,Loss:1.3623679876327515
46.82145309448242
训练次数:3300,Loss:1.4360203742980957
47.88934278488159
训练次数:3400,Loss:1.5007973909378052
48.98452544212341
训练次数:3500,Loss:1.5463669300079346
50.044403076171875
训练次数:3600,Loss:1.6122682094573975
51.145737409591675
训练次数:3700,Loss:1.3164969682693481
52.224546670913696
训练次数:3800,Loss:1.2721624374389648
53.316651582717896
训练次数:3900,Loss:1.4059081077575684
整体测试集上的Loss:243.6600570678711
整体测试集上的正确率:0.43849998712539673
模型已保存
-----第 6 轮训练开始-----
55.939093828201294
训练次数:4000,Loss:1.3896945714950562
57.10062837600708
训练次数:4100,Loss:1.4203869104385376
58.1853346824646
训练次数:4200,Loss:1.5092504024505615
59.27726936340332
训练次数:4300,Loss:1.2549546957015991
60.38215517997742
训练次数:4400,Loss:1.1557636260986328
61.462907552719116
训练次数:4500,Loss:1.3356294631958008
62.57123851776123
训练次数:4600,Loss:1.4316595792770386
整体测试集上的Loss:233.62617886066437
整体测试集上的正确率:0.45909997820854187
模型已保存
-----第 7 轮训练开始-----
65.19007658958435
训练次数:4700,Loss:1.2923930883407593
66.32417273521423
训练次数:4800,Loss:1.514396071434021
67.48048806190491
训练次数:4900,Loss:1.3450605869293213
68.62122654914856
训练次数:5000,Loss:1.4084830284118652
69.71917247772217
训练次数:5100,Loss:0.9838876724243164
70.81213164329529
训练次数:5200,Loss:1.2724872827529907
71.89973473548889
训练次数:5300,Loss:1.24579656124115
73.00568556785583
训练次数:5400,Loss:1.3361798524856567
整体测试集上的Loss:224.09909868240356
整体测试集上的正确率:0.4838999807834625
模型已保存
-----第 8 轮训练开始-----
75.59451961517334
训练次数:5500,Loss:1.1921392679214478
76.7000367641449
训练次数:5600,Loss:1.2488406896591187
77.77421236038208
训练次数:5700,Loss:1.1721949577331543
78.86560225486755
训练次数:5800,Loss:1.2595291137695312
79.94558382034302
训练次数:5900,Loss:1.3135168552398682
81.05635809898376
训练次数:6000,Loss:1.5763839483261108
82.18682670593262
训练次数:6100,Loss:0.9930293560028076
83.2471137046814
训练次数:6200,Loss:1.078225016593933
整体测试集上的Loss:212.63363873958588
整体测试集上的正确率:0.5137999653816223
模型已保存
-----第 9 轮训练开始-----
85.80370163917542
训练次数:6300,Loss:1.3991423845291138
86.89490747451782
训练次数:6400,Loss:1.1313153505325317
87.96531939506531
训练次数:6500,Loss:1.629166841506958
89.07308554649353
训练次数:6600,Loss:1.0727297067642212
90.15298676490784
训练次数:6700,Loss:1.082014799118042
91.23814225196838
训练次数:6800,Loss:1.1563323736190796
92.33663129806519
训练次数:6900,Loss:1.1622871160507202
93.4073634147644
训练次数:7000,Loss:0.9779142141342163
整体测试集上的Loss:203.43007349967957
整体测试集上的正确率:0.5370000004768372
模型已保存
-----第 10 轮训练开始-----
96.12465476989746
训练次数:7100,Loss:1.284026861190796
97.21656942367554
训练次数:7200,Loss:1.000484824180603
98.30963373184204
训练次数:7300,Loss:1.09619140625
99.4168176651001
训练次数:7400,Loss:0.843334436416626
100.56277847290039
训练次数:7500,Loss:1.2291951179504395
101.66866254806519
训练次数:7600,Loss:1.2535988092422485
102.83877515792847
训练次数:7700,Loss:0.9017428755760193
103.93982768058777
训练次数:7800,Loss:1.237086534500122
整体测试集上的Loss:195.0189254283905
整体测试集上的正确率:0.560699999332428
模型已保存
-----第 11 轮训练开始-----
106.55706119537354
训练次数:7900,Loss:1.4266151189804077
107.71211099624634
训练次数:8000,Loss:1.1279882192611694
108.82028222084045
训练次数:8100,Loss:1.0164259672164917
109.90560793876648
训练次数:8200,Loss:1.326285719871521
111.01533007621765
训练次数:8300,Loss:1.2919878959655762
112.09464716911316
训练次数:8400,Loss:1.1172809600830078
113.18349170684814
训练次数:8500,Loss:1.238521695137024
114.26246976852417
训练次数:8600,Loss:0.9506199359893799
整体测试集上的Loss:189.5619250535965
整体测试集上的正确率:0.5791000127792358
模型已保存
-----第 12 轮训练开始-----
116.91842579841614
训练次数:8700,Loss:1.2369173765182495
117.99103927612305
训练次数:8800,Loss:1.364282250404358
119.09814977645874
训练次数:8900,Loss:1.0267009735107422
120.21280121803284
训练次数:9000,Loss:1.1791435480117798
121.33650541305542
训练次数:9100,Loss:1.088217854499817
122.4616470336914
训练次数:9200,Loss:1.0550415515899658
123.55414509773254
训练次数:9300,Loss:1.1007109880447388
整体测试集上的Loss:185.11176592111588
整体测试集上的正确率:0.5916999578475952
模型已保存
-----第 13 轮训练开始-----
126.1269052028656
训练次数:9400,Loss:0.9525507688522339
127.21744632720947
训练次数:9500,Loss:1.326805830001831
128.30660438537598
训练次数:9600,Loss:1.1132607460021973
129.3770444393158
训练次数:9700,Loss:1.107414960861206
130.55656147003174
训练次数:9800,Loss:0.9924419522285461
131.65843152999878
训练次数:9900,Loss:0.9918938279151917
132.75958061218262
训练次数:10000,Loss:0.9259409308433533
133.84795117378235
训练次数:10100,Loss:0.9180102944374084
整体测试集上的Loss:181.06443816423416
整体测试集上的正确率:0.6044999957084656
模型已保存
-----第 14 轮训练开始-----
136.49927639961243
训练次数:10200,Loss:0.8106740117073059
137.60312509536743
训练次数:10300,Loss:0.9383634924888611
138.7491099834442
训练次数:10400,Loss:1.1004360914230347
139.85301280021667
训练次数:10500,Loss:0.7797534465789795
140.99656891822815
训练次数:10600,Loss:0.9295462965965271
142.11146521568298
训练次数:10700,Loss:0.7535973787307739
143.27931904792786
训练次数:10800,Loss:0.8077783584594727
144.41241145133972
训练次数:10900,Loss:0.9719076752662659
整体测试集上的Loss:177.12851840257645
整体测试集上的正确率:0.6136999726295471
模型已保存
-----第 15 轮训练开始-----
147.15464234352112
训练次数:11000,Loss:1.2142902612686157
148.30661296844482
训练次数:11100,Loss:0.8816019892692566
149.50865268707275
训练次数:11200,Loss:1.0662524700164795
150.67739176750183
训练次数:11300,Loss:1.1508761644363403
151.86311507225037
训练次数:11400,Loss:0.7579834461212158
153.0713450908661
训练次数:11500,Loss:1.0883594751358032
154.2581102848053
训练次数:11600,Loss:0.9534128308296204
155.4750611782074
训练次数:11700,Loss:0.89979088306427
整体测试集上的Loss:173.94284933805466
整体测试集上的正确率:0.6227999925613403
模型已保存
-----第 16 轮训练开始-----
158.27037262916565
训练次数:11800,Loss:0.9032186269760132
159.4713671207428
训练次数:11900,Loss:0.9124546647071838
160.67075204849243
训练次数:12000,Loss:0.8445446491241455
161.83198595046997
训练次数:12100,Loss:0.955165684223175
162.96881914138794
训练次数:12200,Loss:0.9986395239830017
164.14015531539917
训练次数:12300,Loss:0.9039932489395142
165.3250858783722
训练次数:12400,Loss:0.8506217002868652
166.47599816322327
训练次数:12500,Loss:0.6279873251914978
整体测试集上的Loss:172.14941000938416
整体测试集上的正确率:0.6277999877929688
模型已保存
-----第 17 轮训练开始-----
169.21585369110107
训练次数:12600,Loss:0.7518970966339111
170.3824064731598
训练次数:12700,Loss:0.9215213656425476
171.5670850276947
训练次数:12800,Loss:0.8257154226303101
172.7262568473816
训练次数:12900,Loss:1.0514277219772339
173.88416504859924
训练次数:13000,Loss:0.989711582660675
175.0773892402649
训练次数:13100,Loss:0.6482387185096741
176.22362112998962
训练次数:13200,Loss:0.770613968372345
整体测试集上的Loss:170.60762631893158
整体测试集上的正确率:0.6316999793052673
模型已保存
-----第 18 轮训练开始-----
178.91316437721252
训练次数:13300,Loss:0.9861776232719421
180.09528851509094
训练次数:13400,Loss:0.7526777386665344
181.2844262123108
训练次数:13500,Loss:0.8348026275634766
182.45123887062073
训练次数:13600,Loss:1.4109115600585938
183.62940311431885
训练次数:13700,Loss:0.7218388915061951
184.82756924629211
训练次数:13800,Loss:0.972119927406311
186.01035046577454
训练次数:13900,Loss:0.6937052607536316
187.19038343429565
训练次数:14000,Loss:0.7990372180938721
整体测试集上的Loss:168.84090358018875
整体测试集上的正确率:0.6358000040054321
模型已保存
-----第 19 轮训练开始-----
189.9926517009735
训练次数:14100,Loss:1.0224566459655762
191.18131160736084
训练次数:14200,Loss:0.8821209073066711
192.36730790138245
训练次数:14300,Loss:0.8973230123519897
193.5643389225006
训练次数:14400,Loss:0.9536952376365662
194.80951523780823
训练次数:14500,Loss:0.8836072087287903
196.0265154838562
训练次数:14600,Loss:1.071815013885498
197.24265241622925
训练次数:14700,Loss:0.8254064321517944
198.45570874214172
训练次数:14800,Loss:1.2353284358978271
整体测试集上的Loss:168.32685685157776
整体测试集上的正确率:0.6360999941825867
模型已保存
-----第 20 轮训练开始-----
201.18919134140015
训练次数:14900,Loss:0.6770450472831726
202.36627554893494
训练次数:15000,Loss:0.8657706379890442
203.52704691886902
训练次数:15100,Loss:0.7141180634498596
204.7052822113037
训练次数:15200,Loss:0.9444342851638794
205.86877846717834
训练次数:15300,Loss:0.6069492101669312
207.05544352531433
训练次数:15400,Loss:0.8864141702651978
208.22029948234558
训练次数:15500,Loss:0.9243060946464539
209.3724765777588
训练次数:15600,Loss:0.771957516670227
整体测试集上的Loss:168.21677833795547
整体测试集上的正确率:0.6384999752044678
模型已保存
-----第 21 轮训练开始-----
212.11495280265808
训练次数:15700,Loss:0.7191241979598999
213.31386590003967
训练次数:15800,Loss:0.9433155655860901
214.48469805717468
训练次数:15900,Loss:0.9915865063667297
215.691748380661
训练次数:16000,Loss:0.8580103516578674
216.85657501220703
训练次数:16100,Loss:0.7295430302619934
218.0546896457672
训练次数:16200,Loss:0.9427600502967834
219.23864316940308
训练次数:16300,Loss:0.6932554244995117
220.4110939502716
训练次数:16400,Loss:0.6746671199798584
整体测试集上的Loss:168.7458095550537
整体测试集上的正确率:0.6385999917984009
模型已保存
-----第 22 轮训练开始-----
223.20479941368103
训练次数:16500,Loss:0.8732750415802002
224.390287399292
训练次数:16600,Loss:0.9297986626625061
225.5694763660431
训练次数:16700,Loss:0.9048570990562439
226.78037357330322
训练次数:16800,Loss:0.76099693775177
227.9262249469757
训练次数:16900,Loss:0.6679417490959167
229.11014795303345
训练次数:17000,Loss:1.181579828262329
230.29246425628662
训练次数:17100,Loss:0.6620275974273682
231.493239402771
训练次数:17200,Loss:0.664097249507904
整体测试集上的Loss:169.8609937429428
整体测试集上的正确率:0.637499988079071
模型已保存
-----第 23 轮训练开始-----
234.27106308937073
训练次数:17300,Loss:0.8724012970924377
235.45661783218384
训练次数:17400,Loss:0.9425235390663147
236.64662623405457
训练次数:17500,Loss:0.7269912958145142
237.86503314971924
训练次数:17600,Loss:0.7194119691848755
239.01475381851196
训练次数:17700,Loss:0.7852820754051208
240.1758153438568
训练次数:17800,Loss:0.7733107805252075
241.3398380279541
训练次数:17900,Loss:0.8076053261756897
整体测试集上的Loss:170.6863653063774
整体测试集上的正确率:0.6371999979019165
模型已保存
-----第 24 轮训练开始-----
244.07902574539185
训练次数:18000,Loss:0.8552568554878235
245.25485038757324
训练次数:18100,Loss:0.5549949407577515
246.44470381736755
训练次数:18200,Loss:0.8132153153419495
247.62908339500427
训练次数:18300,Loss:0.6714959144592285
248.79626488685608
训练次数:18400,Loss:0.6672235131263733
249.95225954055786
训练次数:18500,Loss:0.800999641418457
251.13182163238525
训练次数:18600,Loss:0.5262686610221863
252.3044810295105
训练次数:18700,Loss:0.7499000430107117
整体测试集上的Loss:171.33498692512512
整体测试集上的正确率:0.6376999616622925
模型已保存
-----第 25 轮训练开始-----
255.06015586853027
训练次数:18800,Loss:0.7402669191360474
256.21373891830444
训练次数:18900,Loss:0.5978196263313293
257.404180765152
训练次数:19000,Loss:0.6754338145256042
258.59692668914795
训练次数:19100,Loss:0.5589580535888672
259.7701075077057
训练次数:19200,Loss:0.531922459602356
260.9389097690582
训练次数:19300,Loss:0.7425826787948608
262.1200385093689
训练次数:19400,Loss:0.8776072859764099
263.30342960357666
训练次数:19500,Loss:0.6360160112380981
整体测试集上的Loss:171.71832472085953
整体测试集上的正确率:0.637499988079071
模型已保存
-----第 26 轮训练开始-----
266.00391364097595
训练次数:19600,Loss:0.8082662224769592
267.1639335155487
训练次数:19700,Loss:0.6162960529327393
268.3373336791992
训练次数:19800,Loss:0.876618504524231
269.5011901855469
训练次数:19900,Loss:0.9085995554924011
270.68650460243225
训练次数:20000,Loss:0.8501061797142029
271.9259281158447
训练次数:20100,Loss:0.8174670934677124
273.12516808509827
训练次数:20200,Loss:1.0724962949752808
274.32264852523804
训练次数:20300,Loss:0.6343507170677185
整体测试集上的Loss:172.47045278549194
整体测试集上的正确率:0.6394000053405762
模型已保存
-----第 27 轮训练开始-----
277.1573736667633
训练次数:20400,Loss:0.6540669798851013
278.33781147003174
训练次数:20500,Loss:0.5897015929222107
279.5300703048706
训练次数:20600,Loss:0.4914679527282715
280.6773886680603
训练次数:20700,Loss:0.7035619616508484
281.8361291885376
训练次数:20800,Loss:0.5401226878166199
282.99849557876587
训练次数:20900,Loss:0.6221712231636047
284.17470717430115
训练次数:21000,Loss:0.8537976741790771
285.3701333999634
训练次数:21100,Loss:0.7092658877372742
整体测试集上的Loss:173.46831703186035
整体测试集上的正确率:0.6399999856948853
模型已保存
-----第 28 轮训练开始-----
288.0989239215851
训练次数:21200,Loss:0.8174431324005127
289.24120450019836
训练次数:21300,Loss:0.68904709815979
290.4222309589386
训练次数:21400,Loss:0.7744821906089783
291.613312959671
训练次数:21500,Loss:0.5719355940818787
292.80280566215515
训练次数:21600,Loss:0.6388695240020752
294.0078239440918
训练次数:21700,Loss:0.8393858671188354
295.1911723613739
训练次数:21800,Loss:0.6933169364929199
整体测试集上的Loss:173.1854910850525
整体测试集上的正确率:0.6428999900817871
模型已保存
-----第 29 轮训练开始-----
297.9738895893097
训练次数:21900,Loss:0.4256139099597931
299.17603182792664
训练次数:22000,Loss:0.6538084149360657
300.3422214984894
训练次数:22100,Loss:0.8267297744750977
301.52275681495667
训练次数:22200,Loss:0.42121270298957825
302.7328658103943
训练次数:22300,Loss:0.5014783143997192
303.91381192207336
训练次数:22400,Loss:0.7099611759185791
305.09802865982056
训练次数:22500,Loss:0.8721457719802856
306.2816848754883
训练次数:22600,Loss:0.3300861120223999
整体测试集上的Loss:174.15364342927933
整体测试集上的正确率:0.6452999711036682
模型已保存
-----第 30 轮训练开始-----
309.065292596817
训练次数:22700,Loss:0.733674168586731
310.248877286911
训练次数:22800,Loss:0.6733675003051758
311.45992732048035
训练次数:22900,Loss:0.7449073791503906
312.6487421989441
训练次数:23000,Loss:0.6279532313346863
313.82962799072266
训练次数:23100,Loss:0.5574349761009216
315.03411650657654
训练次数:23200,Loss:0.6098644733428955
316.20984983444214
训练次数:23300,Loss:0.7981359362602234
317.3920772075653
训练次数:23400,Loss:0.5183050036430359
整体测试集上的Loss:174.22026354074478
整体测试集上的正确率:0.6488999724388123
模型已保存

 14.2 验证狗是否识别

① 完整的模型验证(测试,demo)套路,利用已经训练好的模型,然后给它提供输入。

import torchvision
from PIL import Image
from torch import nn
import torch

image_path = "imgs/dog.png"
image = Image.open(image_path) # PIL类型的Image
image = image.convert("RGB")  # 4通道的RGBA转为3通道的RGB图片
print(image)

transform = torchvision.transforms.Compose([torchvision.transforms.Resize((32,32)),   
                                            torchvision.transforms.ToTensor()])

image = transform(image)
print(image.shape)

class Tudui(nn.Module):
    def __init__(self):
        super(Tudui, self).__init__()        
        self.model1 = nn.Sequential(
            nn.Conv2d(3,32,5,1,2),
            nn.MaxPool2d(2),
            nn.Conv2d(32,32,5,1,2),
            nn.MaxPool2d(2),
            nn.Conv2d(32,64,5,1,2),
            nn.MaxPool2d(2),
            nn.Flatten(),
            nn.Linear(64*4*4,64),
            nn.Linear(64,10)
        )
        
    def forward(self, x):
        x = self.model1(x)
        return x

model = torch.load("model/tudui_29.pth",map_location=torch.device('cpu')) # GPU上训练的东西映射到CPU上    
print(model)
image = torch.reshape(image,(1,3,32,32)) # 转为四维,符合网络输入需求
model.eval()
with torch.no_grad():  # 不进行梯度计算,减少内存计算
    output = model(image)
output = model(image)
print(output)
print(output.argmax(1)) # 概率最大类别的输出

结果:

<PIL.Image.Image image mode=RGB size=307x173 at 0x1A23417EDA0>
torch.Size([3, 32, 32])
Tudui(
  (model1): Sequential(
    (0): Conv2d(3, 32, kernel_size=(5, 5), stride=(1, 1), padding=(2, 2))
    (1): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)
    (2): Conv2d(32, 32, kernel_size=(5, 5), stride=(1, 1), padding=(2, 2))
    (3): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)
    (4): Conv2d(32, 64, kernel_size=(5, 5), stride=(1, 1), padding=(2, 2))
    (5): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)
    (6): Flatten(start_dim=1, end_dim=-1)
    (7): Linear(in_features=1024, out_features=64, bias=True)
    (8): Linear(in_features=64, out_features=10, bias=True)
  )
)
tensor([[ 1.3921, -5.8952,  6.7765,  2.6106,  3.3179,  6.3351, -5.1229,  3.0367,
         -8.6725, -5.5459]], grad_fn=<AddmmBackward0>)
tensor([2])

14.3  验证飞机是否识别

import torchvision
from PIL import Image
from torch import nn
import torch

image_path = "imgs/plane.png"
image = Image.open(image_path) # PIL类型的Image
image = image.convert("RGB")  # 4通道的RGBA转为3通道的RGB图片
print(image)

transform = torchvision.transforms.Compose([torchvision.transforms.Resize((32,32)),   
                                            torchvision.transforms.ToTensor()])

image = transform(image)
print(image.shape)

class Tudui(nn.Module):
    def __init__(self):
        super(Tudui, self).__init__()        
        self.model1 = nn.Sequential(
            nn.Conv2d(3,32,5,1,2),
            nn.MaxPool2d(2),
            nn.Conv2d(32,32,5,1,2),
            nn.MaxPool2d(2),
            nn.Conv2d(32,64,5,1,2),
            nn.MaxPool2d(2),
            nn.Flatten(),
            nn.Linear(64*4*4,64),
            nn.Linear(64,10)
        )
        
    def forward(self, x):
        x = self.model1(x)
        return x

model = torch.load("model/tudui_29.pth",map_location=torch.device('cpu')) # GPU上训练的东西映射到CPU上    
print(model)
image = torch.reshape(image,(1,3,32,32)) # 转为四维,符合网络输入需求
model.eval()
with torch.no_grad():  # 不进行梯度计算,减少内存计算
    output = model(image)
output = model(image)
print(output)
print(output.argmax(1)) # 概率最大类别的输出

结果:

 

<PIL.Image.Image image mode=RGB size=245x181 at 0x1A236055908>
torch.Size([3, 32, 32])
Tudui(
  (model1): Sequential(
    (0): Conv2d(3, 32, kernel_size=(5, 5), stride=(1, 1), padding=(2, 2))
    (1): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)
    (2): Conv2d(32, 32, kernel_size=(5, 5), stride=(1, 1), padding=(2, 2))
    (3): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)
    (4): Conv2d(32, 64, kernel_size=(5, 5), stride=(1, 1), padding=(2, 2))
    (5): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)
    (6): Flatten(start_dim=1, end_dim=-1)
    (7): Linear(in_features=1024, out_features=64, bias=True)
    (8): Linear(in_features=64, out_features=10, bias=True)
  )
)
tensor([[ 3.9218,  1.2536,  1.1701,  0.1064,  2.2779, -4.4623,  0.0393, -4.2867,
          2.3805, -2.1321]], grad_fn=<AddmmBackward0>)
tensor([0])

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/937594.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

第七周第六天学习总结 | MySQL入门及练习学习第一天

实操练习&#xff1a; 1.查看数据库 2.查询当前数据库 3.创建一个名为 lianxi 的数据库 4.删除一个名为 shanchu 的数据库&#xff08;如果存在就删除&#xff0c;不存在不删除&#xff09; 5.切换至 lianxi 数据库下&#xff0c;并验证 6.查询 lainxi 数据库下的所有数据…

DMK5框选变量之后不显示其他位置的此变量高亮

使用软件MDK5.3.8版本 如下在2的位置选择之后&#xff0c;其他同样的变量没有高亮&#xff0c;因为1的原因折叠了&#xff1b; 展开折叠之后就可以了

Android学习之路(10) setContentView详解

一、简介 setContentView我们在Activity中经常见到&#xff0c;它的作用就是把我们的布局文件放在Activity中显示&#xff0c;下面我们根据源码分析setContentView是如何做到的 二、源码分析 1.两种setContentView 注意Activity的setContentView和AppCompatActivity的setCo…

【SpringBoot】如何使用 HandlerInterceptor 拦截器? 为什么不使用 SpingAOP ?

文章目录 前言一、为什么不使用 SpringAOP ?1, 需求分析2, SpringAOP 能实现吗? 二、使用 HandlerInterceptor1, 实现 HandlerInterceptor 接口2, 将自定义拦截器加入到系统配置 三、HandlerInterceptor 实现原理源码分析 总结 前言 各位读者好, 我是小陈, 这是我的个人主页,…

基于全新电脑环境安装pytorch的GPU版本

前言&#xff1a; 距离第一次安装深度学习的GPU环境已经过去了4年多&#xff08;当时TensorFlow特别麻烦&#xff09;&#xff0c;现在发现安装pytorch的GPU版本还是很简单方便的&#xff0c;流程记录如下。 安装步骤&#xff1a; 步骤一&#xff1a;官网下载Anaconda Free…

【无法联网】电脑wifi列表为空的解决方案

打开电脑, 发现wifi列表为空, 点击设置显示未连接 首先检查是不是网卡驱动有问题, cmd, devmgmt.msc 找到网络适配器, 看看网卡前面是否有感叹号, 如果没有则说明网卡没问题, 有问题则重装驱动 看看网络协议是否设置正确 找到"控制面板\所有控制面板项\网络和共享中心&…

微服务通信[HTTP|RPC同步通信、MQ异步通信]

概念 A服务调用B服务,B服务调C服务,C服务调D服务,即微服务之间的通信(也可以叫微服务之间的调用) HTTP同步通信 一种轻量级的通信协议,常用于在不同的微服务之间进行通信,也是最简单的通信方式使用REST ful为开发规范&#xff0c;将服务对外暴露的HTTP调用方式为REST API(如GET…

飞腾FT-2000/4、D2000 log报错指导(3)

在爱好者群中遇见了很多的固件问题,这里总结记录了大家的交流内容和调试心得。主要是飞腾桌面CPU FT-2000/4 D2000相关的,包含uboot和UEFI。希望对大家调试有所帮助。 这个专题会持续更新,凑够一些就发。 23 在s3 唤醒时报错如下 check suspend ,Platform exception report…

你对SPA单页面的理解,它的优缺点分别是什么?如何实现SPA应用呢?

一、什么是SPA SPA&#xff08;single-page application&#xff09;&#xff0c;翻译过来就是单页应用SPA是一种网络应用程序或网站的模型&#xff0c;它通过动态重写当前页面来与用户交互&#xff0c;这种方法避免了页面之间切换打断用户体验在单页应用中&#xff0c;所有必…

【kubernetes】使用KubeSphere devops部署我的微服务系统

KubeSphere Devops 入门使用KubeSphere的Devops功能部署"我的微服务系统" &#xff08;内容学习于尚硅谷云原生课程&#xff09; kubesphere devops官方文档&#xff1a; https://v3-1.docs.kubesphere.io/zh/docs/devops-user-guide/how-to-use/create-a-pipeline-u…

nginx调优(二)

一、event模块: 用于配置服务器的事件驱动机制的模块。它定义了 Nginx 如何处理并发连接和网络事件&#xff0c;以及如何与底层操作系统的事件机制交互。 1.最大并发连接数&#xff1a; worker_connections 65536; 2.选择事件驱动&#xff1a; nginx默认使用epoll时间驱动类…

【Java】Java基础

环境准备 安装JDK和JRE 下载JDK&#xff0c;可以在官网Java Downloads | Oracle 中国下载&#xff0c;但是这里需要注册才能够下载。在Index of java-local/jdk (huaweicloud.com)也可以下载到&#xff0c;但是版本比较老&#xff0c;关系不大&#xff0c;直接下载&#xff0…

OpenGL-入门-BMP像素图glReadPixels

glReadPixels函数用于从帧缓冲区中读取像素数据。它可以用来获取屏幕上特定位置的像素颜色值或者获取一块区域内的像素数据。下面是该函数的基本语法&#xff1a; void glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid *da…

【Kafka】Kafka Stream简单使用

一、实时流式计算 1. 概念 一般流式计算会与批量计算相比较。在流式计算模型中&#xff0c;输入是持续的&#xff0c;可以认为在时间上是无界的&#xff0c;也就意味着&#xff0c;永远拿不到全量数据去做计算。同时&#xff0c;计算结果是持续输出的&#xff0c;也即计算结果…

微信小程序 基于Android的美容理发师预约管理系统

&#xff0c;本系统主要根据管理员、用户及理发师的实际需要&#xff0c;方便用户利用互联网实现对商品信息进行立即订购&#xff0c;同时让管理者可以通过这个系统对用户实际需求以及各信息进行管理。设计该系统主要目的是为了方便用户、理发师可以有一个非常好的平台体验&…

Mac下Docker Desktop开启本地远程访问

mac系统下&#xff0c;为了在idea里方便使用docker&#xff0c;需要开启Docker Desktop本地远程访问。 开启方法是在设置-高级下&#xff0c;开启“Allow the default Docker socket to be used (requires password)”&#xff0c;特此记录一下&#xff1a; 开启后的效果&…

iOS swift5 扫描二维码

文章目录 1.生成二维码图片2.扫描二维码&#xff08;含上下扫描动画&#xff09;2.1 记得在info.plist中添加相机权限描述 1.生成二维码图片 import UIKit import CoreImagefunc generateQRCode(from string: String) -> UIImage? {let data string.data(using: String.En…

计算机视觉:深层卷积神经网络的构建

本文重点 上一节课程中我们学习了单卷积层的前向传播,本次课程我们构建一个具有三个卷积层的卷积神经网络,然后从输入(39*39*3)开始进行三次卷积操作,我们来看一下每次卷积的输入和输出维度的变化。 第一层 第一层使用3*3*3的过滤器来提取特征,那么f[1]=3,然后步长s[…

4. 池化层相关概念

4.1 池化层原理 ① 最大池化层有时也被称为下采样。 ② dilation为空洞卷积&#xff0c;如下图所示。 ③ Ceil_model为当超出区域时&#xff0c;只取最左上角的值。 ④ 池化使得数据由5 * 5 变为3 * 3,甚至1 * 1的&#xff0c;这样导致计算的参数会大大减小。例如1080P的电…

PHP8的匿名函数-PHP8知识详解

php 8引入了匿名函数&#xff08;Anonymous Functions&#xff09;&#xff0c;它是一种创建短生命周期的函数&#xff0c;不需要命名&#xff0c;并且可以在其作用域内直接使用。以下是在PHP 8中使用匿名函数的知识要点&#xff1a; 1、创建匿名函数&#xff0c;语法格式如下&…