文章目录
num_worker
在调试过程中,会保存一些中间变量的文件来判断代码是否写的正确。本人就遇到一个问题,想保存一帧输入的点云,在自己定义的dataset的getitem函数中在两个地方分别保存了该点云,分别命名为file1和file2(内容是一样的)。但在可视化的时候,这两个点云不重合,而且来自独立的两帧。为什么会出现这个问题?
在定义dataloader时,将num_workder设置为了4,也就是说在同一时刻,dataloader开了4个getitem函数,在执行getitem过后,就会出现file1和file2。但其实,一共生成了4个file1和4个file2,只不过保存名字是一样的,就会存在覆盖的情况。而由于4个getitem同时执行,在生成file1和file2的时候先后顺序情况很多,很容易file1和file2的最后版本是来自于不同的getitem函数的。这就造成了最后可视化是来自两帧点云。如果我们在保存文件时,将文件名加入getitem的传入参数index时,每个getitem生成的文件都不同,当执行完getitem时就会出现4个file1和4个file2。相对应的file1和file2则完全吻合。
所以,以后在调试程序的时候,务必注意num_workers的问题。
Optimizer
optimizer的定义一定要放在网络加载到cuda之后,否则,optimizer传入的网络的权重是cpu上的,对应反向传播的loss和梯度也是cpu上的。会出现在optimizer.step()过程会出现错误。