1.Pytorch
Tensorflow 静态图模型,每次要放到session里,然后feed,blabla
Pytorch 动态图模型,定义好了就能用,符合Python编程习惯
哈哈哈哈,所以刷题刷的多,当然用Pytorch啊
安装不用多说,pip install 即可,参考官网,根据自己的机器修改具体指令即可
我用的是GPU版的0.4的Pytorch
2.项目架构
俗话说,好的开始是成功的一半
所以当面对深度学习框架不知所措的时候
一定要照葫芦画瓢跟着别人,一步一步熟悉整个项目的开发流程
以及整个项目在内容上,较自己用的编译器和之前的框架有什么改进和优势
下面给出传送门,若觉得有用点个赞,顺带fork一下原po
启蒙的repo传送门
整个项目以面向对象为核心思路
接下来我来详细说一下这个template为什么好
2.1 参数传递一目了然
深度学习的模型有很多参数,常规的变量名方式的赋值很占行数,
这都是其次的,主要是没有高亮,在长篇的coding中,修改值会很不方便和吃力
利用argparse这个包可以完美解决这个问题
这个包还可以和shell编程完美契合,
windows下可以通过cmd传递参数
当然,只要定义了默认的参数值,不用控制台交互就能实现传参
具体可以看看实现的效果
这样传值的好处很明显,变量名在引号下高亮,前导的- -使得变量严格对齐
type类型提示,还可以添加help进一步帮助提示当前变量
用default定义默认的值
从此,改参数只用在这一个位置修改即可
2.2 程序入口单一且高度集成
程序只有一个main入口,这个是C++入门的一句至理名言,
所以真的用过C++才能体会到一个入口的好处
大多数的repo和code入口太多,整个项目很乱,
不同文件运行顺序不能乱,还没有read me
debug和转接给别人都会很痛苦(上一届学长留下来的代码就是,还不写注释!!!)
在python里有类似于 int main或者void main或者 public static void main这样的东西吗?
当然有啊,如下:
if __name__ == '__main__':
# 请开始你的表演
很简单的一句话,但是我认为可以拯救一个项目和很多人,
所有的需要实现的功能都封装成函数,在main函数里调用即可
(不禁泪流满面的脑中回响起C++三要素:封装,继承,多态)
2.3 严格的面向对象
让我们来看看高度集成的代码实现一个深度学习的网络能简介到什么程度
在之前的main函数中调用solver类即可完成一系列的操作
典型的把大象关进了冰箱,开门,装入,关门即可
所有的操作都定义为类的方法
- __init__构造函数
将所有的之前声明的需要传递的参数整合到当前的类中,供内部的成员函数分享使用
- build_model 建立模型
多个模型的架构可以通过判断语句实现动态建模
包括模型的GPU化和多GPU的设置
根据agparse传递的预定义的参数就能实现一个文件玩转所有的深度学习模型
(为了演示没有配置编译器,文件都在远程的服务器上,所以图中会有很多红色标记)
3. print_network 打印当前网络模型
def print_network(self, model, name):
num_params = 0
for p in model.parameters():
num_params += p.numel()
print(model)
print(name)
print("The number of parameters: {}".format(num_params))
- update_lr 更新学习率
def update_lr(self, g_lr, d_lr):
for param_group in self.optimizer.module.param_groups:
param_group['lr'] = d_lr
- rest_grad 重设梯度
self.model.zero_grad()
- train_test 训练和测试同步完成
这一部分可以根据需要自行设置,需要用到的变量必须在构造函数中声明才能引用
分割线,觉得不错点个赞即可
再次狂推启蒙的repo传送门