思路步骤:
第一步准备数据集:(训练集,测试集)
import torchvision
Train_dataset = torchvision.datasets.CIFAR10("./data",True,transform=torchvision.transforms.ToTensor())
Test_Dataset =torchvision.datasets.CIFAR10("./data",False,transform=torchvision.transforms.ToTensor())
transform=torchvision.transforms.ToTensor() 将数据集图片转换为Tensor数据类型
第二步查询数据集长度:(len)
###第二步查询数据集长度
Train_length = len(Train_dataset)
Test_length = len(Test_Dataset)
print(f"训练集长度为{Train_length}")
print((f"测试集长度为{Test_length}"))
第三步加载数据集(DataLoader)
##第三步加载数据集
Train_load = DataLoader(Train_dataset,64,True)
Test_load = DataLoader(Test_Dataset,64,True)
第四步搭建神经网络,将神经网络放入单独的一个python文件中,测试网络正确性
class Tudui(nn.Module):
nn.Module
是所有神经网络模块的基类,用于创建自定义网络。
通过继承nn.Module,模型可以使用PyTorch提供的各种功能和方法,如参数管理、设备移动等。
遵循这种结构的模型可以轻松地与PyTorch的其他组件(如优化器、损失函数等)集成
class Tudui(nn.Module):
def __init__(self):
super(Tudui,self).__init__()
super()
主要用于调用父类(超类)的方法。
nn.Conv2d(3,32,padding=2,stride=1)
输入通道为3,输出通道为32,高宽不变padding = [(卷积核数-1 )/2]
对应神经网络部分:
self.model = nn.Sequential(
nn.Conv2d(3,32,padding=2,stride=1,kernel_size=5),
nn.MaxPool2d(2),
nn.Conv2d(32,32,padding=2,stride=1,kernel_size=5),
nn.MaxPool2d(2),
nn.Conv2d(32,64,padding=2,stride=1,kernel_size=5),
nn.MaxPool2d(2),
nn.Flatten(),
nn.Linear(64*4*4,64),
nn.Linear(64,10),
)
具体搞清楚python中 self.model写法 不能用self 直接替代的原因
###第四步搭建神经网络
class Tudui(nn.Module):
def __init__(self):
super(Tudui,self).__init__()
self.model = nn.Sequential(
nn.Conv2d(3,32,padding=2,stride=1,kernel_size=5),
nn.MaxPool2d(2),
nn.Conv2d(32,32,padding=2,stride=1,kernel_size=5),
nn.MaxPool2d(2),
nn.Conv2d(32,64,padding=2,stride=1,kernel_size=5),
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
测试网络的正确性
input = torch.ones(64,3,32,32)
创建一个四维张量,表示一批图像数据 ,参数batch_size,channels,H,W
if __name__ == '__main__':
tudui = Tudui()
input = torch.ones(64,3,32,32)
output = tudui(input)
print(output.shape)
结果:
第五步创建网络模型
###创建网络模型 tudui = Tudui()
第六步创建损失函数:
loss_fn = nn.CrossEntropyLoss()
第七步创建优化器:
##创建优化器
learning_rate =0.01
optimize = torch.optim.SGD(tudui.parameters(),lr=learning_rate)
第八步设置训练参数,开始训练:
起始参数设置:
train_step = 0###起始训练次数
test_step = 0###起始测试次数
epoch = 10 ####训练十轮
训练开始 :从train_load读取训练集
for data in Train_load:####训练开始
imgs,targets = data
将图片输入至模型中得到输出 ,并利用损失函数计算Loss
output = tudui(imgs)
loss = loss_fn(output,targets)
优化器梯度清零:
-
防止梯度累积:
- PyTorch 默认累积梯度。不清理会导致梯度在多个批次间累加。
-
确保每批次独立:
每个批次的梯度应该只反映当前批次的计算结果。
optimize.zero_grad()
loss.backward()
optimize.step()
train_step+=1
print(f"训练次数为{train_step},loss值{loss}")