如何搭建一个Pytorch 项目
用Pytorch搭建一个神经网络的一般步骤
-
导入常用的包
如$numpy$,$torch$,$torch.nn$等
-
继承基类nn.Module,自定义网络结构
-
定义$__init__(self,arg1,arg2,…,argn)$函数
-
整个网络就像一个容器,通过$__init__$可以往这个容器中添加你想要的模块(没有顺序要求)。
-
通过接收的参数$arg$可以对你要添加的模块的尺寸进行限定。
-
-
定义$forward(self,x1,x2,…,xn)$函数
-
$forward$函数作用:通过参数x接收网络的输入,然后$return$若干个输出
-
在$init$中仅仅定义了网络中应该有哪些模块,这些模块是无序的,通过$forwar$d函数能把这些模块串起来,规定网络的输入经过网络中这些模块的顺序。
Note:实例化网络对应的$class$类时,执行的是$__init__$函数,并不会产生任何输出。调用实例化后的网络对象时,执行的是$forward$函数,他会根据网络的输入,返回相应的输出。
-
-
-
数据处理
文件读取数据,数据预处理,划分数据集,加载数据集
-
文件读取数据
- 基本的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:训练时,每计算完一批的数据,更新一次参数
-
-
实例化网络模型,定义优化器,定义损失函数
-
实例化网络模型
model = YourNet()
-
定义优化器
params = list(model.parameters()),如果有多个模型,直接将list相加。
一般使用torch.optim.Adam(params, lr=0.001)
-
定义损失函数
根据问题选择optimizer,常用的有BCELoss,NLLLoss,CrossEntropyLoss 等。
-
-
训练、测试
训练
- 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的训练模型。