Fluid1.2.0 就房价预测例子的相关问题
goJhou 发布于2019-01-05 14:45 浏览:3562 回复:22
0
收藏

没有深度学习经验,没有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提取的是随机的一批吗?

 

收藏
点赞
0
个赞
共22条回复 最后由goJhou回复于2019-01-12 15:57
#23goJhou回复于2019-01-12 15:57:38
#22 秘密花园jay回复
房价也能预测 是不是很复杂

还行吧。入门教程

0
#22秘密花园jay回复于2019-01-12 07:13:53

房价也能预测 是不是很复杂

0
#21niuqingpi回复于2019-01-09 14:35:32

有空学习研究下

0
#20worddict回复于2019-01-09 11:34:19
#17 goJhou回复
??什么动态图静态图

tensorflow是静态的不过现在也支持动态了,Pytorch是动态的。

0
#19worddict回复于2019-01-09 11:33:59
#17 goJhou回复
??什么动态图静态图

就是深度学习的图结构是否能改

0
#18busyboxs回复于2019-01-08 16:55:15

动态图vs静态图(https://zhuanlan.zhihu.com/p/49815772)

这篇文章(https://www.jianshu.com/p/2946f75e3145)说paddlepaddle是动态图。

我的理解就是静态图像tensorflow那样得先建图,然后再传数据执行图,动态图像pytorch那样可以添加一个op之后立即执行,而不用等建完图再执行。

0
#17goJhou回复于2019-01-08 16:20:57
#16 busyboxs回复
Fluid好像是动态图

??什么动态图静态图

0
#16busyboxs回复于2019-01-08 15:33:51
#15 newdimitri回复
这种方式有点像动态图,那paddlepaddle是静态图还是动态图?

Fluid好像是动态图

0
#15newdimitri回复于2019-01-08 14:51:03
#10 busyboxs回复
问题3: 首先你在添加下面代码后, sgd_optimizer = fluid.optimizer.SGD(learning_rate=0.001) main_program中会添加一个op和一些var, 可以通过下面代码来查看或者直接打印main_program [代码] 然后executer在执行时,会执行program中的每一个op
展开

这种方式有点像动态图,那paddlepaddle是静态图还是动态图?

0
#14goJhou回复于2019-01-05 22:57:27
#13 busyboxs回复
是fluid的,但是core的核心代码是用C++写的,在源码中是找不到core的,只有编译之后才会在lib/python2.7/site-packages/paddle/fluid/目录下生成一个core.so文件,就像opencv的python库cv2.so一样。 但是不知道为什么core下有些类和fluid的API中的是一样的,比如 [代码]
展开

吼吼 了解了

0
#13busyboxs回复于2019-01-05 22:09:54
#12 goJhou回复
core应该是fluid的吧。文档里没有说core这个库

是fluid的,但是core的核心代码是用C++写的,在源码中是找不到core的,只有编译之后才会在lib/python2.7/site-packages/paddle/fluid/目录下生成一个core.so文件,就像opencv的python库cv2.so一样。

但是不知道为什么core下有些类和fluid的API中的是一样的,比如

fluid.CPUPlace()
fluid.core.CPUPlace()
0
#12goJhou回复于2019-01-05 21:54:34
#11 busyboxs回复
问题5: core是封装的,不是python写的,当然找不到啦,可以用下面代码来查看 [代码]
展开

core应该是fluid的吧。文档里没有说core这个库

0
#11busyboxs回复于2019-01-05 21:46:41

问题5:

core是封装的,不是python写的,当然找不到啦,可以用下面代码来查看

print(paddle.fluid.core.__file__)
print(paddle.fluid.core.Scope.__doc__)
0
#10busyboxs回复于2019-01-05 21:44:45

问题3:

首先你在添加下面代码后,

sgd_optimizer = fluid.optimizer.SGD(learning_rate=0.001)
main_program中会添加一个op和一些var,

可以通过下面代码来查看或者直接打印main_program

for op in main_program.current_block().ops:
    if op.type == 'sgd':
        print(op)

然后executer在执行时,会执行program中的每一个op

0
#9goJhou回复于2019-01-05 21:32:53
#8 busyboxs回复
问题2: 图片信息的链接:http://paddlepaddle.org/documentation/docs/zh/1.2/api_cn/fluid_cn.html#paddle.fluid.Program   [图片]
展开

嗯嗯,这个楼上说了,理解了~

0
#8busyboxs回复于2019-01-05 21:16:01

问题2:

图片信息的链接:http://paddlepaddle.org/documentation/docs/zh/1.2/api_cn/fluid_cn.html#paddle.fluid.Program

 

0
#7goJhou回复于2019-01-05 21:14:05
#6 busyboxs回复
第一个问题,你的问题中就包含有一个问题;首先分析一下数据: [图片] [图片] 数据是506确实没错,但是分为训练集和测试集,所以 [图片] 训练集数据为404条,测试集数据为102条   然后分析一下reader,上面的图是普通的reader,下面的图是shuffle的reader [图片] 那么shuffle发生了什么呢,这里设置的buf_size为5. [图片] 打印前20条数据,可以看到每5个进行一次shuffle。 然后是batch。 [图片] batch_size设置为2,那么没两条数据组成一起,然后按照生成器来理解就明白了。  
展开

给力,喜欢你的可视化的回答。我本来也想着打印出来看的,结果只给了一个内存地址。。python没用过,还需要时间学习

0
#6busyboxs回复于2019-01-05 21:00:43

第一个问题,你的问题中就包含有一个问题;首先分析一下数据:

数据是506确实没错,但是分为训练集和测试集,所以

训练集数据为404条,测试集数据为102条

 

然后分析一下reader,上面的图是普通的reader,下面的图是shuffle的reader

那么shuffle发生了什么呢,这里设置的buf_size为5.

打印前20条数据,可以看到每5个进行一次shuffle。

然后是batch。

batch_size设置为2,那么没两条数据组成一起,然后按照生成器来理解就明白了。

 

3
#5天子骄子fly回复于2019-01-05 19:22:25
#4 goJhou回复
感谢大佬解答,以下是我看了回答后产生的一些新问题   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、因为输入数据有可能不止一个,可能是多个,所以需要一个数组

0
#4goJhou回复于2019-01-05 17:32:02
#3 天子骄子fly回复
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来告诉模型输入层是哪层,但没理解他加[]的意义,这个可能会在后面其他案例中学到,现在的观念还是觉得输入层都是单一的,只是维度很多。 他加了个[]是意思是可能会有多个输入层这样子吗?

0
TOP
切换版块