![5cc31290a45f57b53d204d67141d9770.png](https://i-blog.csdnimg.cn/blog_migrate/df334862a441a3d6f0b57f5911b99c72.jpeg)
![afc43084b8e677c67921d540bfa7f8d8.png](https://i-blog.csdnimg.cn/blog_migrate/b86a3a917d646581eed5f657217422a4.jpeg)
![7e729daca824d23837b0139f5f387c5b.png](https://i-blog.csdnimg.cn/blog_migrate/5d1b2c52b64ae183564f5c614bc5734d.jpeg)
SAST Weekly 是由电子工程系学生科协推出的科技系列推送,内容涵盖信息领域技术科普、研究前沿热点介绍、科技新闻跟进探索等多个方面,帮助同学们增长姿势,开拓眼界,每周更新,欢迎关注!欢迎愿意分享知识的同学投稿至 eesast@mail.tsinghua.edu.cn , 期待你的作品!
![e0d074588e64274df795f245c5ce4c4f.png](https://i-blog.csdnimg.cn/blog_migrate/f60308ebf83d62c3aa55e26447013065.jpeg)
![a90d606035bc295e7f4dbe788307b967.png](https://i-blog.csdnimg.cn/blog_migrate/77dc7f3a8781b66ebe1b59a3182a6bff.jpeg)
![f28af1a453286ac7f84b67b28f42e71f.gif](https://i-blog.csdnimg.cn/blog_migrate/aa78c9831963fcf1112aaadadc15013b.gif)
相信已经有不少同学接触过Pytorch了(媒认课上还见到了九字班的同学),作为目前最流行的深度学习框架之一,Pytorch本身已经具备了入门简单,代码简洁等优点,它可以让你把精力专注在在实现自己的模型上,很适合学生、研究人员来使用。
尽管Pytorch中需要用户自己实现的功能已经非常少了,但是除了定义自己的模型之外,我们还需要在代码中加入导入、加载数据集,手写训练、交叉验证循环,保存、绘制loss曲线等等写起来重复度高并且还会让你的代码变得不那么优美的内容(主要是写起来麻烦)。那么,有没有一种——
![f712c69a53f05afff7ca2a63b16ce17a.png](https://i-blog.csdnimg.cn/blog_migrate/6cfaba3001e01cea6bce3f2bd6b5cba7.png)
Pytorch Lightning可以帮助你把写Pytorch变得更加轻松愉快[小恐龙点赞]
![f28af1a453286ac7f84b67b28f42e71f.gif](https://i-blog.csdnimg.cn/blog_migrate/aa78c9831963fcf1112aaadadc15013b.gif)
官方文档是这样描述它的
Lightning is a way to organize your PyTorch code to decouple the science code from the engineering. It's more of a PyTorch style-guide than a framework.
简单来说,你只需要关注你的模型的实现,也就是Research Code
,其他的Engineering code
都交给Lightning的Trainer来实现
先用一张图来看看Pytorch Lightning能为你做什么
![4d4d7e29d87db3e70e1363d61d74773a.gif](https://i-blog.csdnimg.cn/blog_migrate/84cefe31e2a23e70fb4807d935713b27.gif)
具体到代码,你可以省去图中蓝色的部分
![7fdfe3b00406e818b5e93dfce55a0b51.png](https://i-blog.csdnimg.cn/blog_migrate/67bbbd35e61c463121e83e195f627954.png)
![fa52f31ebf5269a98114c4aac0ea3d17.png](https://i-blog.csdnimg.cn/blog_migrate/f93b417677c7d97efb75692f2e1d2f3c.png)
而原本的定义Pytorch模型的代码可以直接用于LightningModule。事实上,你只需要用另一种风格来重新组织你的Pytorch代码而不需要学习新的概念。
![f28af1a453286ac7f84b67b28f42e71f.gif](https://i-blog.csdnimg.cn/blog_migrate/aa78c9831963fcf1112aaadadc15013b.gif)
接下来我们用一个MNIST手写数字识别的例子来体验下Lightning。
首先模型的父类要换成LightningModule
![f2f1332b7d58f2541a0e36c0cec38733.png](https://i-blog.csdnimg.cn/blog_migrate/4167a6de8d083352631e2151b9c210f1.png)
__init__
和forward
方法可以直接使用不需要修改。
![c6907f8aa3b0180db5b0246b4219ca64.png](https://i-blog.csdnimg.cn/blog_migrate/4ddfd8b9df754e289df5c32df4a2730e.png)
与Pytorch不同的是,你需要把加载数据以及创建DataLoader的代码写在模型中,需要定义如下几个方法
![c4008e3b5049dbef335cb49f5e0554de.png](https://i-blog.csdnimg.cn/blog_migrate/47e2b96e62c66d27661e6851db5bc1e2.png)
事实上我们只是把加载数据集的代码放到了prepare_data中,把创建dataloader的代码分别放到了train_dataloader
和val_dataloader
中
接下来我们要把原本的training loop中最内层的代码写到training_step
和validation_step
中
![0cb87763bb675dba2f1a96641d59e449.png](https://i-blog.csdnimg.cn/blog_migrate/35e89e25407056d224b3df0ddd3c1b6b.png)
training_step
和validation_step
中的返回值都是一个字典,其中training_step的返回值必须包含loss属性,log是你需要输出的数据的字典,而validation_step
的返回值字典保存的是你想要在每次validation结束输出的数据,如下
![e782bee8f0a4fdb6185cbb15dbdcc9c9.png](https://i-blog.csdnimg.cn/blog_migrate/ad169c71cf231574c3e70b7f3f757f04.png)
返回的字典中progress_bar也需要是一个字典,对应显示在进度条上的值(稍后展示),log同上作为输出的数据被保存下来
最后,我们还需要定义一个optimizer
![2d4d2d98438b60acac2a9f5815bac3c0.png](https://i-blog.csdnimg.cn/blog_migrate/1b34939bd32dfed65a13863177ba2a90.png)
这样一来一个LightningModule就完成了,而他的训练异常简单,你只需要
![cd8ef6e4acff740497909664453e2f27.png](https://i-blog.csdnimg.cn/blog_migrate/bbb3253ee1130279b0bc4987f44f6d62.png)
不需要手写training loop,也不需要自己加入进度条,一切都由Trainer帮你完成
![2f1e933f416c523f0b96873991b75705.png](https://i-blog.csdnimg.cn/blog_migrate/74a4f2c6a16c14999daf63e36f601e14.png)
可以看到进度条右侧显示出了我们设置的validation的结果
如果你想使用GPU训练,也不必像原来一样一个个设置,只需要
![48aaaee448a9c5866850d44540db26d6.png](https://i-blog.csdnimg.cn/blog_migrate/cd39557d64dc3b20e5cd714d7951a40d.png)
至于我们在step中设置要输出的log,它们被按照tensorboard(可替换其他可视化工具)的格式保存在了./lightning_logs
中,你可以直接使用tensorboard来查看我们保存的log的曲线
![c6c9d1bcf70ee0f01645a93618d01705.png](https://i-blog.csdnimg.cn/blog_migrate/7bf8d06c670f3d34cd55a9ff032d5864.png)
如果你在模型中定义了test_dataloader
, test_step
和test_epoch_end
,你就可以直接进行test
![483a75adc509719461639adc67a17409.png](https://i-blog.csdnimg.cn/blog_migrate/58a07b5a3f65606b74246e3766ddfc52.png)
![f28af1a453286ac7f84b67b28f42e71f.gif](https://i-blog.csdnimg.cn/blog_migrate/aa78c9831963fcf1112aaadadc15013b.gif)
以上简单地展示了Pytorch Lightning的使用,已经可以明显地看出他在pytorch上做的改进:你的代码条理更加清晰,你不需要自己完成诸如training loop的工程性强研究意义低的代码,你也不需要为可视化花心思。
除了改变了写代码的风格之外,其余没有与pytorch不同的地方,实际上你的代码中使用的依然是pytorch里的方法和函数,只是把他们交给了Lightning来组织、运行、输出
Lightning对RNN、GAN等也有着很好的支持,Trainer可设置的参数也十分丰富,在此不再作介绍,有兴趣的同学可以参考官方文档进行深入了解
参考资料:
官方文档:
https://pytorch-lightning.readthedocs.io/en/latest/
From PyTorch to PyTorch Lightning — A gentle introduction:
https://towardsdatascience.com/from-pytorch-to-pytorch-lightning-a-gentle-introduction-b371b7caaf09
![97f660819b70dc25340301b10eb99ac3.png](https://i-blog.csdnimg.cn/blog_migrate/10d9c9809fadbe44c2b70a0358760333.jpeg)
撰稿:李煜泽
审核:孙志尧
![e87c918013a4f65e163d659df0ff8eed.png](https://i-blog.csdnimg.cn/blog_migrate/c67c44ce61f780e796344aa4483824b7.png)