调参侠带你入门深度学习:Lenet分类实战:训练与推理

Posted 神佑我调参侠

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了调参侠带你入门深度学习:Lenet分类实战:训练与推理相关的知识,希望对你有一定的参考价值。

前言

上篇文章中我们已经介绍了LeNet模型的搭建,这篇文章我们以CIFAR10这个数据集为例,来带大家体验一波深度学习的魅力!

CIFAR10 dataset介绍

它有以下类别: ‘airplane’, ‘automobile’, ‘bird’, ‘cat’, ‘deer’, ‘dog’, ‘frog’, ‘horse’, ‘ship’, ‘truck’. 并且是3X32X32的3通道图像。

加载数据

import torch
import torch.nn as nn
import torchvision
import numpy as np
import matplotlib.pyplot as plt
import torchvision.transforms as transforms
from model import Lenet
import torch.optim as optim #优化

#1.数据集处理
#预处理,to_tensor(whc->cwh,0~255->0~1),正则化处理
transform = transforms.Compose([transforms.ToTensor(),transforms.Normalize((0.5,0.5,0.5),(0.5,0.5,0.5))])
#训练数据集
trainset = torchvision.datasets.CIFAR10(root='./root',train=True,transform=transform,download=False)
#读取训练数据集
trainloader = torch.utils.data.DataLoader(trainset,batch_size=36,shuffle=True,num_workers=0)

#验证数据集
val_set = torchvision.datasets.CIFAR10(root='./root',train=False,download=False,transform=transform)
#读取验证数据集,5000?
val_dataloader = torch.utils.data.DataLoader(val_set,batch_size=4,shuffle=False,num_workers=0)

#生成迭代器
val_data_iter = iter(val_dataloader)
val_image,val_label = val_data_iter.next()

classes = ('plane','car','bird','cat','deer','dog','frog','horse','ship','truck')

def show(img):
	#标准化公式为 y=(x-0.5)/0.5 ,而这里的是反标准化:x=2y+0.5
	img = img / 2 + 0.5
	#转换为numpy格式
	nping = img.numpy()
	#在tensor中为chw,这里要变成hwc 所以为1,2,0
	plt.imshow(np.transpose(nping,(1,2,0)))
	plt.show()

print(''.join('%5s' % classes[val_label[j]] for j in range(4)))
show(torchvision.utils.make_grid(val_image))

训练

#2.加载模型
net = Lenet()

#3.定义损失函数(内置了softmax)和优化器
loss_func = nn.CrossEntropyLoss()
optimizer = optim.Adam(net.parameters(),lr=0.001)

#4.训练
#迭代轮数
for epoch in range(5):
	running_loss = 0.0
	#对训练数据集进行遍历,加上索引
	for step,data in enumerate(trainloader,start=0):
		#读入数据
		input,labels = data
		#梯度清零
		optimizer.zero_grad()
		#前向传播
		output = net(input)
		#计算损失
		loss = loss_func(output,labels)
		#反向传播
		loss.backward()
		#优化器优化,参数更新
		optimizer.step()

		running_loss = running_loss + loss.item()
		#每500次评估一下结果
		if step % 500 == 499:
			outputs = net(val_image)
			#获取最大的预测的位置,【1】表示位置,dim=1表示维度为1
			predict_y = torch.max(outputs,dim=1)[1]
			#.item()指从tensor中获取数据
			accuracy = torch.eq(predict_y,val_label).sum().item()/val_label.size(0)
			print('[%d,%5d] train_loss: %.3f test_accuracy: %.3f'%
					(epoch + 1,step + 1, running_loss / 500,accuracy))
			running_loss = 0.0

print('Finished Training!')
save_path='./Lenet.pth'
torch.save(net.state_dict(),save_path)

预测

import torch
import torchvision.transforms as transforms
from PIL import Image
from model import Lenet

#预处理
transform = transforms.Compose(
	[transforms.Resize((32,32)),
	transforms.ToTensor(),
	transforms.Normalize((0.5,0.5,0.5),(0.5,0.5,0.5))]
	)

classes = ('plane','car','bird','cat','deer','dog','frog','horse','ship','truck')

#加载网络
net = Lenet()
net.load_state_dict(torch.load('./Lenet.pth'))

#读取图片
im = Image.open('./1.jpg')
#预处理图像,(CHW)
im = transform(im)
#增加一个维度,而训练的时候没有是因为用的迭代器自动给N加上去了
im = torch.unsqueeze(im,dim=0)

with torch.no_grad():
	output = net(im)
	predict = torch.max(output,dim=1)[1].data.numpy()
print(classes[int(predict)])


总结

这次的项目拖了好久,然后是在宿舍熬夜完成了,这个项目从0开始编写代码,对其有了新的认识,但还是不太熟练,然后Lenet网络就这样了,下一个我们会开始AlexNet的学习。

以上是关于调参侠带你入门深度学习:Lenet分类实战:训练与推理的主要内容,如果未能解决你的问题,请参考以下文章

调参侠带你入门深度学习:Lenet分类实战:训练与推理

调参侠带你入门深度学习:Lenet分类实战:模型的构建

调参侠带你入门深度学习:Lenet分类实战:模型的构建

调参侠带你入门深度学习:Lenet分类实战:模型的构建

深度学习调参侠

《自然语言处理实战入门》深度学习 ---- 预训练模型的使用(ALBERT 进行多标签文本分类与微调 fine tune)