【看不懂才怪系列】一套通俗的基于Pytorch的网络训练代码模板
admin
2024-02-14 19:51:14
0

俗话说得好:“如果看不懂别人的代码,那一定是别人的代码写得不好!”
既然公开了代码就要对代码的可读性和正确性负责,但是看了很多源码,总是会遇到一些坑,比如:环境配置没讲清楚 -> (好不容易跑通了) 效果并没有论文中说的那么好-> (想分析代码吧)代码写得乱七八糟看不懂。。。

为了让小白能够快速上手,代码肯定需要由总到分叙述,就像讲故事一样,循序渐进才能够一目了然。下面的模板是我根据自己的理解总结的网络训练最基本的模板,大家根据自己需要再添加:

基于Pytorch的网络训练代码模板

        • 1. 构造主函数
          • 使用GPU训练
          • 模型训练的基本预设参数
          • 导入数据集
          • 搭建模型框架
          • 开始训练
        • 2.1 模型搭建
        • 2.2 开始训练
          • 2.2.1 优化器设置
          • 2.2.2 损失函数设置
          • 2.2.3 迭代训练
        • 完结,相互交流!

1. 构造主函数

if __name__ == "__main__":# 使用GPU训练device = torch.device('cuda:0' if torch.cuda.is_available() else 'cpu')# 模型训练的基本预设参数batch_size = 16 # Batch Sizenum_epochs = 100 # 训练迭代次数learning_rate = 0.0001 # 学习率root = 'data/train' # 数据集位置##### 导入数据集train_loader, val_loader = get_loader(root, batch_size, shuffle=True)# 搭建模型框架model = Model(device).to(device)# 开始训练train(device, model, num_epochs, learning_rate, train_loader, val_loader)

下面将具体讲解:

使用GPU训练
device = torch.device('cuda:0' if torch.cuda.is_available() else 'cpu')
模型训练的基本预设参数
    batch_size = 16 # Batch Sizenum_epochs = 100 # 训练迭代次数learning_rate = 0.0001 # 学习率root = 'data/train' # 数据集位置
导入数据集
 train_loader, val_loader = get_loader(root, batch_size, shuffle=True)
搭建模型框架
    model = Model(device).to(device)
开始训练
    train(device, model, num_epochs, learning_rate, train_loader, val_loader)

2.1 模型搭建

写编码器和解码器

class Model(nn.Module):def __init__(self, device):super(Model, self).__init__()#super的目的在于继承nn.Module并使用__init__初始化了nn.Module里的参数self.encoder = Encoder(device) # 编码器self.decoder = Decoder(device) # 解码器def forward(self, x):x = x.float()p1 = self.encoder(x)p2 = self.decoder(p1)return p2

2.2 开始训练

def train(device, model, num_epochs, learning_rate, train_loader, val_loader):print('start training ...........')#优化器设置optimizer = optim.Adam(model.parameters(), lr=learning_rate)#损失函数设置criterion = LossCalculation(device)train_losses, val_losses = [], []#迭代训练for epoch in range(epochs):#训练集train_epoch_loss = fit(epoch, model, optimizer, criterion, device, train_loader, phase='training')#测试集val_epoch_loss = fit(epoch, model, optimizer, criterion, device, val_loader, phase='validation')print('-----------------------------------------')#保存最优的训练参数if epoch == 0 or val_epoch_loss <= np.min(val_losses):torch.save(model.state_dict(), 'output/weight.pth')#保存训练和测试的loss结果,为画图做准备train_losses.append(train_epoch_loss)val_losses.append(val_epoch_loss)#绘制结果图write_figures('output', train_losses, val_losses)write_log('output', epoch, train_epoch_loss, val_epoch_loss)
2.2.1 优化器设置

根据自己需求设置Adam或SGD,学习率可以设置固定或自适应学习率

 optimizer = optim.Adam(model.parameters(), lr=learning_rate)
2.2.2 损失函数设置
    criterion = LossCalculation(device)
class LossCalculation(nn.Module):def __init__(self, device):super(LossCalculation, self).__init__()def forward(self, inputs, outputs, targets):#inputs, outputs, targets 分别是输入图像、预测图像和labelbatch_size, _, width, height = outputs.shapetotal_loss = 0.0 # 一个epoch的损失函数计算for b in range(batch_size):#根据自己需要添加total_loss += xxxreturn total_loss
2.2.3 迭代训练

这里面最重要的就是自定义的fit函数

