赞
踩

函数Conv2d()中的padding需自己计算,根据输入图片和输出图片以及kernel的尺寸计算。
nn.Flatten()是将6444的数据展成一维。
# 构建模型 class CFIAR10_Model(nn.Module): def __init__(self): super().__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
import torchvision from torch.utils.tensorboard import SummaryWriter from model import * from torch.utils.data import DataLoader # 准备数据集 compose = torchvision.transforms.Compose([ torchvision.transforms.ToTensor() ]) train_dataset = torchvision.datasets.CIFAR10(root="../datasetCIFAR10", train=True, transform=compose, download=True) test_dataset = torchvision.datasets.CIFAR10(root="../datasetCIFAR10", train=True, transform=compose, download=True) # 数据集大小 train_size = len(train_dataset) test_size = len(test_dataset) print("训练数据集的大小为{}".format(train_size)) print("测试数据集的大小为{}".format(test_size)) # 用dataloader来加载数据 train_dataloader = DataLoader(train_dataset, batch_size=64) test_dataloader = DataLoader(test_dataset, batch_size=64) # 创建网络模型 model = CFIAR10_Model() # 损失函数 loss_fn = nn.CrossEntropyLoss() # 优化器 learning_rate = 1e-2 optim = torch.optim.SGD(model.parameters(), lr=learning_rate) # 设置网络的一些参数 # 记录训练的次数 train_step = 0 # 记录测试的次数 test_step = 0 # 训练的轮数 epoch = 10 # 使用tensorboard writer = SummaryWriter("logs_train") # 训练步骤 for i in range(epoch): print("------第{}轮训练------".format(i+1)) # 训练步骤开始 for data in train_dataloader: imgs, targets = data output = model(imgs) loss = loss_fn(output, targets) # 优化器优化参数 optim.zero_grad() loss.backward() optim.step() train_step = train_step + 1 if train_step % 100 == 0: print("训练次数{},损失为{}".format(train_step, loss.item())) writer.add_scalar("train_loss", loss.item(), train_step) # eg:直接输出loss,会显示tensor(5), loss.item()会显示5 # 测试步骤开始 total_loss_test = 0 total_test_accuracy = 0 with torch.no_grad(): for data in test_dataloader: imgs, targets = data outputs = model(imgs) loss = loss_fn(outputs, targets) total_loss_test = total_loss_test + loss.item() accuracy = (outputs.argmax(1) == targets).sum() total_test_accuracy = total_test_accuracy + accuracy print("整体测试集上的loss:{}".format(total_loss_test)) print("整体测试集上的accuracy:{}".format(total_test_accuracy/test_size)) writer.add_scalar("test_loss", total_loss_test, test_step) writer.add_scalar("test_accuracy", total_test_accuracy, test_step) test_step = test_step + 1 # 模型保存 torch.save(model, "model{}.pth".format(i)) # torch.save(model.state_dict(), "model_{}.pth".format(i)) print("模型已保存") writer.close()
采用GPU的地方:
·网络模型
if torch.cuda.is_available():
model = model.cuda()
·数据(输入,标注)
if torch.cuda.is_available():
imgs = imgs.cuda()
targets = targets.cuda()
·损失函数
if torch.cuda.is_available():
loss_fn = loss_fn.cuda()
import torchvision from torch.utils.tensorboard import SummaryWriter from model import * from torch.utils.data import DataLoader # 准备数据集 compose = torchvision.transforms.Compose([ torchvision.transforms.ToTensor() ]) train_dataset = torchvision.datasets.CIFAR10(root="../datasetCIFAR10", train=True, transform=compose, download=True) test_dataset = torchvision.datasets.CIFAR10(root="../datasetCIFAR10", train=True, transform=compose, download=True) # 数据集大小 train_size = len(train_dataset) test_size = len(test_dataset) print("训练数据集的大小为{}".format(train_size)) print("测试数据集的大小为{}".format(test_size)) # 用dataloader来加载数据 train_dataloader = DataLoader(train_dataset, batch_size=64) test_dataloader = DataLoader(test_dataset, batch_size=64) # 创建网络模型 model = CFIAR10_Model() if torch.cuda.is_available(): model = model.cuda() # 损失函数 loss_fn = nn.CrossEntropyLoss() if torch.cuda.is_available(): loss_fn = loss_fn.cuda() # 优化器 learning_rate = 1e-2 optim = torch.optim.SGD(model.parameters(), lr=learning_rate) # 设置网络的一些参数 # 记录训练的次数 train_step = 0 # 记录测试的次数 test_step = 0 # 训练的轮数 epoch = 10 # 使用tensorboard writer = SummaryWriter("logs_train") # 训练步骤 for i in range(epoch): print("------第{}轮训练------".format(i+1)) # 训练步骤开始 for data in train_dataloader: imgs, targets = data if torch.cuda.is_available(): imgs = imgs.cuda() targets = targets.cuda() output = model(imgs) loss = loss_fn(output, targets) # 优化器优化参数 optim.zero_grad() loss.backward() optim.step() train_step = train_step + 1 if train_step % 100 == 0: print("训练次数{},损失为{}".format(train_step, loss.item())) writer.add_scalar("train_loss", loss.item(), train_step) # eg:直接输出loss,会显示tensor(5), loss.item()会显示5 # 测试步骤开始 total_loss_test = 0 total_test_accuracy = 0 with torch.no_grad(): for data in test_dataloader: imgs, targets = data if torch.cuda.is_available(): imgs = imgs.cuda() targets = targets.cuda() outputs = model(imgs) loss = loss_fn(outputs, targets) total_loss_test = total_loss_test + loss.item() accuracy = (outputs.argmax(1) == targets).sum() total_test_accuracy = total_test_accuracy + accuracy print("整体测试集上的loss:{}".format(total_loss_test)) print("整体测试集上的accuracy:{}".format(total_test_accuracy/test_size)) writer.add_scalar("test_loss", total_loss_test, test_step) writer.add_scalar("test_accuracy", total_test_accuracy, test_step) test_step = test_step + 1 # 模型保存 torch.save(model, "model{}.pth".format(i)) # torch.save(model.state_dict(), "model_{}.pth".format(i)) print("模型已保存") writer.close()
.to(device)
device = torch.device(“cpu”)
device = torch.device(“cuda”)
device = torch.device(“cuda:0”) # 有多个显卡的情况
import torchvision from torch.utils.tensorboard import SummaryWriter from model import * from torch.utils.data import DataLoader # 定义训练的设备 device = torch.device("gpu") # 准备数据集 compose = torchvision.transforms.Compose([ torchvision.transforms.ToTensor() ]) train_dataset = torchvision.datasets.CIFAR10(root="../datasetCIFAR10", train=True, transform=compose, download=True) test_dataset = torchvision.datasets.CIFAR10(root="../datasetCIFAR10", train=True, transform=compose, download=True) # 数据集大小 train_size = len(train_dataset) test_size = len(test_dataset) print("训练数据集的大小为{}".format(train_size)) print("测试数据集的大小为{}".format(test_size)) # 用dataloader来加载数据 train_dataloader = DataLoader(train_dataset, batch_size=64) test_dataloader = DataLoader(test_dataset, batch_size=64) # 创建网络模型 model = CFIAR10_Model() model.to(device) # 损失函数 loss_fn = nn.CrossEntropyLoss() loss_fn.to(device) # 优化器 learning_rate = 1e-2 optim = torch.optim.SGD(model.parameters(), lr=learning_rate) # 设置网络的一些参数 # 记录训练的次数 train_step = 0 # 记录测试的次数 test_step = 0 # 训练的轮数 epoch = 10 # 使用tensorboard writer = SummaryWriter("logs_train") # 训练步骤 for i in range(epoch): print("------第{}轮训练------".format(i+1)) # 训练步骤开始 for data in train_dataloader: imgs, targets = data imgs = imgs.to(device) targets = targets.to(device) output = model(imgs) loss = loss_fn(output, targets) # 优化器优化参数 optim.zero_grad() loss.backward() optim.step() train_step = train_step + 1 if train_step % 100 == 0: print("训练次数{},损失为{}".format(train_step, loss.item())) writer.add_scalar("train_loss", loss.item(), train_step) # eg:直接输出loss,会显示tensor(5), loss.item()会显示5 # 测试步骤开始 total_loss_test = 0 total_test_accuracy = 0 with torch.no_grad(): for data in test_dataloader: imgs, targets = data imgs = imgs.to(device) targets = targets.to(device) outputs = model(imgs) loss = loss_fn(outputs, targets) total_loss_test = total_loss_test + loss.item() accuracy = (outputs.argmax(1) == targets).sum() total_test_accuracy = total_test_accuracy + accuracy print("整体测试集上的loss:{}".format(total_loss_test)) print("整体测试集上的accuracy:{}".format(total_test_accuracy/test_size)) writer.add_scalar("test_loss", total_loss_test, test_step) writer.add_scalar("test_accuracy", total_test_accuracy, test_step) test_step = test_step + 1 # 模型保存 torch.save(model, "model{}.pth".format(i)) # torch.save(model.state_dict(), "model_{}.pth".format(i)) print("模型已保存") writer.close()
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。