dede网站地图怎么做,长沙公司做网站大概多少钱,惠州学院网站建设,贵州省住房和城乡建设厅查询网站步骤一#xff1a;定义神经网络结构
注意#xff1a;由于一次batch_size的大小为64#xff0c;表示一次放入64张图片#xff0c;且Flatten()只会对单张图片的全部通道做拉直操作#xff0c;也就是不会将batch_size合并#xff0c;但是一张图片有3个通道#xff0c;在Ma…步骤一定义神经网络结构
注意由于一次batch_size的大小为64表示一次放入64张图片且Flatten()只会对单张图片的全部通道做拉直操作也就是不会将batch_size合并但是一张图片有3个通道在Maxpool层之后有64个通道且每个通道的大小为4*4所以Flatten()的输入为[64, 64, 4, 4]那么Flatten()的输出就为[64, 1024] 1024 64 * 4 * 4注意通过ones()函数创建一个全1的tensor作为输入数据我们只需要指定输入数据的形状即可我们可以通过ones()创建的简单输入来检测网络的结构是否正确()内写序列代码如下
# 搭建神经网络
import torch
from torch import nnclass Tudui(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),# 由于一次batch_size的大小为64表示一次放入64张图片且Flatten()只会对单张图片的全部通道做拉直操作也就是不会将batch_size合并# 但是一张图片有3个通道在Maxpool层之后有64个通道且每个通道的大小为4*4所以Flatten()的输入为[64, 64, 4, 4]# 那么Flatten()的输出就为[64, 1024] 1024 64 * 4 * 4nn.Flatten(),nn.Linear(1024, 64),nn.Linear(64, 10))def forward(self, x):x self.model(x)return xif __name__ __main__:tudui Tudui()# 通过ones()函数创建一个全1的tensor作为输入数据我们只需要指定输入数据的形状即可# 我们可以通过ones()创建的简单输入来检测网络的结构是否正确()内写序列input torch.ones((64, 3, 32, 32))output tudui(input)print(output.shape)步骤二导入数据集载入数据创建网络模型设置训练参数
注意有些代码的模型结构在module.py文件夹内需要我们手动导包后才能创建实例注意 先进行梯度清零之后再反向传播、更新参数注意优化器实例 . 梯度清零损失实例 . 反向传播优化器实例 . 更新参数
import torch
import torchvision
from torch import nn
from torch.utils.data import DataLoader
from torchvision.transforms import transformsfrom learn_pytorch.module import Tuduitrain_dataset torchvision.datasets.CIFAR10(rootDataset, trainTrue, transformtransforms.ToTensor(), downloadTrue)
test_dataset torchvision.datasets.CIFAR10(rootDataset, trainFalse, transformtransforms.ToTensor(), downloadTrue)# 获得训练数据集和测试数据集的大小
train_dataset_size len(train_dataset)
test_dataset_size len(test_dataset)
print(训练数据集大小:, train_dataset_size)
print(测试数据集大小:, test_dataset_size)# 加载训练数据集和测试数据集
train_loader DataLoader(datasettrain_dataset, batch_size64)
test_loader DataLoader(datasettest_dataset, batch_size64)# 创建网络模型
tudui Tudui()
# 创建损失函数
loss_fn nn.CrossEntropyLoss()
# 创建优化器
# 1e-3 1 * 10^(-3) 0.001
learn_rate 1e-3
optimizer torch.optim.SGD(tudui.parameters(), lrlearn_rate)# 设置训练网络的一些参数
# 训练的次数
total_train_step 0
# 测试的次数
total_test_step 0
# 训练的轮数
epoch 10for i in range(epoch):print(f----第{i1}轮训练开始----)for data in train_loader:inputs, targets dataoutputs tudui(inputs)loss loss_fn(outputs, targets)# 调用优化器的梯度清零optimizer.zero_grad()# 反向传播loss.backward()# 更新参数optimizer.step()total_train_step 1print(f训练次数: {total_train_step}, Loss: {loss.item()})loss跟loss.item()的区别在于 如果loss为tensor格式那么输出会带有tensor()而如果我们使用 .item()格式则不会带有tensor()如下
import torcha torch.tensor(5)
print(a)
print(a.item())# 输出结果
# tensor(5)
# 5步骤三测试模型性能
由于我们每轮训练结束都需要看模型有没有训练好所以我们需要用测试集对模型进行测试同时我们不希望模型根据测试集来更新梯度即保证测试集不被污染使用 with torch.no_grad()来关闭梯度计算注意因为此处我们没有使用梯度所以虽然看起来不写 with torch.no_grad()和写没有什么区别但是如果不写就算不把梯度写入模型中系统仍会计算梯度。而我们在测试时不需要更新参数即不需要梯度计算所以在测试过程中它会降低计算效率。综上推荐在测试时关闭梯度计算代码如下
import torch
import torchvision
from torch import nn
from torch.utils.data import DataLoader
from torchvision.transforms import transformsfrom learn_pytorch.module import Tuduitrain_dataset torchvision.datasets.CIFAR10(rootDataset, trainTrue, transformtransforms.ToTensor(), downloadTrue)
test_dataset torchvision.datasets.CIFAR10(rootDataset, trainFalse, transformtransforms.ToTensor(), downloadTrue)# 获得训练数据集和测试数据集的大小
train_dataset_size len(train_dataset)
test_dataset_size len(test_dataset)
print(训练数据集大小:, train_dataset_size)
print(测试数据集大小:, test_dataset_size)# 加载训练数据集和测试数据集
train_loader DataLoader(datasettrain_dataset, batch_size64)
test_loader DataLoader(datasettest_dataset, batch_size64)# 创建网络模型
tudui Tudui()
# 创建损失函数
loss_fn nn.CrossEntropyLoss()
# 创建优化器
# 1e-3 1 * 10^(-3) 0.001
learn_rate 1e-3
optimizer torch.optim.SGD(tudui.parameters(), lrlearn_rate)# 设置训练网络的一些参数
# 训练的次数
total_train_step 0
# 测试的次数
total_test_step 0
# 训练的轮数
epoch 10for i in range(epoch):print(f----第{i1}轮训练开始----)for data in train_loader:inputs, targets dataoutputs tudui(inputs)loss loss_fn(outputs, targets)# 调用优化器的梯度清零optimizer.zero_grad()# 反向传播loss.backward()# 更新参数optimizer.step()total_train_step 1if total_train_step % 100 0:print(f训练次数: {total_train_step}, Loss: {loss.item()})# 测试模型total_test_loss 0# 模型运行以下代码时不会计算梯度也就是不会更新参数with torch.no_grad():for data in test_loader:inputs, targets dataoutputs tudui(inputs)loss loss_fn(outputs, targets)total_test_loss loss.item()print(f测试Loss {total_test_loss})步骤四在tensorboard中展示输出结果
注意要在代码的结尾关闭writer代码如下
import torch
import torchvision
from torch import nn
from torch.utils.data import DataLoader
from torch.utils.tensorboard import SummaryWriter
from torchvision.transforms import transformsfrom learn_pytorch.module import Tuduitrain_dataset torchvision.datasets.CIFAR10(rootDataset, trainTrue, transformtransforms.ToTensor(), downloadTrue)
test_dataset torchvision.datasets.CIFAR10(rootDataset, trainFalse, transformtransforms.ToTensor(), downloadTrue)# 获得训练数据集和测试数据集的大小
train_dataset_size len(train_dataset)
test_dataset_size len(test_dataset)
print(训练数据集大小:, train_dataset_size)
print(测试数据集大小:, test_dataset_size)# 加载训练数据集和测试数据集
train_loader DataLoader(datasettrain_dataset, batch_size64)
test_loader DataLoader(datasettest_dataset, batch_size64)# 创建网络模型
tudui Tudui()
# 创建损失函数
loss_fn nn.CrossEntropyLoss()
# 创建优化器
# 1e-3 1 * 10^(-3) 0.001
learn_rate 1e-3
optimizer torch.optim.SGD(tudui.parameters(), lrlearn_rate)
# 创建tensorboard的writer
writer SummaryWriter(logs_module)# 设置训练网络的一些参数
# 训练的次数
total_train_step 0
# 测试的次数
total_test_step 0
# 训练的轮数
epoch 10for i in range(epoch):print(f----第{i1}轮训练开始----)for data in train_loader:inputs, targets dataoutputs tudui(inputs)loss loss_fn(outputs, targets)# 调用优化器的梯度清零optimizer.zero_grad()# 反向传播loss.backward()# 更新参数optimizer.step()total_train_step 1if total_train_step % 100 0:print(f训练次数: {total_train_step}, Loss: {loss.item()})# 将训练的Loss写入tensorboardwriter.add_scalar(train_loss, loss.item(), total_train_step)# 测试模型total_test_loss 0# 模型运行以下代码时不会计算梯度也就是不会更新参数with torch.no_grad():for data in test_loader:inputs, targets dataoutputs tudui(inputs)loss loss_fn(outputs, targets)total_test_loss loss.item()# 每轮测试结束后给测试的次数加1total_test_step 1print(f测试Loss {total_test_loss})# 将测试的Loss写入tensorboardwriter.add_scalar(test_loss, total_test_loss, total_test_step)writer.close()结果如下
步骤五保存每轮模型训练的结果
在每轮测试的代码后加入以下代码即可 torch.save(tudui, fpth/module{i})print(模型已保存)步骤六计算每轮训练的AP
注意通过argmax()来得出output的每组序列中哪一个下标的概率最大()内填1表示横向看0表示纵向看注意通过Preds target来得出每个预测是否与真实值相同返回False、True的序列注意通过.sum()来计算一共有多少个True 代码如下
import torch
import torchvision
from torch import nn
from torch.utils.data import DataLoader
from torch.utils.tensorboard import SummaryWriter
from torchvision.transforms import transformsfrom learn_pytorch.module import Tuduitrain_dataset torchvision.datasets.CIFAR10(rootDataset, trainTrue, transformtransforms.ToTensor(), downloadTrue)
test_dataset torchvision.datasets.CIFAR10(rootDataset, trainFalse, transformtransforms.ToTensor(), downloadTrue)# 获得训练数据集和测试数据集的大小
train_dataset_size len(train_dataset)
test_dataset_size len(test_dataset)
print(训练数据集大小:, train_dataset_size)
print(测试数据集大小:, test_dataset_size)# 加载训练数据集和测试数据集
train_loader DataLoader(datasettrain_dataset, batch_size64)
test_loader DataLoader(datasettest_dataset, batch_size64)# 创建网络模型
tudui Tudui()
# 创建损失函数
loss_fn nn.CrossEntropyLoss()
# 创建优化器
# 1e-3 1 * 10^(-3) 0.001
learn_rate 1e-3
optimizer torch.optim.SGD(tudui.parameters(), lrlearn_rate)
# 创建tensorboard的writer
writer SummaryWriter(logs_module)# 设置训练网络的一些参数
# 训练的次数
total_train_step 0
# 测试的次数
total_test_step 0
# 训练的轮数
epoch 10for i in range(epoch):print(f----第{i1}轮训练开始----)for data in train_loader:inputs, targets dataoutputs tudui(inputs)loss loss_fn(outputs, targets)# 调用优化器的梯度清零optimizer.zero_grad()# 反向传播loss.backward()# 更新参数optimizer.step()total_train_step 1if total_train_step % 100 0:print(f训练次数: {total_train_step}, Loss: {loss.item()})# 将训练的Loss写入tensorboardwriter.add_scalar(train_loss, loss.item(), total_train_step)# 测试模型total_test_loss 0total_accuracy 0# 模型运行以下代码时不会计算梯度也就是不会更新参数with torch.no_grad():for data in test_loader:inputs, targets dataoutputs tudui(inputs)loss loss_fn(outputs, targets)total_test_loss loss.item()accuray (outputs.argmax(1) targets).sum()total_accuracy accurayprint(f测试准确率 {total_accuracy / test_dataset_size})# 每轮测试结束后给测试的次数加1total_test_step 1print(f测试Loss {total_test_loss})# 将测试的Loss写入tensorboardwriter.add_scalar(test_loss, total_test_loss, total_test_step)# 将测试的准确率写入tensorboardwriter.add_scalar(test_accuracy, total_accuracy / test_dataset_size, total_test_step)torch.save(tudui, fpth/module{i})print(模型已保存)
writer.close()结果如下
注意事项
在模型的训练代码前可以加上如下代码因为有些网络层需要它才能表示训练状态开启官网解释如下
# 开始训练
tudui.train()在模型的测试代码前也可以加上如下代码因为有些网络层需要它才能表示测试状态开启官网解释如下
tudui.eval()