论文名: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() 的区别
- 2. 再次学习一下nn.Module
- 3. 有关pytorch中num_workers详解
- 4. nn.Conv1d
- 5. 什么是shared mlp
- 6. 对torch.max()的理解、对dim的理解
- 7. 代码中的第一个PN层理解
- 8. 代码中的第二个PN层理解
- 9. 理解全连接层
- 10. 理解decoder部分的第一阶段,生成粗略点云输出
- 11. 理解decoder部分的第二阶段
- 12. 理解optimizer
- 13. 理解scheduler
- 14. 理解permute(0, 2, 1)维度变换操作
- 15. 理解使用loss时需要用loss.item()
- 16. 对eval评估阶段的代码阅读记录
- 17. 成功跑完纪念
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
以及对如下代码的理解:
学习参考链接: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层理解
8. 代码中的第二个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评估阶段的代码阅读记录
with torch.no_grad():
在该模块下,所有计算得出的tensor的requires_grad都自动设置为False。在评估时关闭自动求导这一功能,因为不像train时需要用到梯度。network.state_dict():
torch.nn.Module模块中的state_dict变量存放训练过程中需要学习的权重和偏执系数,state_dict作为python的字典对象将每一层的参数映射成tensor张量。最小loss及epoch比较和记录:
每一个epoch内包含着评估这一操作,评估是用val_dataloader做的。整个train过程并没有去记录最小loss,所有的loss比较都放到评估阶段统一对验证集做的,所以是公平合理的。
17. 成功跑完纪念
epoch默认值是100,只是为了看一下自己能不能跑通,所以设置的epoch为5。跑完时候还去demo测试了一下自己的模型。