文章目录
第三十六周学习笔记
SuperPoint 复现进度
找到问题
通过以下三个步骤后,上周的问题最终解决
- 加上batch normalization层,loss从0.28~0.30降低到0.16~0.2
- 加上learning rate decay后,loss从0.16~0.2降低到0.13以下
- 更换优化器为Adam后,训练误差可以降低到0.002以下
所以最终问题主要是因为更换了Adam优化器而解决,原来的网络存在优化上的问题而不是曾怀疑的网络capability不足的问题时,也会出现train loss和test loss都很大的情况,即便尝试了多种SGD的learning rate也无法彻底解决
MagicPoint 训练结果
训练过程可视化
使用tf版本的参数,在90000张数据集上训练了90个epoch,并在每个epoch计算模型在测试集上的误差(此处的误差图像有误,训练误差忘记除以1000,测试误差忘记除以4500),最后模型在第17轮的误差最小,为0.03682,训练误差为0.011602,由于分了两次训练所以途中的曲线是两个不同的颜色
在训练集和测试集上的表现
左红色是ground truth,右蓝色是预测结果,这里使用了github上pretrained model的网络前端,对预测结果执行盒半径为4的nms并消除边缘上的一些预测结果,得到以下结果
训练集
测试集
大致看来结果表现不错,除了会错误检测离心率大的椭圆的长轴上的端点,在整个训练和测试集上的准确率和召回率等度量下周将给出
Pytorch Linear regression example
训练一个四次多项式的逼近网络,并与example对比
Pipline
- 生成数据集
- 训练
- 评估
结论
用三层隐藏层的全连接网络训练的结果如图
网络细节
- 三层隐层全连接
- SGD,lr=0.001
- MSE
发现
以下内容不作额外说明,仅仅表达在本次实验数据上的发现
- label的归一化影响了网络的优化
起初我没有将label进行归一化,loss往往降低到3~4左右就不降了,且拟合效果很差,这是因为,没有归一化时,由于MSE误差的特点,网络更偏向于将label绝对值大的点更优先考虑,大大影响了样本的均衡性,相当于给绝对值大的样本加上了一个很大的权值,最终无法顺利优化 - x的归一化可以使更大的学习率能够被使用
对label进行归一化之后,我也顺便对x进行了归一化,结果发现训练进程变慢,于是使用了更大的学习率,这一点是显然的,因为基于梯度的算法的更新准则是(以SGD为例):
w − = l r × d x w-=lr\times dx w−=lr×dx
若通过 μ , σ \mu,\sigma μ,σ对x进行归一化,则归一化后的更新实际上是:
w − = l r × d x σ w-=lr\times\dfrac{dx}{\sigma} w−=lr×σdx
因为往往x的方差大于1,所以这样做相当于使用了更小的学习率,因此归一化后我们可以使用更大的学习率 - 为了达到类似的训练效果的Adam的学习率常常比SGD小(十分之一左右),这个结论在之前训练MagicPoint也发现了,Adam比单纯的SGD更快,但是Adam达到瓶颈时会出现震荡
adam更新准则如下
注意到CS231n笔记中记道“Adagrad有大梯度的权值的学习率将会下降,反之则上升“,而Adam是基于Adagrad的自适应优化方法,所以,猜测可能是因为损失函数比较平滑,梯度较小,因此Adam起到了增加梯度的作用;到了训练的最后阶段,由于函数接近bowl的底端,因此梯度非常小,自适应方法因而增大了学习率从而导致训练的最后阶段出现震荡m = beta1*m + (1-bata1)*dx v = beta2*v + (1-beta2)*(dx**2) x += -learning_rate * m / (np.sqrt(v) + eps)
- 更深的模型lr需要更小,这个结论并不严格,训练过程中,实际表现出的情况如下
如图所示,使用同样的学习率,更深的网络会出现更大的摆动,但这也没有完全使得它们最后比浅层网络表现差,比如红色的3隐层网络虽然开始摆动幅度大,最后收敛值与蓝色曲线(2隐层)相当,可以得出的结论是,使用更小的学习率,可以使学习过程更加稳定平滑,从而也更可能收敛,如下图所示
- 如果将神经网络的输入
x
,转化为[x,x**2,x**3,x**4]
,然后仅使用一层网络(实际上就是线性拟合),则仅仅需要之前六分之一的轮次即可达到收敛,且精度很高,这说明神经网络有优点也有缺点- (+)深层的神经网络可以自动学习到这个先验信息
- (-)比起直接使用先验信息来说,神经网络学习的还不够好,说明好的先验可以给神经网络带来很大的提升(比如CNN)
问题
- 自己打包的batch好像无法被forward接受为输入?
可以,第一维为batch_size即可
本周小结
- MagicPoint训练,完成
- learning opencv 50%,完成
- 阅读论文,未完成
下周任务
- 评估MagicPoint的效果,生成pseudo ground truth
- 阅读论文rcnn
- learning opencv上册75%