1.数据集的准备(官方Data–CIFAR10为例),主要包括两部分:train_data、test_data:
import 需要的包,小技巧:开始不知道用哪些包可以先不引用,输入命令后未引用的包下面会有红线警告,鼠标点击一下,然后 alt+enter会显示 需要引用的选项,选择即可。
train_data = torchvision.datasets.CIFAR10(root= r'D:\train_maskcsv\Tudui\data',train=True,transform=torchvision.transforms.ToTensor(),
download=True)
test_data = torchvision.datasets.CIFAR10(root= r'D:\train_maskcsv\Tudui\data',train=False,transform=torchvision.transforms.ToTensor(),
download=True)
小技巧:光标放在括号里,Ctrl+p 可以显示需要的参数类型。
参数解释:root 为数据集保存的地方,transform为要进行的Tensor处理,train=True 或Flase,该数据集是否为训练数据集,download=True,需要下载,一般都为True,如果路径里面存在该数据集运行时会提示已存在。
2.查看数据集大小、长度
数据集下载完成后,比如图片,我们一般会查看训练集、测试集中一下里面有多少张:
#数据长度
train_data_size = len(train_data)
test_data_size = len(test_data)
print('训练集数据长度:{}'.format(train_data_size))
print('测试集数据长度:{}'.format(test_data_size))
3.创建dataloader,dataloader的作用是 把数据集数据分批打包,喂给模型进行处理
#利用dataloader 加载
train_dataloader = DataLoader(train_data,batch_size=64,shuffle=True)
test_dataloader = DataLoader(test_data,batch_size=64,shuffle=False)
参数解释:batch_size为每一批进行处理的数量,shuffle为是否对数据进行打乱处理
4.创建模型
一般情况会新建一个model.py文件,专门存储模型文件:
import torch
from torch import nn
#模型名字叫 Tudui
class Tudui(nn.Module):
def __init__(self):
super(Tudui, self).__init__()
self.model = 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.model(x)
return x
if __name__ == '__main__':
tudui = Tudui()
input = torch.ones((64,3,32,32))
output = tudui(input)
print(output.shape)
5.引用模型
在train文件中引入刚才创建的模型文件Tudui:
from model import *
tudui = Tudui()
6.创建损失函数:
这里使用交叉熵函数
loss_fn = nn.CrossEntropyLoss()
7.选择优化器:SGD,学习率=0.001,Moment=0.9
optimizer = torch.optim.SGD(tudui.parameters(),lr=0.001,momentum=0.9)
8.设置训练过程中的一些参数:例如训练次数、测试次数、训练轮数、
#设置训练网络的参数
total_train_step = 0 #记录训练次数
total_test_step = 0 #记录测试的次数
epoch = 10 #记录训练的轮数
9.使用Tensorboard显示
writer = SummaryWriter('../logs_train')
10.准备训练过程:
for i in range(epoch):
print('-----第 {} 轮训练开始------'.format(i+1))
#训练步骤开始
for data in train_dataloader:
img, targets = data
outputs = tudui(img)
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:
print('训练次数:{} ,Loss: {} '.format(total_train_step,loss.item())) #item转变为真实数字类型
writer.add_scalar('train_loss',loss.item(),total_train_step)
#测试步骤开始
total_test_loss = 0
total_accuracy = 0
with torch.no_grad():
for data in test_dataloader:
img, targets = data
outputs = tudui(img)
loss = loss_fn(outputs,targets)
total_test_loss = total_test_loss + loss
accuracy = (outputs.argmax(1) == targets).sum()
total_accuracy = total_accuracy + accuracy
print('整体测试集上的Loss: {}'.format(total_test_loss.item()))
print('整体测试集上正确率: {}'.format((total_accuracy)/test_data_size))
writer.add_scalar('tset_loss',total_test_loss.item(),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,'tudui{}.pth'.format(i+1))
print('模型已保存')
writer.close() #记得关闭写入
11.总结,结束可以试着训练自己的数据集啦
声明:自己也是初学,很多也不专业,跟着B站土堆学的,,强烈推荐大家!!!!