目录
一、Colab简介和使用说明
1.Colab简介
colab是谷歌的一个线上深度学习训练平台,对于刚进实验室还没分配到工作站的研究生非常之友好。但是分配到工作站以后,不管是算力还是金钱还是方便程度,还是工作站香。
网址: https://colab.research.google.com/?utm_source=scs-index.
2.Colab使用说明
进去网页以后可以新建一个google colaboratory,可以把这个新建的页面当做jupyter+linux终端使用,里面既可以敲python,又可以加!敲linux命令。
2.1两种使用方式
2.1.1连接谷歌云盘
第一种方式是把.ipynb文件连接到谷歌云盘。
优点:所有下载、更改以及产生的数据都会同步到谷歌云盘并且保存,
缺点:假如处理大数据集的时候,时间占用最多的不是训练过程,而是数据的IO读写过程(反正就是云端与.ipynb之间的数据读写贼慢);而且谷歌云盘的空间也只有十几个G,处理不了大数据集。
使用方法:要使用这种方法就只需要在最开始加以下命令并运行,点击运行产生后的网址登录自己的谷歌账号就ok了。
建议:复现模型的时候使用,把数据集删减一些,这样可以保存代码调试数据和运行结果,方便理解。
2.1.2不连接谷歌云盘
第二种是不连谷歌云盘,直接在分配的在线的存储空间上跑。
优点:好处是快的一批,而且在线分配的存储空间也挺大,好像不开pro也有200G左右。
缺点:一段时间没有代码运行就会自动断开与谷歌服务器的连接,就得一切从头开始。
使用方法:直接不用输上图的代码,直接用就可以。
建议:在跑正儿八经的大模型的全数据集的时候使用,这样训练能快点儿。
2.2具体使用细节
2.2.1GPU设置
在新建的colaboratory页面点击修改,里面有个笔记本设置,点进去选择GPU,点保存,等待右上角分配GPU即可。(google白嫖的算力貌似还不如1080,tb上可以买pro,一个月75RMB)
注意,一定要先分配GPU再进行后面操作,不然等你把数据集啥的都弄完了再分配,你就发现你得再重新再搞一次
2.2.2程序管理
点击代码执行程序选项,里面有个管理会话,可以管理你打开的所有colaborabory(其实没太有必要,每一个文件都分配独立的在线空间)。
2.2.3具体编程
如一开始所说,可以把colaborabory当成jupyter+linux后端。
编python的时候和jupyter的使用方法一样,唯一比较不爽的地方是快捷键太麻烦,对在上面编python其实没那么友好,所以我一般都是在pycharm上改好代码,直接上传。假如没脸谷歌云盘的话,也可以在git下来以后,直接点击最左边小文件夹图表,双击对应py文件,直接笔记本改。
linux指令照常使用,就是要在前面加个感叹号,这里就不再赘述。
二、TSN代码复现
1.数据集准备和处理
1.1数据集下载
复现用的UCF101数据集
下载地址: https://www.crcv.ucf.edu/research/data-sets/ucf101/
要下里面的两个东西,一个是数据集本身Data Set,另一个要下数据集分割依据,也就是Action Detection
1.2数据集处理
1.2.1数据上传
数据集下载完成后,开始数据处理,首先在谷歌云盘建立TSN文件夹,然后git数据处理要用的mmaction代码和训练要用的tsn代码
然后再mmaction的data文件夹下创建ucf101文件夹,再在ucf101文件夹下创建annotations、rawframes、videos文件夹。
annotations:存放刚才下载的分割依据
rawframes:存放视频提帧后的帧
videos:存放刚才下载的原始ucf101数据(我只放了前三个动作,Archery、ApplyLipstick、ApplyEyeMakeup)
annotations和videos里面的内容需要自己手动上传进去
1.2.2提帧
进入mmaction/data_tools/目录下,安装mmcv
然后运行bulid_rawframes.py,对视频进行提帧,结果放在rawframes文件夹里
运行结束后,可以在谷歌硬盘上找到对应文件夹打开看看,里面就是一帧一帧的照片
1.2.3生成file_list
先切到mmaction目录下,安装mmaction缺少的相关文件(不知道啥情况,换了源也缺,反正补上就ok了)
然后,再切到data_tools/ucf101/文件夹下,生成分割文件file_list
生成后的文件在ucf101下,如下图所示。
2.训练模型
2.1修改对应代码
2.1.1修改main
main.py里面ucf的num_class是101,这里只用了三个,改成3
把main里面的TSNDataSet类引用的路径都改成绝对路径。
把预测的accuracy函数,因为只有三个类,没有top5只有top3,把参数改为3,train和validate都改
2.1.2修改dataset
在dataset.py中,get函数里面也加入绝对路径
2.2训练
转入tsn-pytorch文件下,运行main.py函数,把该设置的参数设置好,就ok了
运行结果如下图所示
最后报错更新不动了原因应该是训练的太好了,top1、top3都100%,根本还是数据集太小了,等着跑个稍微大一点儿的数据集再测试一下。
2.3训练过程中可能遇到的问题
第一个:
错误:
解决方法:
将target = target.cuda(async=True)改为target = target.cuda()
第二个:
错误:
RuntimeError: view size is not compatible with input tensor’s size and stride (at least one dimension spans across two contiguous subspaces). Use .reshape(…) instead.
解决方法:
将correct_k = correct[:k].view(-1)改为correct_k = correct[:k].contiguous().view(-1)
第三个:
错误:
RuntimeError: Legacy autograd function with non-static forward method is deprecated. Please use new-style autograd function with static forward method. (Example: https://pytorch.org/docs/stable/autograd.html#torch.autograd.Function)
解决方法:
见别人CSDN:链接: https://blog.csdn.net/seamanj/article/details/110083044
第四个:
错误:
IndexError: invalid index of a 0-dim tensor. Use tensor.item in Python or tensor.item() in C++ to convert a 0-dim tensor to a number
解决方法:
就是出错误的位置上那个参数是个tensor,但是当时的pytorch用了数组的调用方法,所以把数组的调用改成.item
第五个:
错误:RuntimeError: Legacy autograd function with non-static forward method is deprecated. Please use new-style autograd function with static forward method.
解决方法:
找到models.py中的forward函数,把output = self.consensus(base_out)改为output = self.consensus.forward(base_out)
找到main.py中的train函数,把output = model.forward(input_var)改为output = model.forward(input_var)
除此之外可能还有问题,大多数应该都是一些pytorch版本不匹配产生的,最多的应该就是tesnor的调用数值方法。找到对应行,百度一下能解决90%
3.测试模型(没弄完,要去听岛屿心情了,先不写了,回来弄完写)
三、瞎写八写在最后
这周除了上课,一半再弄这个一半在复习和写结课作业。从一开始从本地跑不行,再到弄到自己的二系统ubuntu上屁都弄不懂,再到找到colab弄明白colab是怎么回事儿再到慢慢弄出来。回过头来看这一周好像又没啥工作量,其他几个实验室研一的同学嗡嗡嗡的往前窜,麻了。上周看了一句话大体意思是:就怕别人起跑比你早,速度比你快,加速度还比你快。这种激汤能不能别再让我刷到了。年薪五十万的工作得有人做,那年薪五万的不也得有好同志干吗。晚上吃饭的时候刷视频还看到一句话:每个人如果都能出人头地,哪还有平凡人?
拼尽全力,接受普通。