深度学习框架包括的模块有
- 数据读取
- 参数设置
- 模型设置
- 训练主程序
- 推理主程序
- 辅助的工具函数和类
数据读取
数据读取模型的作用是读取数据,将数据整理成合理大小,同时也会对数据进行一系列的预处理,输入到模型中去,所以,一般会使用迭代器的方法对数据进行读取。具体的结构如下:
class Iter:
def __init__(self, opt):
"""
opt是输入的参数的类,它包含了数据读取中所有需要的参数。
"""
def __len__(self):
"""
返回的是一共包含的样本事件的长度,也就是数据集的长度
"""
return
def __getitem__(self, item):
"""
对数据进行迭代,当然,在python中,
你也可以使用__iter__和__next__这2种方法构建一个合理的数据迭代器,
我比较推荐使用__iter__和__next__方法构建迭代器,
因为这样的话,你对引用的数据超出数据集长度的错误处理就会更加清晰,
比如说,在使用for循环遍历__getitem__产生的迭代器时,
退出循环的条件是__getitem__中的代码出现错误,
这时尽管列表和字典产生的错误是相同的,
但是,使用列表做索引时,产生的错误不会引发程序报错,字典会。
因此,最好使用__iter__和__next__方法构建迭代器,
只需要在__next__中定义好错误的类型,不论索引是字典还是列表,都不会出现程序运行时报错。
比如说。
class Fibonacci(object):
def __init__(self):
self.a, self.b = 0, 1
def __iter__(self):
return self # 实例自己就是一个迭代对象,所以返回自身
def __next__(self):
self.a, self.b = self.b, self.a + self.b # 计算下数列中的下一个值
if self.a > 66: # 计算下一个值到特定条件时退出循环
raise StopIteration()
return self.a # 返回下一个值
"""
return
之后直接使用各种深度学习的框架中自带的api对数据进行读取,以输送到模型中。
参数设置
在参数设置中,一般使用一个类来保存所有的参数,然后通过继承的方法来定义训练,验证,推理时的参数类。
模型设置
这个模块在设计的时候,主要依据是算法的原理和调用的便捷性,只要注意复现算法的正确性就行了,所以一般会使用一些辅助性的工具来帮助分析算法,比如说,画模型结构图的包,等等
训练主程序
在训练的主程序中,有几个部分需要注意
- 模型训练的时候,要定义好优化器和学习率的迭代。
- 保存模型时,需要将模型和优化器的参数都进行保存,以便于再训练。
- 优化器和学习率的迭代都是比较重要的部分,需要根据不同任务设置不同的优化器和学习率的迭代方式。
- loss函数是需要根据不同的任务进行建模之后,再做选择,或者,也可以自己定义一种loss函数。
- 在验证集验证模型的时候,需要注意停止模型的梯度计算,以防止模型在训练过程中,内存不断增加,最后导致溢出,终止程序运行的结果。
"以pytorch为框架,主要的流程如下"
def main():
device = "模型训练的装备"
epoch = "训练的轮次"
# 数据集
train_opt = "训练数据集参数"
val_opt = "验证数据集参数"
train_data = "训练数据集"
val_data = "验证数据集"
model = "自己定义的模型"
model.to(device)
optim = "自己定义的优化器"
criterion = "自己定义的loss函数"
lr_step = "自己定义的学习率迭代函数"
for itr in range(1, epoch + 1):
model.train()
for j, data in enumerate(train_data):
inputs = data['x'] # 输入模型的数据
targets = data['y'] # 模型的目标集
outs = model(inputs) # 进行推理
loss = criterion(outs,targets)
# 反向传播算法
optim.zero_grad()
loss.backward()
optim.step()
# 保存网络参数
torch.save(
{
model: "模型参数"
optim: "优化器参数"
}
)
model.eval()
with torch.no_grad(): # 确保不会进行梯度计算
for j, data in enumerate(val_data):
inputs = data['x'] # 输入模型的数据
targets = data['y'] # 模型的目标集
outs = model(inputs) # 进行推理
loss = criterion(outs,targets)
lr_step # 学习率迭代
if __name__ == '__main__':
"""
调试函数
"""
main()
推理主程序
使用模型进行推理的时候,需要注意模型结果的保存
辅助的工具函数和类
这个模块一般用于保存一些工具类的函数,用以辅助分析数据和建立模型。