def fit(epoch, model, optimizer, criterion, device, data_loader, phase='training'):if phase == 'training':#启用一些特定的层(BN,Dropout),设置为训练状态model.train()else:#禁用一些特定的层(BN,Dropout),设置为测试状态model.eval()running_loss = 0for inputs, targets in tqdm(data_loader):#我们使用gpu训练,那图像也必须输入到显存中inputs = inputs.to(device)targets = targets.to(device)if phase == 'training':#每一batch图像的梯度初始化为零,把loss涉及的权重的导数变成0optimizer.zero_grad()#输出预测图像outputs = model(inputs)else:#强制之后的内容不进行计算图构建及梯度计算with torch.no_grad():outputs = model(inputs)# 计算一个epoch中的一个batch的lossloss = criterion(inputs, outputs, targets, separate_loss=False)#累加一个epoch中的lossrunning_loss += loss.item()if phase == 'training':#loss回传loss.backward()# 更新所有的参数optimizer.step()#计算一个epoch的lossepoch_loss = running_loss / len(data_loader.dataset)#除以训练集或测试集图片数目#打印一个epoch的训练结果print('[%d][%s] loss: %.4f' % (epoch, phase, epoch_loss))return epoch_loss

完结,相互交流!

相关内容

热门资讯

手机坏了,去哪儿维修? 手机坏了,去哪儿维修?无论你是在网上买的,还是在实体店买的,都是售后的,可以去找售后啊
是不是天下、人生都是靠自己闯以... 是不是天下、人生都是靠自己闯以及打拼出来的?是不是天下、人生都是靠自己闯以及打拼出来的这个因家庭条件...
莫泊桑和谁称世界三大小说巨匠? 莫泊桑和谁称世界三大小说巨匠?契诃夫,欧亨利,莫泊桑
现在很多的小说都无端屏蔽了,如... 现在很多的小说都无端屏蔽了,如何解除屏蔽?被网站屏蔽的小说一般是无法自己解除的,这要看为什么屏蔽这些...
暑期旅行,说走就走?先做一下这... 一家人包车旅游途中坠崖落水,致2死5失踪;意大利街头遭遇扒窃,钱包护照不翼而飞……随着暑期旅游旺季来...
我,我们,你,你们,他,她,它... 我,我们,你,你们,他,她,它,他们 英语的主格,宾格,形容词物主代词,名词物主代词,反称词我,我们...
北京口碑好的旅行社,反向文化旅... 家人们,如今旅游已经不只是走马观花地打卡热门景点啦,反向文化旅游正悄然兴起,带我们解锁那些藏在城市角...
校斗群学校名字和介绍,越多越好... 校斗群学校名字和介绍,越多越好【不是宣传啊】!校名【☼沐雅↗‖校斗】【♀残风♂学院‖校斗】那一年的炎...
什么是厄尔尼诺现象? 什么是厄尔尼诺现象?是秘鲁、厄瓜多尔一带的渔民用以称呼一种异常气候现象的名词。 主要指太平洋东部和中...
星辰可以描写人吗 星辰可以描写人吗描写星辰的成语常见的有这些:【炳如日星】:光明如同日月星辰。【炳若日星】:光明如同日...
西北必玩攻略来啦,西北8日游路... 西北,这片广袤无垠的土地,有着最原始的自然风光和最淳朴的人文风情。当你踏上这片土地的那一刻,一场视觉...
火影忍者,大筒木一族为什么除了... 火影忍者,大筒木一族为什么除了辉夜以外,其他的人都不会忍术?忍术祥滑毕是在大筒木辉夜的查克拉被六道仙...
掌柜的小破酒馆被人拆了东墙后来... 掌柜的小破酒馆被人拆了东墙后来?后来掌柜被人追杀
北京22家博物馆暑期错峰或取消... 炎炎夏日,暑期来临,为满足广大市民和游客日益增长的文化需求,北京地区博物馆积极行动,精心策划,部分博...
枪神纪工程师的传送门怎么按? 枪神纪工程师的传送门怎么按?等前颤你有十多级,先去过生涯任务,然后就会有传送了,使用是:F(切换技能...
献给我挚爱的科比布莱恩特先生:... 献给我挚爱的科比布莱恩特先生:我是为什么爱上黑曼巴?黑曼巴精神确实是激励大家的精神,所以喜欢科比是非...
找一本小说,叫什么 帝国 写的... 找一本小说,叫什么 帝国 写的是唐朝的,穿越类,主角姓房求指教!!!!调教初唐,主角房遗爱,作者晴了...