【论文学习之SNE-RoadSeg】跑通SNE-RoadSeg代码

0 序言

        作为一个论文学习的小白,第一次去跑一篇论文代码可谓是下了老大功夫。从一开始的陌生,到现在逐渐熟练,对于如何正确跑通论文代码也有了较为清晰的方法步骤。这段时间跟着学长学习研究论文SNE-RoadSeg,所以接下来我将围绕此篇论文记录第一次跑代码的过程。

一、服务器使用

        此前对于服务器概念较为模糊,这次算是正式接触服务器的使用。其实可以把服务器看作远程操作一台可以容纳很多用户的电脑,那么要操作该电脑(比如创建文件、删除文件、跑代码之类的)需要使用终端命令,在之后的学习过程中部分命令需要熟练掌握,不会的可以“面向CSDN”、“面向百度”,以下链接为我学习终端命令时找到的一篇博客,感觉还不错。当然我自己也整理了一些最近常用到的终端命令。

(39条消息) linux常用命令_超级大洋葱的博客-CSDN博客_linux常用命令https://tangxing.blog.csdn.net/article/details/110275929

#注意:conda命令前提是安装了Anaconda

创建环境  conda create -n environment_name python=版本号(如3.7)
删除环境  conda env remove -n environment_name
激活环境  source activate environment_name  /conda activate environment_name
退出环境  conda deactivate
 
安装包                 conda install package
查看已安装包      conda list
更新包                 conda update package
移除包                 conda remove package

看所有的用户                      cat /etc/passwd 或 top
创建用户                             useradd -m -s /bin/bash username 或 sudo useradd -r username
设置密码                             passwd name
删除用户                             userdel name
查看当前已登录用户            w

查看GPU                            nvidia-smi
查看用户文件清单               ls

       当然,除了终端可以操作服务器中的文件,也可以使用服务器管理工具,如WinSCP(学长推荐我使用的),可以自行百度并下载安装,安装过程so easy。

                                                  

        那么要如何在服务器上创建普通用户呢?请看下文:

        1、登录服务器(可以理解为登录非普通用户的账号),当然服务器的账号密码可能不是谁都知道,要问负责人(就像我问的是实验室会长)。

        2、登录成功后,输入创建用户的命令

     useradd -m -s /bin/bash username 或 sudo useradd -r username

   备注1:最后的“username”根据个人所需来命名,不可以是中文,好像也不能用英文大写(还没研究过这个问题所以不太确定,但是学长是这么跟我说的)

   备注2:注意第一种创建命令中的/bin/bash,这部分千万不要在bash后面再加一个/或者其他什么字符,这会导致之后即使用户创建成功输入密码也无法登录,创建完之后可能也会报如下图的警告。

并且当用查看所有用户命令cat /etc/passwd时显示的用户列表中你的用户“与众不同”。

 上述为血泪经验!!!

        3、创建用户成功后设置用户密码,输入如下命令

     passwd username

        至此,创建普通用户过程结束。可以使用命令cat /etc/passwd查看你所使用的服务器存在的全部用户,顺便可以借此确认是否创建用户成功。

        另外再介绍大家如何用VSCode的终端连接服务器。

        1、在VSCode中下载安装插件Remote-SSH 

            

2、下载安装完了之后VSCode界面的左下角会出现蓝色框(如下图所示),点击它;

                                       

       此时上方会出现如下对话框,选择第二个

      然后又会跳出新的对话框,在这个对话框中输入 用户名@服务器ID

之后输入用户密码并按下Eenter键

 下方选择打开文件或文件夹或其他操作,此时就会跳出对话框让你选择你的用户文件夹下的文件夹或文件

 选择上方的终端->新建终端

 之后就可以像在cmd中一样操作你的服务器啦,而且还可以在VSCode上改完代码后再在下方的终端输入命令跑代码,不需要在终端改代码简直太方便了(在终端改代码超级麻烦,需要用指令进入.py文件,然后再用指令进行编辑,balbala一大堆操作)。

