没有深度学习经验,没有python经验,但也想硬啃paddle这本圣经。
在跟随学习paddle fluid1.2.0版本的过程中,我从线性回归(房价预测)代码片段里,有一部分还无法理解,请填过坑的前辈为我指指路
代码以 https://github.com/PaddlePaddle/book/blob/develop/01.fit_a_line/train.py 中的为准
1.在代码38行出现了shuffle和batch两个方法。
我能明白shuffle是每到buf数量打乱一次返回一个reader。就本数据集,总共是506行数据,那么shuffle会是 1个500个数据和1个6个数据 2个reader
还是只会有1个500个数据的reader
batch吃到数据集后,会以每batch_size个数据为一批数据,是否可以认为本案例中,batch对象中有25批数据?
2.第50行初始化了2个program。一个是主程序、一个是启动程序,
因为exe这个Executor在72行run了启动程序,而在82行又用主程序run了。这两者是否缺一不可?各自run了之后有什么意义?
3.第56行 创建了一个随机梯度下降优化器,但是没有任何地方显式的去让执行器使用这个优化器。
请问是正常的嘛,是不需要指定,自动应用在执行器上的吗?
4代码第109行 在存储模型的时候,传入的第二个参数是所谓的输入层,这里的x是字符串吧?是代表第46行所注册的名为x的输入层吗。为什么要用[],是考虑可能有多个输入层输入的情况吗?
5.代码第113行 fluid.core.scope() 是做什么用的?看文档只有一个fluid.scope,并没有找到core的scope。
fluid.scope说要想运行一个网络,需要指明它运行所在的域。但是我从代码上也只看到了他声明了个对象,并没有指明所谓的域?
这里也没有显式表明scope的用途。所以没明白用途。
6.116行 with fluid.scope_guard(inference_scope): 代表的是什么意义? 因为没理解scope
修改全局/默认作用域(scope), 运行时中的所有变量都将分配给新的scope。
这里的变量指的是啥?? 是因为训练完就跑的推理,所以这里变量指的是缓存里的模型吗???
7.121行 因为数据集test()应该也是506个(没确认过),那此时这个batch如果batch_size是10的话,应该有50批数据(最后一组不满10个不用)还是51批数据呢(最后一批不满10个)
8.第81行,这个reader只会返回20条数据吗?还是会把25批数据都for出来。我通过打印检查step发现是20次过一个epoch的,所以结论更像前者,但是还是确认一下。如果是真的只返回20条,那为何要用for in? 这样是为了batch提取的是随机的一批吗?
paddle更新太快了(狗头)。
买的两本paddlepaddle的书全是针对v1和v2的,尴尬
1、shuffle是把数据加入到缓存中,batch是把缓存中的数据在拿到训练中。比如先拿500条数据到缓存中,然后每次从缓存中获取32条数据进行训练。
2、default_main_program是paddlepaddle的主程序,我们定义的网络,优化方法都是在这个主程序中。default_startup_program这个是初始化程序,整个框架有一些需要出现后的参数,就是通过这个程序初始化的
3、这就是主程序的作用,你不用手动添加,会自动添加到程序中的。
4、这个是输入数据的name,把这个传入进去,之后可以直接掉哟个着值传入参数了。
5、这个在https://github.com/PaddlePaddle/book/blob/64c82c575ff842eaf02c62e61ec6cce78ecc0f42/01.fit_a_line/train.py#L116 用到,python就是这样的,我建议还是要学一下python
6、就是在with值下面的代码
7、51个,最后剩多少,用多少。
8、每个循环获取batch size条数据,直到获取完
感谢大佬解答,以下是我看了回答后产生的一些新问题
1. 那其实像本案例中506个数据,shuffle取出的是506个中的头500个然后打乱,剩下6个等于是抛掉不会再用了,是这样吗?
2.什么情况下该用default_startup_program呢?
该案例中仅仅exe这个执行器run了它,另外一个执行器exe_test是一个全新的执行器,它就没有run(default_startup_program)
而exe_test是为了使用测试集测试误差用的,也实际在代码中使用了。为何exe和exe_test会有这个不同?
4.能理解他传入网络层的name来告诉模型输入层是哪层,但没理解他加[]的意义,这个可能会在后面其他案例中学到,现在的观念还是觉得输入层都是单一的,只是维度很多。 他加了个[]是意思是可能会有多个输入层这样子吗?
1、剩下的6个就第二批
2、其实完全可以使用一个执行器exe的
4、因为输入数据有可能不止一个,可能是多个,所以需要一个数组
第一个问题,你的问题中就包含有一个问题;首先分析一下数据:
数据是506确实没错,但是分为训练集和测试集,所以
训练集数据为404条,测试集数据为102条
然后分析一下reader,上面的图是普通的reader,下面的图是shuffle的reader
那么shuffle发生了什么呢,这里设置的buf_size为5.
打印前20条数据,可以看到每5个进行一次shuffle。
然后是batch。
batch_size设置为2,那么没两条数据组成一起,然后按照生成器来理解就明白了。
给力,喜欢你的可视化的回答。我本来也想着打印出来看的,结果只给了一个内存地址。。python没用过,还需要时间学习
问题2:
图片信息的链接:http://paddlepaddle.org/documentation/docs/zh/1.2/api_cn/fluid_cn.html#paddle.fluid.Program
嗯嗯,这个楼上说了,理解了~
问题3:
首先你在添加下面代码后,
sgd_optimizer = fluid.optimizer.SGD(learning_rate=0.001)
main_program中会添加一个op和一些var,
可以通过下面代码来查看或者直接打印main_program
然后executer在执行时,会执行program中的每一个op
问题5:
core是封装的,不是python写的,当然找不到啦,可以用下面代码来查看
core应该是fluid的吧。文档里没有说core这个库
是fluid的,但是core的核心代码是用C++写的,在源码中是找不到core的,只有编译之后才会在lib/python2.7/site-packages/paddle/fluid/目录下生成一个core.so文件,就像opencv的python库cv2.so一样。
但是不知道为什么core下有些类和fluid的API中的是一样的,比如
吼吼 了解了
这种方式有点像动态图,那paddlepaddle是静态图还是动态图?
Fluid好像是动态图
??什么动态图静态图
动态图vs静态图(https://zhuanlan.zhihu.com/p/49815772)
这篇文章(https://www.jianshu.com/p/2946f75e3145)说paddlepaddle是动态图。
我的理解就是静态图像tensorflow那样得先建图,然后再传数据执行图,动态图像pytorch那样可以添加一个op之后立即执行,而不用等建完图再执行。
就是深度学习的图结构是否能改
tensorflow是静态的不过现在也支持动态了,Pytorch是动态的。
有空学习研究下