赞
踩
本周主要学习了Pytorch的使用,用Dataset读取文件中的数据,DataLoader对Dataset读取的数据进行分批次打包,tensorboard实现了对训练Loss和测试Loss的可视化以及完成模型训练和模型验证。
我们需要准备训练数据集和测试数据集,在Pytorch中,读取数据集需要用到Dataset和DataLoader两个类,Dataset负责对数据的读取,读取的内容是每一个数据和它对应的标签;DataLoader负责对Dataset读取的数据进行打包,然后分批次送入神经网络。
import time import torch import torchvision from torch import nn from torch.utils.data import DataLoader from torch.utils.tensorboard import SummaryWriter from model import * train_data = torchvision.datasets.CIFAR10(root="../data", train=True, transform=torchvision.transforms.ToTensor(), download=True) test_data = torchvision.datasets.CIFAR10(root="../data", train=False, transform=torchvision.transforms.ToTensor(), download=True) # 利用 DataLoader 来加载数据集 train_dataloader = DataLoader(train_data, batch_size=64) test_dataloader = DataLoader(test_data, batch_size=64)
# length 长度
train_data_size = len(train_data)
test_data_size = len(test_data)
# if train_data_size = 10,训练数据集的长度为:10
print("训练数据集的长度为:{}".format(train_data_size))
print("测试数据集的长度为:{}".format(test_data_size))
得到训练数据集和测试数据的长度
class Mose(nn.Module): def __init__(self): super(Mose, 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
# 创建网络模型
mose = Mose()
# 损失函数
loss_fn = nn.CrossEntropyLoss()
# 优化器
learning_rate = 1e-2
optimizer = torch.optim.SGD(mose.parameters(), lr=learning_rate)
通过tensorboard记录训练过程与测试过程的变化
writer = SummaryWriter("../logs_train")
定义训练的次数、测试的次数、训练的轮数、开始时间以及结束时间
# 记录训练的次数
total_train_step = 0
# 记录测试的次数
total_test_step = 0
# 训练的轮数
epoch = 10
# 开始训练时间
start_time = time.time()
每一轮训练结束后,保存训练好的模型。
for i in range(epoch): print("--------第 {} 轮训练开始--------".format(i+1)) # 训练步骤开始 mose.train() for data in train_dataloader: imgs, targets = data ouputs = mose(imgs) loss = loss_fn(ouputs, 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())) writer.add_scalar("train_loss", loss.item(), total_train_step) # 测试步骤开始 mose.eval() total_test_loss = 0 total_accuracy = 0 with torch.no_grad(): for data in test_dataloader: imgs, targets = data ouputs = mose(imgs) loss = loss_fn(ouputs, targets) total_test_loss = total_test_loss + loss accuracy = (ouputs.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(mose, "mose_{}.pth".format(i)) print("模型已保存") writer.close()
查看其中某一轮的训练结果
查看train_loss和test_loss
读取一张图片,把图片转成PIL类型,并对图片进行Resize,把它转化成32 * 32的图片。
image_path = "../imgs/dog.jpeg"
image = Image.open(image_path)
print(image)
transform = torchvision.transforms.Compose([torchvision.transforms.Resize((32, 32)),
torchvision.transforms.ToTensor()])
image = transform(image)
print(image.shape)
查看输出结果
之前的训练过程中,我们保存了网络模型,所以现在我们需要去加载网络模型。
model = torch.load("mose_0.pth", map_location=torch.device('cpu'))
查看输出结果
把图片从3维转换成4维,并用模型去加载图片得到结果。
image = torch.reshape(image, (1, 3, 32, 32))
model.eval()
with torch.no_grad():
output = model(image)
print(output)
print(output.argmax(1))
查看输出结果
查看数据集的类别
得到的结果是5类别,说明验证结果正确。
在本周的学习中,实现了模型训练和模型验证,并且掌握其中的训练套路和验证套路,学会了tensorboard实现可视化。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。