2026/1/9 10:49:22
网站建设
项目流程
如何在阿里巴巴上做网站,给公司建网站 深圳,html5 图片展示网站,无锡网站建设信息有限下面以线性模型为例#xff0c;阐述一下构建模型训练的主要步骤。步骤#xff1a;数据准备构建模型构建损失函数和优化器训练周期#xff08;前馈#xff08;计算损失#xff09;、反馈#xff08;计算梯度#xff09;、更新权重#xff09;1 数据准备有两种方式加载数…下面以线性模型为例阐述一下构建模型训练的主要步骤。步骤数据准备构建模型构建损失函数和优化器训练周期前馈计算损失、反馈计算梯度、更新权重1 数据准备有两种方式加载数据第一种是把所有数据都加载到init里面也就是读取到内存里面然后每次使用getitem时返回对应的项这种方法适用于数据量不大的情况如果是图像数据集则需要采用别的方式比如利用Dataset和DataLoader。import torch from torch.utils.data import Dataset from torch.utils.data import DataLoader class DiabetesDataset(Dataset):#继承Dataset这个抽象类 def __init__(self): pass def __getitem__(self,index):#实现这个方法可以支持下标操作 pass def __len__(self):#实现这个方法可以返回数据集的数量 pass dataset DiabetesDataset() train_loader DataLoader(datasetdataset,batch_size32,shuffleTrue,num_workers2)DataLoader最常见设置的四个参数数据集对象batch-size的大小shuffle是否要打乱数据集num_workers读取的数据时是否要使用多线程要使用几个多线程如果在windows中设置num_workers可能会出现运行时的错误解决的方法是将使用loder迭代的代码封装起来例如使用函数封装起来而不是直接暴露在外pytorch0.4会有这样的问题高版本未知2 构建模型使用pytorch重点不是各种求导运算重点时构造计算图。zwxb在训练时x和z是已知的权重w和偏置b是我们要求的因为我们不能确定w和b张量的形状所以它的形状是通过z和x来确定的。比如z是3x1的张量x是4x1的张量那我们就可以知道w是3x4的张量b是3x1的张量class LinearModel(torch.nn.Module): def __init__(self): super(LinearModel,self).__init__()#调用父类的构造函数 self.linear torch.nn.Linear(1,1)#构造对象它自动帮我们构造权重和偏置 def forward(self,x):#这个名称是固定的前向传播必须这么写 y_pred self.linear(x) return y_pred model LinearModel()#模型实例化3 构建损失函数和优化器PyTorch提供了很多损失函数和优化器可以根据模型和需要自行选择。cirterion torch.nn.MSELoss(size_average False)#损失函数第一个参数是是否要求均值 optimizer torch.optim.SGD(model.parameters(), lr0.01)#优化器第一个参数是找到模型的所有参数第二个参数是设置学习率4 写训练周期训练周期的格式也是固定的先将数据添加到我们构建的模型然后计算损失前馈过程然后清零梯度然后进行反向传播更新权重反馈和更新都是直接调用内置函数的。如果不使用mini-batch那么可以直接写for epoch in range(100): y_pred model(x_data)#将数据加到模型计算模型的y loss cirterion(y_pred,y_data)#计算损失 print(epoch,loss) optimizer.zero_grad()#清零梯度 loss.backward()#反向传播 optimizer.step()#更新权重如果使用mini-batch训练周期使用嵌套循环for epoch in range(100): for i,data in enumerate(train_loader,0): inputs, labels data#会自动转换为张量 y_pred model(inputs)#前馈 loss criterion(y_pred,labels) print(epoch,i,loss.item()) optimizer.zero_grad()#反向传播 loss.backward() optimizer.step()#更新大部分模型训练的步骤就是以上四步就算是多层模型需要大规模修改的地方其实就是模型构造训练周期也可根据需要修改但是基本步骤是不变的前馈计算损失反馈更新权重。