使用PyTorch进行深度学习实战,对我来说一般编写四个文件来完成深度学习项目:
main文件主要进行参数的解析argparse,链接其他三个文件,将数据x,y输入模型得到输出loss,保存模型等,在main文件里主要进行以下几个过程:
engine=trainer(lr,decay,dim,....)
train_loss=engine.train(x,y)
test_loss=enginer.eval(x,y)
在model文件里主要进行网络结构部分的组织和定义,有一个大类,如下:
class Net1(nn.Module):
def __init__(self,indim,outdim,...,...):
super(Net1,self).__init__()
1、初始化一些参数
2、定义网络结构和BatchNormalization
def forward(self,x):
进行前馈传播运算
return x'
大类的 _init_ 里可能调用其他的小的网络类,都是像上面的类似的结构
engine文件里主要定义了一个 trainer类,具体结构如下:
class trainer():
def __init__(self,网络的一些维数和模型训练需要用到的一些参数):
# 定义模型
self.model=Net(args,kwargs)
# 定义优化器
self.optimizer=....
# 定义损失函数计算方式
self.loss=function1
# 有时候还会有一个所有数据进行归一化的方式
self.scaler=....
def train(self,trainx,trainy):
self.model.train()
self.optimizer.zero_grad()
根据项目需要对trainx,trainy进行适当的处理。。。。。
pred=self.model(trainx)
loss=self.loss(pred,trainy)
loss.backward()
# 有时候还会插入一个torch.nn.utils.clip_grad_norm_(self.model.parameters)函数对参数的梯度进行一定的处理
self.optimizer.step()
return loss
def eval(self,testx,testy):
self.model.eval()
对testx,testy做和trainx,trainy一样的处理
pred=self.model(testx)
loss=self.loss(pred,testy)
return loss
在utils文件里主要进行数据的处理等,定义DataLoader类和归一化StandardScaler类