二、环境搭建

        要想跑通论文代码需要阅读作者发布在github上的环境要求和操作步骤,即README.md。像我所跑的这篇论文代码要求的环境是Python 3.7, CUDA 10.0, cuDNN 7 和 PyTorch 1.1。

       1、安装NVIDA驱动(这个步骤不一定每个人都需要,如果之前有人给所使用的服务器安装过了就不需要再安装,就像我就直接略过这个步骤)。

       2、下载并安装CUDA和cuDNN(一定一定一定要注意版本!!!)

        【下载】CUDA10.0官网(需要其他版本的自行百度哦)

       CUDA Toolkit 10.0 Archive | NVIDIA Developer        

       【下载】cuDNN 官网(注意下载前需要注册登录cuDNN的版本根据需要进行选择)

        cuDNN Archive | NVIDIA Developer

        由于版本较多,所以可以用快捷键Ctrl+f搜索关键词找到自己需要的版本定位,像我需要的是cuDNN 7所以我的关键字就搜索7,然后选择for CUDA10.0的版本。

       下载之后将它们从Windows系统中将文件移到自己在服务器创建的账号下,可以使用命令行来转移文件(这个方法速度快,操作如下连接);也可以使用WinSCP(前面内容介绍过这是啥)自带的复制粘贴。为什么这么做,是因为我们要在自己的服务器账号上搭建环境,而不是在本机上搭建环境,所以下载的东西必须放在服务器上。

        命令行远程复制文件连接
(42条消息) 用scp命令从windows上传文件到linux服务器_小涛大仙的博客-CSDN博客_scp 上传到linuxhttps://blog.csdn.net/weixin_43728814/article/details/120914202?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522164225300416780261982893%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=164225300416780261982893&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~first_rank_ecpm_v1~rank_v31_ecpm-7-120914202.pc_search_insert_ulrmf&utm_term=windows%E6%96%87%E4%BB%B6%E4%B8%8A%E4%BC%A0%E5%88%B0%E6%9C%8D%E5%8A%A1%E5%99%A8&spm=1018.2226.3001.4187        文件放好后就可以使用命令来安装CUDA和cuDNN啦!

        PS:安装过程部分图片和内容摘自其他博主博客,稍后会附上链接。

      【安装】CUDA10.0

mkdir -p local/cuda10.0

# 创建我们cuda10.0解压的文件夹,local是自建文件夹名,可自行更改


./cuda_10.0.130_410.48_linux.run

#斜杠/后面这一串是从官网下载来的CUDA文件名,注意更改

驱动选择no,toolkit选择yes,其他都选择no。路径输入我们刚才的路径,应该要输入绝对路径,/home/username/local/cuda10.0。

 过程顺利的话CUDA10.0就安装好啦!如下图所示:

接下里可以用命令进入到它的bin文件夹查看版本号

cd local/cuda9.0/bin/
./nvcc -V

注意到此时查看版本用了./,是因为nvcc这个已经编译好的程序只存在于“local/cuda10.0/bin/”这个当前目录下,并不是全局目录下,如果我们要让我们的程序能够在全局调用得到我们的cuda,我们需要将cuda加入到环境变量里面。所以需要编辑.bashrc这个文件,然后将cuda的目录信息加入到里面,刷新环境变量,这时候我们的cuda就变成全局了。操作如下:

vim ~/.bashrc # ~/是指我们的默认目录,就是我们的home目录

然后按i进入insert模式,到最下面一行,添加配置信息。

# cuda10.0
export PATH=/home/username/local/cuda10.0/bin:$PATH
export LD_LIBRARY_PATH=/home/username/local/cuda10.0/lib64:$LD_LIBRARY_PATH
export C_INCLUDE_PATH=/home/username/local/cuda10.0/include:$C_INCLUDE_PATH
export CPLUS_INCLUDE_PATH=/home/username/local/cuda10.0/include:$CPLUS_INCLUDE_PATH

编辑完按:wq保存并退出

之后再在终端输入如下命令行:

source ~/.bashrc #刷新环境变量
nvcc -V # 这时候输入这个就可以查看cuda版本信息了,而不需要加入./

【安装】cuDNN7

