论文阅读:弱基础小白跑通PCN源码过程随记

论文名:PCN: Point Completion Network
源码:https://github.com/wentaoyuan/pcn
一些杂乱的记录:
1.一定要记得conda activate py36(后续所有的包其实安装在了这里面了)
2.初次安装完open3d之后 环境应该是被覆盖了 所以requirement安装的依赖就都没有了
3.查看makefile文件里面对应的路径,是否是你已下载好的or总服务器里有的(此处我还犯了个错,就是修改makefile一直不生效,后来发现是和远程服务器的映射关系写错了,一直改动的是另外的文件夹的makefile。此处的错误解决是因为在命令行里面通过vim看了该文件。所以啊,有时候可视化工具方便,但是你基础配置错了就要找半天毛病。)
4.tensorflow版本1.12.1,原因:
5.https://forums.developer.nvidia.com/t/cuda-with-tensorflow-issue-libcudart-so-9-0-cannot-open-shared-object-file-no-such-file-or-directory/62437/3
6.https://blog.csdn.net/wotainanlejnhj/article/details/120208545?spm=1001.2101.3001.6650.2&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7Edefault-2.no_search_link&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7Edefault-2.no_search_link

弃掉了之前的TensorFlow版本,转为实现pytorch版本了。
源码:https://github.com/qinglew/PCN-PyTorch
以下是阅读源码的一些杂乱记录:

1. pytorch:F.relu() 与 nn.ReLU() 的区别

其实这两种方法都是使用relu激活,只是使用的场景不一样,F.relu()是函数调用,一般使用在foreward函数里。而nn.ReLU()是模块调用,一般在定义网络层的时候使用。

当用print(net)输出时,会有nn.ReLU()层,而F.ReLU()是没有输出的。

2. 再次学习一下nn.Module

学习的参考链接:https://blog.csdn.net/qq_27825451/article/details/90550890

3. 有关pytorch中num_workers详解

一篇说明此问题说明得很好的博客截图
学习的参考链接:https://blog.csdn.net/qq_24407657/article/details/103992170

4. nn.Conv1d

计算过程的参考链接:https://www.cnblogs.com/talkaudiodev/p/14287562.html
理解时应将里面的所有矩阵转置一下,涉及到的行应都理解为列。所谓一维卷积,就是卷积时只看纵列。重点是卷积时,只在纵列一个方向上滑动。

5. 什么是shared mlp

以及对如下代码的理解:
first shared mlp
学习参考链接:https://blog.csdn.net/Passersby__/article/details/104941591

6. 对torch.max()的理解、对dim的理解

学习参考链接:https://www.cnblogs.com/flix/p/11262606.html
关于维度可以用一句话总结,0表示张量的最高维度(代表最外侧括号),1表示张张量的次高维度,2表示张量的次次高维度,以此类推。-1表示张量维度的最低维度(最内侧括号),-2表示倒数第二维度,-3表示倒数第三维度。

7. 代码中的第一个PN层理解

定义shared mlp中两个线性层的卷积
构造第一个PN层
矩阵变换、拼接草图

8. 代码中的第二个PN层理解

定义
构造第二个PN层
理解矩阵变换 草图

9. 理解全连接层

理解结构的话,简单来说就是:相邻层之间所有节点全部连接。
理解意义的话,参考链接:https://blog.csdn.net/nanhuaibeian/article/details/100532038

10. 理解decoder部分的第一阶段,生成粗略点云输出

在理解这部分的时候又对张量的维度有了进一步的理解,顺道也更正了前文的图。
首先仍然是定义网络:
全连接层网络定义
构造、应用
然后附上对维度的理解,顺道更新了前文的v:
粗略点云输出的维度理解

11. 理解decoder部分的第二阶段

定义
构造
对上一张草图的FC结果,加了一层修改(微小)
理解草图
至此,整个autoencoder部分(encoder+decoder)理解完成。

12. 理解optimizer

之前理解完了网络的构建(AutoEncoder部分),那么接着就是训练模型。训练模型的重要过程就在于对模型参数进行不断优化,源码里对模型参数的优化使用了torch.optim,是一个实现了多种优化算法的包。为了使用这个包,就需要构建一个优化器对象optimizer。
optimizer的参数详见官方文档。
【第一个参数是要被更新的参数,通常是tensor类型,在源码中通过调用network的parameters()获取】
【什么是weight_decay?就是L2正则化,简易理解为:为了防止过拟合,在代价函数后多加的那一项。】
optimizer的使用:
optimizer.step():一般都是backward计算完梯度后调用,起到更新的目的。
optimizer.zero_grad():pytorch的backward()计算是累积的,所以在每一轮里需要清空梯度值。一般在每一轮开始计算梯度的代码块之前调用。

13. 理解scheduler

scheduler的作用在于对optimizer中的学习率进行更新、调整,借助的是torch.optim.lr_scheduler模块。该模块内有一些对学习率进行调整的机制,源码中用到的是StepLR机制。
源码:scheduler = optim.lr_scheduler.StepLR(optimizer, step_size=20, gamma=0.7)
其中的step_size表示每训练20个epoch,更新一次参数;gamma是更新学习率的乘法因子(lr x gamma)。
通常而言,在一个batch_size内先进行optimizer.step()完成权重参数的更新过程,然后再进行scheduler.step()完成对学习率参数的更新过程。

14. 理解permute(0, 2, 1)维度变换操作

维度变换解释
换维前后对比

15. 理解使用loss时需要用loss.item()

使用loss时用item才能仅用其数值,要不然累加的就是一个对象,训练时内存会爆炸。
学习参考链接:https://www.zhihu.com/question/67209417/answer/344752405

16. 对eval评估阶段的代码阅读记录

  1. with torch.no_grad():在该模块下,所有计算得出的tensor的requires_grad都自动设置为False。在评估时关闭自动求导这一功能,因为不像train时需要用到梯度。
  2. network.state_dict():torch.nn.Module模块中的state_dict变量存放训练过程中需要学习的权重和偏执系数,state_dict作为python的字典对象将每一层的参数映射成tensor张量。
  3. 最小loss及epoch比较和记录:每一个epoch内包含着评估这一操作,评估是用val_dataloader做的。整个train过程并没有去记录最小loss,所有的loss比较都放到评估阶段统一对验证集做的,所以是公平合理的。

17. 成功跑完纪念

epoch默认值是100,只是为了看一下自己能不能跑通,所以设置的epoch为5。跑完时候还去demo测试了一下自己的模型。
成功跑完纪念

  • 8
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 30
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 30
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值