How to set up a Pytorch project

构建Pytorch项目一般步骤

Posted by biggan on October 2, 2018

如何搭建一个Pytorch 项目

用Pytorch搭建一个神经网络的一般步骤
  1. 导入常用的包

    如$numpy$,$torch$,$torch.nn$等

  2. 继承基类nn.Module,自定义网络结构
    • 定义$__init__(self,arg1,arg2,…,argn)$函数

      • 整个网络就像一个容器,通过$__init__$可以往这个容器中添加你想要的模块(没有顺序要求)。

      • 通过接收的参数$arg$可以对你要添加的模块的尺寸进行限定。

    • 定义$forward(self,x1,x2,…,xn)$函数

      • $forward$函数作用:通过参数x接收网络的输入,然后$return$若干个输出

      • 在$init$中仅仅定义了网络中应该有哪些模块,这些模块是无序的,通过$forwar$d函数能把这些模块串起来,规定网络的输入经过网络中这些模块的顺序。

      Note:实例化网络对应的$class$类时,执行的是$__init__$函数,并不会产生任何输出。调用实例化后的网络对象时,执行的是$forward$函数,他会根据网络的输入,返回相应的输出。

  3. 数据处理

    文件读取数据,数据预处理,划分数据集,加载数据集

    • 文件读取数据

      • 基本的txt读取
      • pandas读取csv
      • json读取等
    • 数据预处理

      视任务而定

    • 划分数据集

      • 划分训练集、验证集、测试集

        可以使用sklearn中的一些函数,如:

        sklearn.model_selection. train_test_split

        sklearn.model_selection. StratifiedKFold

    • 加载数据集

      若要批处理,需要自定义Dataset、DataLoader类。

      实例化后的Dataset对象作为DataLoader类的参数,在DataLoader中可以指定一批数据的数量batch_size,DataLoader会 根据batch_size将所有的数据划分成若干批进行训练。

      note:训练时,每计算完一批的数据,更新一次参数

  4. 实例化网络模型,定义优化器,定义损失函数
    • 实例化网络模型

      model = YourNet()

    • 定义优化器

      params = list(model.parameters()),如果有多个模型,直接将list相加。

      一般使用torch.optim.Adam(params, lr=0.001)

    • 定义损失函数

      根据问题选择optimizer,常用的有BCELoss,NLLLoss,CrossEntropyLoss 等。

  5. 训练、测试

    训练

    • model.train() #训练集和验证集在一起计算时要用model.train() 、model.eval()区分

    note:训练EPOCH次,每个EPOCH都要分batch训练。

    对每一个batch:

    • 前向计算:数据喂给model,返回经过网络的计算结果output
    • 计算损失:loss(output, target)
    • 梯度清零:optimizer.zero_grad()
    • 反向传播求梯度:loss.backward()
    • 更新梯度:optimizer.step()

    测试

    每一个EPOCH结束后,对验证集数据进行测试:

    • model.eval() #测试时会忽略网络中dropout等操作

    • 前向计算
    • 评测,评测算法根据任务选择,如F1,Recall,AUC等

    note

    可以根据验证集测试结果,选择保存最优的epoch的训练模型。