终端输入如下命令行:

tar zxvf cudnn-9.0-linux-x64-v7.tgz # 解压,生产的文件夹叫cuda,最后cp(拷贝)完后这个文件夹就可以删掉了;命令的最后一串是从官网下载下的cuDNN的文件名,注意更换
cp cuda/include/cudnn.h local/cuda10.0/include/
cp -a cuda/lib64/* local/cuda10.0/lib64/

我在安装CUDA10.0时遇到的三个问题(这三个问题并不是所有人都会遇到):

问题1:安装CUDA时没有可执行的权限

解决: 需要登入服务器主用户账号,用命令chmod  777 filename

问题2:在安装过程中会出现 白底色+More0% 这样的字符串,并一直停留在这行
解决:按Ctrl+c即可

问题3:安装过程中回答完如下问题后就报错了

 解决:出现这个问题的原因是gcc版本不匹配。由于实验室的服务器的操作系统是Ubuntu20.04,儿Ubuntu20.04自带的gcc版本为9.7.0,需要添加gcc7才可安装CUDA10.0。因此需要输入命令为gcc降级,具体操作如下(为其他博主博客内容的摘抄,稍后附上链接),注意下面的命令需要进入服务器的主用户账号,而不是自己的普通用户。

   降级过程截图:

至此,CUDA10.0和cuDNN 7都配置成功啦!再次提醒大家配置环境一定要根据自己的需求下载版本,不可盲目照抄所述步骤,并注意命令行中涉及到的文件名和用户名也是需要根据自己的命名来修改,而不是简单的copy就完事了哦!安装CUDA和cuDNN以及降级gcc的参考博客如下:

(39条消息) 深度学习环境搭建(NVIDIA驱动+CUDA9.0+CUDNN7.0+Tensorflow1.8)_Zebiao Wu Blog-CSDN博客https://blog.csdn.net/Wuzebiao2016/article/details/87886356(39条消息) Ubuntu20.04安装cuda10.1_wwlswj的博客-CSDN博客_ubuntu20安装cuda10https://blog.csdn.net/wwlswj/article/details/106364094        

        3、下载并安装Anaconda3

         【下载】Anaconda下载网站(根据自己需要选择)

Index of /anaconda/archive/ | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror

        【安装】输入如下命令

sh Anaconda3-5.0.0-Linux-x86_64.sh #后面是下载来的Anaconda3文件名,自行修改

        安装过程中回答问题都输入yes,安装成功后,在终端输入python或python3验证安装是否成功(注意Anaconda会自带Python版本),如果显示Anaconda相关信息以及Python版本号就说明安装成功,如下图所示。

         4、安装Python3.7和Pytorch1.1

        由于不同的论文代码使用的Python版本、Pytorch版本、Tensorflow版本或者包都会有所不同,所以最好建立虚拟环境,不要在base环境下跑代码,这样一来方面管理,二来跑不同的代码不会造成环境干扰。建立完虚拟环境后,都需要激活才能使用虚拟环境,否则都是在base环境下。

        ①建立Python3.7的虚拟环境

        conda create -n environment_name python=3.7

        #environment_name自定义,即可以为自己的虚拟环境命名

       ②激活虚拟环境

       source activate environment_name  或 conda activate environment_name

       ③虚拟环境下安装Pytorch1.1

        Pytorch下载官网

        Previous PyTorch Versions | PyTorch

        根据自己的需要下载对应版本 

    把框起来的那句copy到终端即可,可以把后面的-c pytorch删除

conda install pytorch==1.1.0 torchvision==0.3.0 cudatoolkit=10.0

  至此,我所需要的跑代码的环境(CUDA10.0,cuDNN 7,Python3.7,Pytorch1.1)全部配置完。

三、数据集下载

根据作者发布在github上的操作步骤下载对应的数据集,并将数据集放在正确的路径之下。

路径(即文件的放置顺序和情况):

SNE-RoadSeg
 |-- checkpoints
 |  |-- kitti
 |  |  |-- kitti_net_RoadSeg.pth
 |-- data
 |-- datasets
 |  |-- kitti
 |  |  |-- training
 |  |  |  |-- calib
 |  |  |  |-- depth_u16
 |  |  |  |-- gt_image_2
 |  |  |  |-- image_2
 |  |  |-- validation
 |  |  |  |-- calib
 |  |  |  |-- depth_u16
 |  |  |  |-- gt_image_2
 |  |  |  |-- image_2
 |  |  |-- testing
 |  |  |  |-- calib
 |  |  |  |-- depth_u16
 |  |  |  |-- image_2
 |-- examples
 ...

数据集下载说明:

 四、跑代码

 1、跑脚本run_example.sh

bash ./scripts/run_example.sh

跑成功的话,有三种图片normal.png,pred.png和prob_map.png会出现在examples文件夹中。

此外,终端也会显示跑代码的过程。

2、跑脚本test.sh 

bash ./scripts/test.sh

跑成功的话,会有新的文件夹testresults出现。

此外,终端也会显示跑代码的过程。

3、跑脚本train.sh

bash ./scripts/train.sh

跑成功的话,会有新的runs文件夹同时checkpoints文件夹会有新的权重文件。

我在跑train.sh这个脚本时候出现了两个问题:

1、显存不够

 解决: ①将options文件夹里的base_options.py中的batchsize把2改为1。

          ②重开ssh或者重启电脑再开ssh,我也不知道为啥这样可以。

参考博客:(41条消息) 解决:RuntimeError: CUDA out of memory. Tried to allocate 128.00 MiB (GPU 0; 2.00 GiB total capacity; 1_地中海の养成记-CSDN博客https://blog.csdn.net/weixin_43760844/article/details/113462431

①改代码:不计算梯度/调整batch size

②更换更高性能更高显存的显卡

2、AttributeError:'NoneTypr' object has no attribute 'astype'

可能是图片路径不对(我认为这个问题最难解决,主要是我不知道从哪里下手解决)

 

 kitti_dataset.py中的第112行表示读取图片并将其转换为float32,但是却报错了没有astype。这个问题说明图片没有读取成功,既然没有读取成功也就没有astype,没有astype也就无法转换。所以关键是为什么图片没有读取成功,而没有读取成功的原因可能就是前面说的图片路径不对。如果真的是路径不对的问题,那么我想知道为什么会有图片路径不对的问题出现。

可以注意到报错内容的最上面几行有WARN,说can't open/read file:check file path/integrity,并根据前面提示的路径去找图片,发现根本找不到。因为datasets的depth_u16文件中的图片都放在testing和training文件中,而报错的信息提示这些图片要直接在depth_16文件中,即把testing或training中的图片都复制在depth_u16文件中,重新跑一遍代码,成功!虽然WARN只提示了3张图片,但提示中还给出了警告的代码,即train.py的第101行,这是一个循环,说明是通过循环读取了所有图片,不只是提示的000000.png、000001.png、000002.png。

 其实我很早就发现了这个问题所在,但是问了学长,学长说不是,而是通过加一行代码解决,我就懵圈了。后来学长帮我看了之后,他让我加了一行代码(应该就是他之前说的那行代码),打印出图片路径,找到了问题所在,也就是我之前就注意到的问题。好家伙,所以学长加的代码只是一个辅助的,并不是我理解的通过加一行代码直接解决,哈哈哈哈。 

历经千辛万苦终于跑通了!

但由于跑通这个脚本需要两三天,如果这期间电脑关机了或者网络断开了任务就会被终止,前面代码就白跑了,所以需要将代码挂载到screen跑,这样即使电脑关机了代码还会在服务器跑,自己就可以开开心心去玩耍啦!下面附上screen的介绍和使用方法:
(40条消息) screen 远程服务器 关掉本地也可以跑代码_白雪-CSDN博客https://blog.csdn.net/qq_36654309/article/details/112219194

 1、ssh连接到服务器

2、输入命令创建新窗口:screen -S 窗口名  #窗口名自定义

3、cd切换路径到需要跑代码的文件,例 cd /home/wendy/SNE-RoadSeg-Master

4、激活之前为了跑代码创建的虚拟环境

5、命令行运行代码

6、Ctrl+a+d退出screen,这样即使关掉cmd窗口/关机代码还会继续在服务器中跑

//后面操作为查看操作哦

7、命令查看自己所有screen:screen -ls

8、查看后会看到(Detached)或(Attached);Detached意思是当前screen没有被打开,相对的是Attached表示当前screen正处在打开状态

9、重新打开创建好的窗口可以看到程序运行状态:screen -r 窗口名

10、命令删除窗口:screen -X -S 窗口名

【注意】重新打开screen窗口的时候可能会报错There is no screen to be resumed matching,解决方法:首先使用screen -d *****(id),先退出,然后再使用 screen -r *****(id)重新连接

参考博客:

(40条消息) 使用screen恢复会话时出现There is no screen to be resumed matching错误解决办法_wavehaha的博客-CSDN博客https://blog.csdn.net/wavehaha/article/details/114969535

 跑完train.sh最终结果

五、总结

        第一次跑论文代码可谓是辛酸史,一共用了两台服务器才跑成功:好不容易花了一天时间在第一台服务器中搭建好环境,结果第二题跑了一天代码、解决了一天bug才发现这台服务器不好跑这个代码,于是学长让我换一台服务器。在另外一台服务器中又要重新建立用户,与用第一台服务器由实验室同学帮我建立用户不同的是,这次我得亲自动手建立用户,还得顺便帮学长也建立一个。新建用户过程也不顺利,由于我输入错创建命令,多了一个/,导致始终无法登录用户,在删除这个错误的用户过程中花了很多时间,奇葩的是意识到问题出在哪里后学长的账户分分钟创建好,拿自己先开刀属于是,笑cry。建立完了之后又得重新搭建环境,好在有了第一次的经验,第二次搭建环境就顺利多了,速度也快了很多。第二次搭建完环境后,终于又到了跑代码环节,论文中的前两个脚本跑得很顺利,超级开心,没出bug,结果到了第三个train.sh脚本又出现了我现在不太能解决的问题,困扰了很久。

        怎么说呢,这次跑代码得到了很多锻炼,比如服务器新建用户还有在服务器搭环境,也知道了跑一篇论文代码的过程,不像以前听起来那么抽象了。

        希望自己继续冲冲冲!!!

        

  • 11
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 18
    评论
T-SNE是一种非线性降维算法,它可以将高维数据映射到二维或三维空间中进行可视化。PyTorch是一种开源的深度学习框架,可以使用其强大的功能来实现T-SNE算法。 在PyTorch中,首先需要准备原始数据和相应的标签。可以使用PyTorch的数据加载器(DataLoader)来读取和处理数据。然后,需要构建一个深度神经网络模型作为T-SNE算法的基础模型。可以使用PyTorch的nn.Module类来定义一个模型,包括输入层、隐藏层和输出层。 接下来,需要定义一个损失函数和优化器。在T-SNE中,常用的损失函数是KL散度(Kullback-Leibler Divergence),可以使用PyTorch中的nn.KLDivLoss来定义损失函数。优化器可以使用PyTorch中的Adam或SGD等算法进行定义和初始化。 然后,需要设置训练循环,通过迭代训练模型来不断优化损失函数的值。在每个训练步骤中,首先将数据输入到模型中进行前向传播,然后根据损失函数计算损失值,再通过反向传播更新模型的参数。可以使用PyTorch的自动求导功能来实现反向传播。 最后,可以使用训练好的模型将高维数据映射到二维或三维空间,并进行可视化。可以使用matplotlib或其他可视化工具来绘制数据的散点图或其它形式的可视化图形。这样可以直观地观察到不同样本之间的相似性或差异性。 总结起来,使用PyTorch实现T-SNE算法的主要步骤包括数据准备、模型构建、损失函数和优化器定义、训练循环以及可视化展示。通过利用PyTorch的丰富功能和简洁的API,我们可以更方便地实现T-SNE算法,并观察数据的降维效果。
评论 18
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Wxy.Wd

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值