1.数据集
本文数据集采用的是CIFAR10数据集,可以直接使用下面的代码进行下载,其中“root”是指数据集的下载路径,你可以选择一个合适的路径进行保存,“train”设置为True,就代表此数据集为训练集,你若想将此数据集通过以下方式定义成测试集,则需要将“train”设置为Flase。最后,“download”所代表的意思就是是否下载,当你设置为True时,python将会根据它所在的下载地址对此数据集进行下载。
import torchvision
torchvision.datasets.CIFAR10(root="../dataset",train=True,download=True)
当你运行代码时会出现下图所示的内容,也意味着数据集开始下载。
如果下载速度很慢,你也可以直接通过下面的网址对CIFAR10数据集进行下载:https://www.cs.toronto.edu/~kriz/cifar-10-python.tar.gz。
2.模型构造
随机选取一张卷积神经网络的模型。如图所示,该模型含有两个卷积层,两个池化层(采样层)以及三个线性层。

构造此模型的代码如下:
import torch
from torch import nn
class YY(nn.Module):
def __init__(self):
super(YY,self).__init__()
self.YY = nn.Sequential(
nn.Conv2d(3,64,5,1,0),
nn.MaxPool2d(2),
nn.Conv2d(64,64,5,1,0),
nn.MaxPool2d(2),
nn.Flatten(),
nn.Linear(64*5*5,1024),
nn.Linear(1024,512),
nn.Linear(512,10)
)
def forward(self,x):
x = self.YY(x)
return x
我们通过输入一个4维矩阵对模型进行检测:
if __name__ == '__main__':
yy = YY()
input = torch.ones((64, 3, 32, 32))
output = yy(input)
print(output.shape)
结果显示为:torch.Size([64, 10]),证明我们的模型构造成功。
完整代码:
import torch
from torch import nn
class YY(nn.Module):
def __init__(self):
super(YY,self).__init__()
self.YY = nn.Sequential(
nn.Conv2d(3,64,5,1,0),
nn.MaxPool2d(2),
nn.Conv2d(64,64,5,1,0),
nn.MaxPool2d(2),
nn.Flatten(),
nn.Linear(64*5*5,1024),
nn.Linear(1024,512),
nn.Linear(512,10)
)
def forward(self,x):
x = self.YY(x)
return x
if __name__ == '__main__':
yy = YY()
input = torch.ones((64, 3, 32, 32))
output = yy(input)
print(output.shape)
3.主函数
主函数中,调用了刚刚所构建的模型,我这里命名的是“P9_model”。
其中,还涵盖了损失函数与优化器的知识,恕我能力有限,不能复现知识点,大家可以自行去找up学习,我是通过小土堆的课程学习的。
import torchvision
from torch.utils.data import DataLoader
from P9_model import *
import time
from torch.utils.tensorboard import SummaryWriter
device = torch.device("cpu")
train_data = torchvision.datasets.CAIFR10(root="D:\\python-pycharm\\python1\\learn-torch",
download=False,
train=True,
transform=torchvision.transforms.ToTensor())
test_data = torchvision.datasets.CIFAR10(root="D:\\python-pycharm\\python1\\learn-torch",
download=False,
train=False,
transform=torchvision.transforms.ToTensor())
train_data_size = len(train_data) # 训练数据集大小
test_data_size = len(test_data) # 测试数据集大小
print(train_data_size, test_data_size)
train_loader = DataLoader(train_data, batch_size=64) # 创建训练数据加载器,每次批量大小为64
test_loader = DataLoader(test_data, batch_size=64) # 创建测试数据加载器,每次批量大小为64
yy = YY() # 创建模型实例
writer = SummaryWriter("../YY") # 创建TensorBoard的SummaryWriter来记录训练过程的指标
start_time = time.time() # 记录开始时间
loss_fn = nn.CrossEntropyLoss() # 使用交叉熵损失函数
loss_fn = loss_fn.to(device) # 将损失函数移动到指定的设备(如GPU)
lr = 1e-2 # 学习率设为0.01
optimizer = torch.optim.SGD(yy.parameters(), lr=lr) # 使用随机梯度下降优化器来更新模型参数
epoch = 10 # 迭代次数设为10
total_train_data = 0 # 记录训练数据总数
total_test_data = 0 # 记录测试数据总数
for i in range(epoch):
print(f"----------第{i + 1}次训练开始啦-----------")
yy.train() # 设置模型为训练模式
for data in train_loader:
images, targets = data
images = images.to(device) # 将输入数据移动到指定的设备
targets = targets.to(device) # 将目标标签移动到指定的设备
outputs = yy(images) # 前向传播计算模型输出
loss = loss_fn(outputs, targets) # 计算损失函数值
optimizer.zero_grad() # 清除优化器中之前的梯度信息
loss.backward() # 反向传播计算梯度
optimizer.step()
total_train_data += 1 # 记录训练的数据总数
if total_train_data % 100 == 0:
end_time = time.time()
print(f"训练时间:{end_time - start_time}") # 打印训练时间
print(f"训练次数{total_train_data},损失函数{loss.item()}") # 打印训练次数和损失函数值
writer.add_scalar("训练的损失函数", loss.item(), total_train_data) # 将训练损失函数写入TensorBoard
yy.eval() # 设置模型为评估模式
total_loss = 0
total_accru = 0
for data in test_loader:
images, targets = data
images = images.to(device)
targets = targets.to(device)
outputs = yy(images)
loss = loss_fn(outputs, targets)
total_loss += loss.item()
accru = (outputs.argmax(1) == targets).sum()
total_accru += accru
print(f"准确率:{total_accru/test_data_size},总损失率{total_loss}") # 打印准确率和总损失值
writer.add_scalar("准确度", total_accru/test_data_size, total_test_data) # 将准确率写入TensorBoard
writer.add_scalar("总损失率", total_loss, total_test_data) # 将总损失值写入TensorBoard
total_test_data += 1
writer.close() # 关闭SummaryWriter
主函数结果:
50000 10000
----------第1次训练开始啦-----------
训练时间:3.9724860191345215
训练次数100,损失函数2.276435613632202
训练时间:7.841253280639648
训练次数200,损失函数2.2489755153656006
训练时间:11.66313099861145
训练次数300,损失函数2.1682040691375732
训练时间:15.507387638092041
训练次数400,损失函数2.094172716140747
训练时间:19.40891718864441
训练次数500,损失函数1.9727280139923096
训练时间:23.267868280410767
训练次数600,损失函数1.9223484992980957
训练时间:27.24072027206421
训练次数700,损失函数1.9256107807159424
准确率:0.299699991941452,总损失率302.81229186058044
----------第2次训练开始啦-----------
训练时间:34.732096433639526
训练次数800,损失函数1.805511236190796
训练时间:38.73979187011719
训练次数900,损失函数1.788206934928894
训练时间:42.59537220001221
训练次数1000,损失函数1.8408105373382568
训练时间:46.59530234336853
训练次数1100,损失函数1.9470363855361938
训练时间:50.512277364730835
训练次数1200,损失函数1.654102087020874
训练时间:54.603371143341064
训练次数1300,损失函数1.6233391761779785
训练时间:58.639466524124146
训练次数1400,损失函数1.6962523460388184
训练时间:62.600584983825684
训练次数1500,损失函数1.7613242864608765
准确率:0.32850000262260437,总损失率292.30203092098236
----------第3次训练开始啦-----------
训练时间:69.71140432357788
训练次数1600,损失函数1.7236456871032715
训练时间:73.98021173477173
训练次数1700,损失函数1.6672790050506592
训练时间:78.3222963809967
训练次数1800,损失函数1.9260023832321167
训练时间:82.51672601699829
训练次数1900,损失函数1.7738292217254639
训练时间:86.97837162017822
训练次数2000,损失函数1.8671265840530396
训练时间:91.23842883110046
训练次数2100,损失函数1.5284810066223145
训练时间:95.48541021347046
训练次数2200,损失函数1.4302921295166016
训练时间:99.36959028244019
训练次数2300,损失函数1.7731879949569702
准确率:0.35760000348091125,总损失率283.2099623680115
----------第4次训练开始啦-----------
训练时间:106.5154824256897
训练次数2400,损失函数1.682628870010376
训练时间:110.59124088287354
训练次数2500,损失函数1.3832463026046753
训练时间:114.7416124343872
训练次数2600,损失函数1.58444082736969
训练时间:118.8172435760498
训练次数2700,损失函数1.7114200592041016
训练时间:122.82209467887878
训练次数2800,损失函数1.5040576457977295
训练时间:126.74591946601868
训练次数2900,损失函数1.569387435913086
训练时间:130.6527397632599
训练次数3000,损失函数1.3376786708831787
训练时间:134.56908535957336
训练次数3100,损失函数1.5908355712890625
准确率:0.376800000667572,总损失率277.88472735881805
----------第5次训练开始啦-----------
训练时间:141.4279716014862
训练次数3200,损失函数1.389658808708191
训练时间:145.26955819129944
训练次数3300,损失函数1.458903431892395
训练时间:149.18317079544067
训练次数3400,损失函数1.5455760955810547
训练时间:153.26030373573303
训练次数3500,损失函数1.5971980094909668
训练时间:157.17457008361816
训练次数3600,损失函数1.505974292755127
训练时间:161.20330929756165
训练次数3700,损失函数1.3816202878952026
训练时间:165.23046278953552
训练次数3800,损失函数1.339166283607483
训练时间:169.3618187904358
训练次数3900,损失函数1.4765278100967407
准确率:0.4146000146865845,总损失率258.23039722442627
----------第6次训练开始啦-----------
训练时间:176.5527412891388
训练次数4000,损失函数1.4195077419281006
训练时间:180.59479689598083
训练次数4100,损失函数1.4328373670578003
训练时间:184.66511917114258
训练次数4200,损失函数1.5240048170089722
训练时间:188.70144128799438
训练次数4300,损失函数1.2635889053344727
训练时间:192.74799346923828
训练次数4400,损失函数1.1689330339431763
训练时间:196.82400512695312
训练次数4500,损失函数1.3999608755111694
训练时间:200.84697127342224
训练次数4600,损失函数1.4405158758163452
准确率:0.45239999890327454,总损失率239.68239903450012
----------第7次训练开始啦-----------
训练时间:207.8835973739624
训练次数4700,损失函数1.393955945968628
训练时间:211.71872806549072
训练次数4800,损失函数1.4930096864700317
训练时间:215.63428282737732
训练次数4900,损失函数1.3829665184020996
训练时间:220.1798129081726
训练次数5000,损失函数1.4071189165115356
训练时间:224.18939089775085
训练次数5100,损失函数1.0056394338607788
训练时间:228.21299052238464
训练次数5200,损失函数1.3724738359451294
训练时间:232.23436784744263
训练次数5300,损失函数1.2843453884124756
训练时间:236.29274225234985
训练次数5400,损失函数1.3414329290390015
准确率:0.48899999260902405,总损失率224.83289432525635
----------第8次训练开始啦-----------
训练时间:243.29300904273987
训练次数5500,损失函数1.3346641063690186
训练时间:247.3282768726349
训练次数5600,损失函数1.2040197849273682
训练时间:251.30813336372375
训练次数5700,损失函数1.275544285774231
训练时间:255.33866262435913
训练次数5800,损失函数1.2665075063705444
训练时间:259.3725600242615
训练次数5900,损失函数1.380377173423767
训练时间:263.344224691391
训练次数6000,损失函数1.5512028932571411
训练时间:267.3826677799225
训练次数6100,损失函数1.1214468479156494
训练时间:271.3046844005585
训练次数6200,损失函数1.1479671001434326
准确率:0.5159000158309937,总损失率213.43444454669952
----------第9次训练开始啦-----------
训练时间:278.432345867157
训练次数6300,损失函数1.4989665746688843
训练时间:282.3679988384247
训练次数6400,损失函数1.163705587387085
训练时间:286.2714464664459
训练次数6500,损失函数1.6224761009216309
训练时间:290.29247879981995
训练次数6600,损失函数1.2026243209838867
训练时间:294.4010901451111
训练次数6700,损失函数1.1328717470169067
训练时间:298.43686270713806
训练次数6800,损失函数1.1329436302185059
训练时间:302.5054211616516
训练次数6900,损失函数1.1687328815460205
训练时间:306.7130835056305
训练次数7000,损失函数0.8639121055603027
准确率:0.5271000266075134,总损失率207.35814094543457
----------第10次训练开始啦-----------
训练时间:314.07031893730164
训练次数7100,损失函数1.4895374774932861
训练时间:318.07846307754517
训练次数7200,损失函数1.0985983610153198
训练时间:322.38503193855286
训练次数7300,损失函数1.190627098083496
训练时间:326.3715617656708
训练次数7400,损失函数0.8941365480422974
训练时间:330.33964252471924
训练次数7500,损失函数1.3192877769470215
训练时间:334.3748257160187
训练次数7600,损失函数1.4395244121551514
训练时间:338.75562357902527
训练次数7700,损失函数0.9469640851020813
训练时间:343.0304262638092
训练次数7800,损失函数1.3025233745574951
准确率:0.5388000011444092,总损失率203.94464254379272
进程已结束,退出代码0
ps:其中使用了tensorboard对数据进行可视化,打开tensorboard的方法是,在终端输入:
tensorboard --dirlogs="YY"
即可打开tensorboard。这里的“YY”是我自己定义的名称,你们在使用时要换成自己定义的名称。
以下便是利用tensorboard对上述模型结果进行的数据可视化



本文使用Python和PyTorch进行卷积神经网络模型的构建与训练。采用CIFAR10数据集,介绍了数据集下载方法。构建含两个卷积层、两个池化层和三个线性层的模型,并进行检测。主函数调用模型训练,记录每次训练的时间、损失函数值和准确率,还使用tensorboard对结果可视化。


被折叠的 条评论
为什么被折叠?



