一、从零开始实现
实现组件:1、数据流水线
2、模型
3、损失函数
4、小批量随机梯度下降优化器
PS:虽然现代的深度学习框架几乎可以自动化地进行所有上述工作,但从零开始实现可以确保我们真正知道自己在做什么。同时,了解更细致的工作原理将方便我们自定义模型、自b定义层或自定义损失函数。
1、生成数据集
2、读取数据集
SGD:优势:利用了GPU并行运算的优势,处理合理大小的“小批量”。每个样本都可以并行的进行模型计算与每个样本的损失函数的梯度也可以并行计算。因此计算几百个样本并不会比处理一个样本多太多时间。
PS:1、此数据迭代器对很适用于教学,但执行效率很低,可能会在实际问题上陷入麻烦。eg:要求我们将所有数据加载到内存中并执行大量的随机内存访问
2、在深度学习框架中实现的内置迭代器效率高很多,可以处理存储在文件中的数据和数据流提供的数据。
3、初始化模型参数
在初始化参数之后,我们的任务就是更新这些参数,知道这些参数足够拟合我们的数据。
4、定义模型、损失函数与优化算法
定义模型:将模型的输入和参数与模型的输出关联起来。
5、训练
过程:(1)初始化参数
(2)重复以下训练,直至完成
1)计算梯度
2)更新参数
PS:在机器学习中,我们通常不太关心恢复真正的参数,更关心如何高度准确预测参数。幸运:1、随机梯度下降通常能找到非常好的解 2、在深度网络中存在许多参数组合能够实现高度精确的预测
二、简洁实现
从零实现仅运用了:(1)通过张量来进行数据存储和线性代数;
(2)通过自动微分来计算梯度
实际上,由于数据迭代器、损失函数、优化器和神经网络层很常用,现代深度学习库也为我们实现了这些组件。
1、生成数据集
2、读取数据集
可以调用框架中现有的API来读取数据,将features和labels作为API的参数传递,并通过数据迭代器指定batch_size。布尔值is_train表示是否希望数据迭代器对象在每个迭代周期内打乱数据。
使用next从迭代器中获取第一项
3、定义模型
对于标准深度学习模型,可以使用框架的预定义好的层。这使我们只需要关注使用那些层来构造模型,而不必关注层的实现的细节。首先定义一个模型变量net,它是一个Sequential类的的实例。Sequential类将多个层串联在一起。当给定输入数据时,Sequential实例将数据传入到第一层,然后将第一层的输出作为第二层的输入,以此类推。
在pytorch中,全连接层在Linear类中定义。值得注意的是,我们将两个参数传递到nn.Linear中。第一个指定输入特征形状,第二个指定输出特征形状,输出特征形状为单个标量,因此为1。
4、初始化模型参数
通过net[0]选择网络中的第一个图层,然后使用weight.data和bias.data方法访问参数。我们还可以使用替换方法normal_和fill_来重写参数值。
5、定义损失函数与优化算法
当我们(实例化一个SGD实例)时,我们要指定优化的参数(可通过net.parameters()从我们模型中获得)以及优化算法所需的超参数字典。
6、训练
review:在每个迭代周期中,我们将完整遍历一次数据集(train_data),不停地从中获取一个小批量的输入和相应的标签。对于每一个小批量,进行如下步骤:
(1)通过调用net(X)生成预测并计算损失l(前向传播)
(2)通过进行反向传播来计算梯度。
(3)通过调用优化器来更新模型参数
PS:为了更好的衡量训练效果,计算每个迭代周期后的损失,并打印它来监控训练过程。