首页 飞桨领航团 帖子详情
22
收藏
快速回复
飞桨领航团 文章学习资料 268 1
22
收藏
快速回复
飞桨领航团 文章学习资料 268 1
训练的过程就是让损失函数变小的过程,用梯度下降法(梯度就是当前点的导数值)。每一个样本对梯度都有贡献,总梯度是对每个样本对梯度贡献的平均值。如果是每次从总的数据集中随机抽取出小部分batch数据来代表整体,基于这部分数据计算梯度和损失来更新参数,这种方法被称作随机梯度下降法(Stochastic Gradient Descent,SGD),每当整个数据集都遍历到了的时候(需要样本乱序),则完成了一轮训练,也叫一个epoch。 当几个模型的准确率在测试集上差距不大时,尽量选择网络结构相对简单的模型。往往越精巧设计的模型和方法,越不容易在不同的数据集之间迁移。 对于计算机视觉问题,效果最好的模型仍然是卷积神经网络。卷积层负责对输入进行扫描以生成更抽象的特征表示,池化层对这些特征表示进行过滤,保留最关键的特征信息。 Softmax函数:如果模型能输出10个标签的概率,对应真实标签的概率输出尽可能接近100%,而其他标签的概率输出尽可能接近0%,且所有输出概率之和为1。 交叉熵计算对应着“正确解”标签的输出的自然对数。比如,假设正确标签的索引是“2”,与之对应的神经网络的输出是0.6,则交叉熵误差是−log⁡0.6=0.51;若“2”对应的输出是0.1,则交叉熵误差为−log⁡0.1=2.30。 开始训练神经网络之前,需要进行数据(预)处理,包含五个部分:数据导入、数据形状变换(比如一维变二维)、数据集划分(训练集和测试集)、数据归一化处理(normalisation,让数据变成0-1之间)和封装load data函数(defload_data())。 · 同步数据读取:数据读取与模型训练串行。当模型需要数据时,才运行数据读取函数获得当前批次的数据。在读取数据期间,模型一直等待数据读取结束才进行训练,数据读取速度相对较慢。 · 异步数据读取:数据读取和模型训练并行。读取到的数据不断的放入缓存区,无需等待模型训练就可以启动下一轮数据读取。当模型训练完一个批次后,不用等待数据读取过程,直接从缓存区获得下一批次数据进行训练,从而加快了数据读取速度。 · 异步队列:数据读取和模型训练交互的仓库,二者均可以从仓库中读取数据,它的存在使得两者的工作节奏可以解耦。 注意,异步读取数据只在数据量规模巨大时会带来显著的性能提升,对于多数场景采用同步数据读取的方式已经足够。 更新参数的优化算法除了SGD,还有 · Momentum:引入物理动量的概念,给梯度下降的过程加入一定的“惯性”累积,就可以减少更新路径上的震荡,即每次更新的梯度由“历史多次梯度的累积方向”和“当次梯度”加权相加得到。 · AdaGrad:Adaptive Gradiant自适应学习率,参数更新的步长应该随着优化过程逐渐减少,减少的程度与当前梯度的大小有关。RMSProp是在AdaGrad基础上的改进,AdaGrad会累加之前所有的梯度平方,而RMSprop仅仅是计算对应的梯度平均值,因而可以解决AdaGrad学习率急剧下降的问题。 · Adam:由于动量和自适应学习率两个优化思路是正交的,因此可以将两个思路结合起来,这就是当前广泛应用的算法。 如果模型不自适应学习率,可以设置学习率逐渐降低,比如算出总步数 totalsteps = (int(num_sample//batch_size) + 1) * epoch_num,再用 lr = fluid.dygraph.PolynomialDecay(0.01, total_steps, 0.001)。
0
收藏
回复
全部评论(1)
时间顺序
DeepGeGe
#2 回复于2021-12

Adam是最常用最省事的优化器,但是在一般分类和检测任务中,要想去的更好的性能指标,好像Momentun优化器会更好,最后结果一般会多零点几至一两个点。

0
回复
在@后输入用户全名并按空格结束,可艾特全站任一用户