作者学习记录方便查询
很多机器学习模型有各自独特的学习过程,这里只是记录普遍情况。
超参数
在进行训练数据之前将超参数统一放置在代码前部,方便修改。
BATCH_SIZE = 32
lr = 0.001 # 学习率
epochs = 1000 # 训练轮数
数据处理
在进行学习之前需要准备好训练模型所需要的数据,这一步常常使用Dataset或者Tensrodataset构建数据。
Dataset功能比较全面,适用于数据格式比较复杂的时候,建议在这一步就把数据处理成适合模型学习的形式,如果在训练过程中在修改数据容易使梯度断掉。
Dataset处理数据
Tensordataset在处理简单数据时较为快捷,代码量较少。
Tensordataset处理数据
之后Dataloader将处理之后的数据转变为一个迭代器,方便模型进行学习。
class GetData(Dataset):
def __init__(self, data, label):
pass
def __getitem__(self, index):
pass
def __len__(self):
pass
train_data = MyDataset(data_root)# Dataset
train_data = TensorDataset(data, label)# Tensordataset
train_loader = DataLoader(dataset=train_data, batch_size=BATCH_SIZE, shuffle=True)
构建模型
在Pytorch框架下,常常继承其中的模块进行模型的构造。
class net(torch.nn.Module):# 继承
def __init__(...):
pass
def forward(self,x):
pass
MyNet=net(...)# 实例化模型
设置损失函数与优化器
Pytorch下包含很多类型的损失函数与优化器,当训练过程不佳时可以进行更改。损失函数用于评估模型效果,损失值越小表明预测结果与真实结果越接近。优化器目标是让损失值变小。
optimizer=torch.optim.Adam(net.parameters(),lr=lr) #使用Adam优化器,个人觉得这个很好用。
loss_function=torch.nn.MSELoss() #均方差损失函数。
进行训练
做好前置工作就可以进行模型的训练,这个时候已经有了处理好的数据、未训练的模型、设置好的损失函数与优化器。
训练过程中要对全体数据进行多次学习(学习次数是epochs,毕竟比较笨,一次学不会),在每次学习中,模型会对数据进行分块学习(每次学的量是batch_size,毕竟不能一口吃成个胖子一次全部学完)。
loss_steps=np.zeros(epochs)# 用于记录损失值
for epoch in range(epochs):
for i, (x,y) in enumerate(train_loader):
pred = net(x)
loss = loss_function(pred, y)
optimizer.zero_grad()# 清除梯度
loss.backward() # 反向传播
optimizer.step() # 更新梯度
loss_steps[epoch]=loss.item()# 记录loss
running_loss = loss.item()
print(f"第{epoch}次训练,loss={running_loss}".format(epoch,running_loss))
torch.save(net, 'model.pth')# 保存模型
print('训练成功!')