第三十六周学习笔记

第三十六周学习笔记

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更新准则如下
    m = beta1*m + (1-bata1)*dx
    v = beta2*v + (1-beta2)*(dx**2)
    x += -learning_rate * m / (np.sqrt(v) + eps)
    
    注意到CS231n笔记中记道“Adagrad有大梯度的权值的学习率将会下降,反之则上升“,而Adam是基于Adagrad的自适应优化方法,所以,猜测可能是因为损失函数比较平滑,梯度较小,因此Adam起到了增加梯度的作用;到了训练的最后阶段,由于函数接近bowl的底端,因此梯度非常小,自适应方法因而增大了学习率从而导致训练的最后阶段出现震荡
  • 更深的模型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%
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
当然,这是一份基于PyTorch的SuperPoint训练代码示例: ```python import torch import torch.nn as nn import torch.optim as optim from torch.utils.data import DataLoader from torchvision.transforms import ToTensor from superpoint.datasets import SuperPointDataset from superpoint.models import SuperPointNet from superpoint.losses import SuperPointLoss # 设置训练参数 batch_size = 16 num_epochs = 10 learning_rate = 0.001 # 加载数据集 train_dataset = SuperPointDataset(train=True, transform=ToTensor()) train_loader = DataLoader(train_dataset, batch_size=batch_size, shuffle=True) # 创建SuperPoint模型 model = SuperPointNet() device = torch.device("cuda" if torch.cuda.is_available() else "cpu") model.to(device) # 定义损失函数和优化器 criterion = SuperPointLoss() optimizer = optim.Adam(model.parameters(), lr=learning_rate) # 开始训练 total_step = len(train_loader) for epoch in range(num_epochs): for i, (images, keypoints, descriptors, masks) in enumerate(train_loader): images = images.to(device) keypoints = keypoints.to(device) descriptors = descriptors.to(device) masks = masks.to(device) # 前向传播 outputs = model(images) loss = criterion(outputs, keypoints, descriptors, masks) # 反向传播和优化 optimizer.zero_grad() loss.backward() optimizer.step() if (i + 1) % 10 == 0: print('Epoch [{}/{}], Step [{}/{}], Loss: {:.4f}' .format(epoch + 1, num_epochs, i + 1, total_step, loss.item())) # 保存模型 torch.save(model.state_dict(), 'superpoint_model.pth') ``` 请注意,这只是一个示例代码,你需要根据你的数据集和需求进行相应的调整和修改。你还需要确保安装了相应的依赖库,例如PyTorch、torchvision等。此外,你可能还需要自定义SuperPointDataset类和SuperPointLoss类,以适应你的数据集和损失函数。希望对你有帮助!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值