#准备数据
train_data=torchvision.datasets.CIFAR10("./dataset", train=True, transform=torchvision.transforms.ToTensor(), download=True)
test_data=torchvision.datasets.CIFAR10('./dataset', train=False, transform=torchvision.transforms.ToTensor(), download=True)
#Q1:训练数据和测试数据存到一个路径可以吗-->答案是可以
#查看训练集和测试集中图片的数量
train_len=len(train_data)
test_len=len(test_data)
#利用dataloader加载数据
train_loader=DataLoader(train_data, batch_size=64)
test_loader=DataLoader(test_data, batch_size=64)
tips:ctrl+p:可查看所调用的函数的参数
import torch
from torch import nn
#搭建网络架构
class Tudui(nn.Module):
def __init__(self):
super(Tudui, self).__init__()
self.model=nn.Sequential(
nn.Conv2d(3, 32, 5, stride=1, padding=2),
nn.MaxPool2d(2),
nn.Conv2d(32, 32, 5, stride=1, padding=2),
nn.MaxPool2d(2),
nn.Conv2d(32, 64, 5, stride=1, padding=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
tips:
可将整个网络框架写入一个新的model.py文件中,然后在同一个文件夹目录下,直接使用from model import *调用
可在model.py文件中直接写入main来测试model,#if __name__ == '__main__'理解为: 如果模块是被直接运行的,则代码块被运行,如果模块是被导入的,则代码块不被运行。
#测试网络架构
#if __name__ == '__main__'理解为: 如果模块是被直接运行的,则代码块被运行,如果模块是被导入的,则代码块不被运行。
if __name__ == '__main__':
tudui=Tudui()
input=torch.ones((64, 3, 32, 32))
output=tudui(input)
print(output.shape)
tudui=Tudui()
loss_fn = nn.CrossEntropyLoss()
optimizer=torch.optim.Adam(tudui.parameter(), lr=0,01)
#设置训练网络的参数
#记录训练次数
total_train_step=0
#记录测试次数
total_test_step=0
#训练的轮数
epoch=10
#训练过程
for i in range(epoch):
print("--------第{}次训练开始--------".format(i))
for data in train_loader:
imgs, targets = data
output=tudui(imgs)
loss = loss_fn(output, targets)
#优化器调优
optimizer.zero_grad()
loss.backward()
optimizer.step()
total_train_step=total_train_step+1
if total_train_step % 100==0:
print("训练次数:{},Loss:{}".format(total_train_step, loss))
#测试过程
total_test_loss=0
with torch.no_grad():
for data in test_loader:
imgs, targets= data
output=tudui(imgs)
loss=loss_fn(output, targets)
total_test_loss=total_test_loss+loss
total_test_step=total_test_step+1
print("测试次数:{},loss:{}".format(total_test_step, total_test_loss))
训练过程tips:
测试过程tips:
writer=SummaryWriter("./logs_train")
writer.add_scalar("train_loss", loss, total_train_step)
writer.add_scalar("test_loss", total_test_loss, total_test_step)
writer.close()
绘图过程
在terminal中输入tensorboard --logdir=logs_train,并回车,即可打开tensorboard窗口
绘图结果
#模型的保存
torch.save(tudui, "tudui_{}".format(i))
print("tudui已保存")
tips:
accuracy=(output.argmax(1)==targets).sum()
total_accuracy=total_accuracy+accuracy
writer.add_scalar("准确率", total_accuracy/test_len, total_test_step)
测试结果
tudui.train()
tudui.eval()
tips: