基于Pytorch编写深度学习基本步骤

一、前言

在我们要用pytorch构建自己的深度学习模型的时候,基本上都是下面这个流程步骤,无论是从自己写,还是阅读他人代码,按照这个步骤思想(默念4大步骤,找数据定义、找model定义、(找损失函数、优化器定义),主循环代码逻辑),直接去找对应的代码块,会简单很多。

二、基本步骤思想

福昕截屏20230426110107921.PNG
分为四大步骤:

  • 输入处理模块 (X 输入数据,变成网络能够处理的Tensor类型)
  • 模型构建模块 (主要负责从输入的数据,得到预测的y^, 这就是我们经常说的前向过程)
  • 定义代价函数和优化器模块 (注意,前向过程只会得到模型预测的结果,并不会自动求导和更新,是由这个模块进行处理)
  • 构建训练过程 (迭代训练过程,就是上图表情包的训练迭代过程)

这几个模块分别与上图的数字标号1,2,3,4进行一一对应!

三、示例讲解

知道了上面的宏观思想之后,后面给出每个模块稍微具体一点的解释和具体一个例子,再帮助大家熟悉对应的代码!

1、数据处理

对于数据处理,最为简单的⽅式就是将数据组织成为⼀个 。但许多训练需要⽤到mini-batch,直 接组织成Tensor不便于我们操作。pytorch为我们提供了Dataset和Dataloader两个类来方便的构建。
torch.utils.data.Dataset

继承Dataset 类需要override以下⽅法:

from torch.utils.data import Dataset
class trainDataset (Dataset):
	def __init__(self):
	#constructor

	def __getitem__(self,index):
	#获得第index号的数据和标签

	def __len__(self):
	##获得数据量

torch.utils.data.DataLoader

torch.utils.data.DataLoader(dataset, batch_size=1, shuffle=False)

DataLoader Batch。如果选择shuffle = True,每⼀个epoch 后,mini-Batch batch_size 常⻅的使⽤⽅法如下:

dataLoader = DataLoader(dataset,shuffle=True,batch_size=32)
for x,y in dataLoader:
	print(x.shape) #依次为batch_size,channel,height,width
	print(y.shape) #batch_size
	break

2、模型构建

所有的模型都需要继承torch.nn.Module , 需要实现以下⽅法:

class MyModel(torch.nn.Module):
	def __init__(self):
		super(MyModel,self).__init__()
		。。。。。
	def forward(self,x):
		。。。。。
	return 。。。。。

model=MyModel()

其中forward() ⽅法是前向传播的过程。在实现模型时,我们不需要考虑反向传播。

3、定义代价函数和优化器

criterion = torch.nn.BCELoss(reduction='sum') ##代价函数
optimizer = torch.optim.Adam (model.parameters(),1r=0.0001,betas=(0.9,
0.999),eps=1e-08,weight_decay=0,amsgrad=False) ##优化器

这部分根据⾃⼰的需求去参照doc

4、构建训练过程

pytorch的训练循环⼤致如下:

def train(epoch): ##一个epoc的训练
	for i,data in enumerate(dataLoader,0):
		x,y=data ##取出minibatch数据和标签
		y_pred=model(x) ##前向传播
		loss=criterion(y_pred,y) #计算代价函数
		optimizer.zero_grad() ##清零梯度准备计算
		loss.backward() ##反向传播
		optimizer.step() ##更新训练参数

四、来个例子吧

废话少说,直接放代码

import torch
import torch.nn.functional as F

#1、数据处理
x_data = torch.Tensor([[1.0],[2.0],[3.0]])
y_data = torch.Tensor([[0],[0],[1]])

#2、模型构建
class LogisticRegressionModel (torch.nn.Module):
    def __init__ (self):
        super(LogisticRegressionModel,self).__init__()
        self.linear = torch.nn.Linear(1,1)
    def forward(self,x):
        y_pred = F.sigmoid(self.linear(x))
        return y_pred
model = LogisticRegressionModel()

#3、定义代价函数和优化器
criterion = torch.nn.BCELoss(size_average=False)
optimizer = torch.optim.SGD(model.parameters(),lr=0.01)

#4、构建训练过程
for epoch in range(1000):
    y_pred = model(x_data)
    loss = criterion(y_pred,y_data)
    print(epoch,loss.item())

    optimizer.zero_grad()
    loss.backward()
    optimizer.step()

鲸之声为您拼命加载中...