(3)完整模型的训练与验证
整体步骤:
准备数据集--》利用dataloader来加载数据集--》创建网络模型--》创建损失函数、优化器--》设置训练网络的一些参数(训练的次数、测试的次数、epoch)--》添加tensorboard--》每次训练(每个epoch)下:训练集上:分割数据,loss,清零,优化;测试集上:分割数据,计算准确度--》得到loss、accuracy
model.py
#搭建神经网络 import torch from torch import nn class Qian(nn.Module): def __init__(self): super(Qian, self).__init__() self.model1 = nn.Sequential( nn.Conv2d(3, 32, (5, 5), (1, 1), padding=2), nn.MaxPool2d(2), nn.Conv2d(32, 32, (5, 5), (1, 1), padding=2), nn.MaxPool2d(2), nn.Conv2d(32, 64, (5, 5), (1, 1), padding=2), nn.MaxPool2d(2), nn.Flatten(), nn.Linear(1024, 64), nn.Linear(64, 10) ) def forward(self, x): x = self.model1(x) return x if __name__ == '__main__': qian = Qian() input = torch.ones((64, 3, 32, 32)) output = qian(input) print(output.shape)
train.py
import torchvision from torch.utils.tensorboard import SummaryWriter import time from model import * #准备数据集 from torch import nn from torch.utils.data import DataLoader dataset_transform = torchvision.transforms.Compose([ torchvision.transforms.ToTensor() ]) train_data = torchvision.datasets.CIFAR10(root="./datasets", train=True, transform=dataset_transform, download=True) test_data = torchvision.datasets.CIFAR10(root="./datasets", train=False, transform=dataset_transform, download=True) train_data_size = len(train_data) test_data_size = len(test_data) 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) #创建网络模型 qian = Qian() #创建损失函数 loss_fn = nn.CrossEntropyLoss() #优化器 learning_rate = 0.01#1e-2=1x10^(-2) optimizer = torch.optim.SGD(qian.parameters(), lr=learning_rate) #设置训练网络的一些参数 #记录训练的次数 total_train_step = 0 #记录测试的次数 total_test_step = 0 #训练的轮数 epoch = 10 #添加tensorboard writer = SummaryWriter("log_train") start_time = time.time() for i in range(epoch): print("-------第{}轮训练开始------".format(i+1)) #训练步骤开始 qian.train() for data in train_dataloader: imgs, targets = data outputs = qian(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())) writer.add_scalar("train_loss", loss.item(), total_train_step) #测试步骤开始 qian.eval() total_test_loss = 0 total_accuracy = 0 with torch.no_grad(): for data in test_dataloader: imgs, targets = data outputs = qian(imgs) loss = loss_fn(outputs, targets) total_test_loss = total_test_loss + loss.item() 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(qian, "qian_{}.pth".format(i)) print("模型已保存") #torch.save(qian.state_dict(), "qian_{}.pth".format(i)) writer.close()
test.py
import torch import torchvision from PIL import Image from torch import nn image_path = "imgs/dog.png" image = Image.open(image_path) image = image.convert('RGB') print(image) transform = torchvision.transforms.Compose([torchvision.transforms.Resize((32, 32)), torchvision.transforms.ToTensor()]) image = transform(image) print(image.shape) class Qian(nn.Module): def __init__(self): super(Qian, self).__init__() self.model1 = nn.Sequential( nn.Conv2d(3, 32, (5, 5), (1, 1), padding=2), nn.MaxPool2d(2), nn.Conv2d(32, 32, (5, 5), (1, 1), padding=2), nn.MaxPool2d(2), nn.Conv2d(32, 64, (5, 5), (1, 1), padding=2), nn.MaxPool2d(2), nn.Flatten(), nn.Linear(1024, 64), nn.Linear(64, 10) ) def forward(self, x): x = self.model1(x) return x model = torch.load("qian_0.pth") print(model) # output = model(image) image = torch.reshape(image, (1, 3, 32, 32)) model.eval() with torch.no_grad(): output = model(image) print(output) print(output.argmax(1))
若使用gpu训练,则需要在以下部分加.cuda()
qian = Qian() if torch.cuda.is_available(): qian = qian.cuda() loss_fn = nn.CrossEntropyLoss() if torch.cuda.is_available(): loss_fn = loss_fn.cuda() if torch.cuda.is_available(): imgs = imgs.cuda() targets = targets.cuda()

浙公网安备 33010602011771号