下面是模型的构建代码,这个文件开始我保存的文件名是27module,后面导入的时候这么写不行就改成了module,其次就是在自己写神经网络的时候一定要仔细算一下你的像元数前后层,是否对应正确,不然可能出现报错,矩阵不一样没法相乘,报错会在运行界面显示:RuntimeError: mat1 and mat2 shapes cannot be multiplied
import torch
from torch.nn import Sequential, Conv2d, MaxPool2d, Flatten, Linear, Module
"""
写网络的时候一定要检查自己写的网路是不是有问题
"""
class MyMoudule(Module):
def __init__(self):
super(MyMoudule, self).__init__()
self.sequential=Sequential(
Conv2d(3,32,(5,5),padding=2),
MaxPool2d(2),
Conv2d(32,32,(5,5),padding=2),
MaxPool2d(2),
Conv2d(32,64,(5,5),padding=2),
MaxPool2d(2),
Flatten(),
Linear(64*4*4,64),
Linear(64,10)
)
def forward(self,x):
x=self.sequential(x)
return x
if __name__=="__main__":
input=torch.ones([64,3,32,32])#batch_size,channel,长,宽
mymoudule=MyMoudule()
output=mymoudule(input)
print(output.size())
这个模型运行结果
torch.Size([64, 10])
进程已结束,退出代码为 0
主程序代码
import torchvision
from torch.utils.data import DataLoader
from module import *#貌似不能网络的文件不能带数字在前面
t=torchvision.transforms.ToTensor()
train_data=torchvision.datasets.CIFAR10(root="dataset_load",train=True,transform=t,download=True)
test_data=torchvision.datasets.CIFAR10(root="dataset_load",train=False,transform=t,download=True)
#看训练集和测试集的长度
train_data_size=len(train_data)
test_data_size=len(test_data)
print("训练集的长度是:",train_data_size)
print("测试集的长度是:",test_data_size)
#加载数据集
train_dataload=DataLoader(dataset=train_data,batch_size=64,shuffle=True,drop_last=True,num_workers=0)
test_dataload=DataLoader(dataset=test_data,batch_size=64,shuffle=True,drop_last=True,num_workers=0)
#创建网络模型
mymoudule=MyMoudule()
#创建损失函数
loss_fn=torch.nn.CrossEntropyLoss()
#创建优化器
learning_rate=0.001
optim=torch.optim.SGD(mymoudule.parameters(),lr=learning_rate)#填入模型参数和学习速率
#记录训练的次数
total_train_step=0
#记录测试的次数
total_test_step=0
#训练的轮数
epoach=10
for i in range(epoach):
print(f"————————————第{i+1}轮训练————————————-")
for j in train_dataload:
img,target=j
comeout=mymoudule(img)
#优化器进行调优
loss=loss_fn(comeout,target)#获得损失值
optim.zero_grad()#梯度清零
loss.backward()#反向传播,获得梯度
optim.step()#利用梯度优化神经网络的参数
total_train_step=total_train_step+1
print(f"训练次数{total_train_step},损失值{loss.item()}")#这个loss.item()可以将loss从tensor变成int,后续可视化可能用到
运行结果,稍微跑了一下