w***g 发帖数: 5958 | 1 学习了一晚上,总结一下
- slim似乎已经完蛋了。
- 现在high-level API是tf.layers。
- 但是tf.layers和tf.contrib.framework.arg_scope不兼容,所以还是得用tf.
contrib.layers。
- batch_norm在multiple gpu上似乎没有一个干净的解决方案。
- tf.variable_scope可以设default initializer,
但是用不用这个initializer看各个layer实现的喜好。比如,conv2d的weights和bias
是不服从这个默认值的。batch_norm的moving_mean和beta不服从,但是batch_norm的
moving_variance服从。这些东西文档里是没有的,得靠自己理解。
都是些什么乱七八糟的。最近发现官方slim的resnet干不过github上的鸡毛项目。
所以打算自己把常见的几个model撸一遍。然后就发现前面的路好艰难。 |
w*****r 发帖数: 197 | 2 前几天刚把一个train.py改成了Multi gpu版本。按tf的教程例子,gpu还是单独算梯度
,然后导到cpu求平均,在appy回去
跨gpu做bn很重要吗? |
w***g 发帖数: 5958 | 3 我前两天做了同样的事。然后碰到batch_norm就不知道怎么办了。
有人很aggresive,所有的layer之后全加batch_norm。
影响太大。
【在 w*****r 的大作中提到】 : 前几天刚把一个train.py改成了Multi gpu版本。按tf的教程例子,gpu还是单独算梯度 : ,然后导到cpu求平均,在appy回去 : 跨gpu做bn很重要吗?
|
l*******m 发帖数: 1096 | 4 arg_scope基本上也被抛弃了,太容易有bugs. 还是应该用 tf.layers.
其他frameworks也各自有问题,he kaiming 的最新的一片文章居然用了tf
:学习了一晚上,总结一下
: |
w***g 发帖数: 5958 | 5 我觉得arg_scope很有用,那怎么办?
:arg_scope基本上也被抛弃了,太容易有bugs. 还是应该用 tf.layers.
: |
w*****r 发帖数: 197 | 6 貌似我有重大理解错误啊。。。
我的理解是:同一个layer在不同gpu里面,tf的op的名字是不一样的(不同的name
scope)
,每个gpu里面,你都可以随便加bn,互不影响,只是不能跨gpu罢了。
刚刚穿凿了一下,貌似所有trainable的parameters都要发在cpu上。。。
难道不是这样?
【在 w***g 的大作中提到】 : 我前两天做了同样的事。然后碰到batch_norm就不知道怎么办了。 : 有人很aggresive,所有的layer之后全加batch_norm。 : 影响太大。
|
l*******m 发帖数: 1096 | 7 arg_scope还在呀,tf.contrib.layers也在,只是最新的high level API不用arg_
scope了。把自己写的func放在里面更复杂。我以前也用arg_scope, 一个bug撸了两个
月才找到,现在又回到class了。
当然这本质是深学进入软件工程的一个问题,深学没有一个有效的utest的方法, 需要
e2e的验证。小数据集还好,大的如imagenet, 复现一个state of the art, 如果没有
大厂的计算资源,撸一次要几天或星期,几次就绝望了. 网络可能没写对,training
参数,还有data Aug。完全搞对十分不如容易。就像你说的,slim那帮人搞了两年了,
resnet还是训练不好,都是炼金术。
:我觉得arg_scope很有用,那怎么办?
: |
w***g 发帖数: 5958 | 8 tf的机制是这样的:一个variable声明到什么设备上,就定在什么设备上了。
然后声明在别的设备上的操作要用这个variable会自动拷过去。
所以多gpu的机制就是
- 在CPU或者第一个GPU上构造网络。所有的参数都会分配到这个设备上。
- 设置variable scope reuse
- 然后在别的设备上构造同样的网络。op会重新命名,但是所有的variable会reuse,
也就是引用第一个设备上的那套参数。
- 所以其实所有可训练参数只有一个版本。更新的时候也只要更新这个版本就行。
- 但是gradient所有的GPU都有自己的版本,需要merge。
batch_norm有moving average和variance。这个不是用gradient训练的。
我也不知道是什么机制。其实把graph打印出来查看可以看到具体情况。
【在 w*****r 的大作中提到】 : 貌似我有重大理解错误啊。。。 : 我的理解是:同一个layer在不同gpu里面,tf的op的名字是不一样的(不同的name : scope) : ,每个gpu里面,你都可以随便加bn,互不影响,只是不能跨gpu罢了。 : 刚刚穿凿了一下,貌似所有trainable的parameters都要发在cpu上。。。 : 难道不是这样?
|
w***g 发帖数: 5958 | 9 就是这么回事。那种大数据我根本不敢碰。生命只有一次。
【在 l*******m 的大作中提到】 : arg_scope还在呀,tf.contrib.layers也在,只是最新的high level API不用arg_ : scope了。把自己写的func放在里面更复杂。我以前也用arg_scope, 一个bug撸了两个 : 月才找到,现在又回到class了。 : 当然这本质是深学进入软件工程的一个问题,深学没有一个有效的utest的方法, 需要 : e2e的验证。小数据集还好,大的如imagenet, 复现一个state of the art, 如果没有 : 大厂的计算资源,撸一次要几天或星期,几次就绝望了. 网络可能没写对,training : 参数,还有data Aug。完全搞对十分不如容易。就像你说的,slim那帮人搞了两年了, : resnet还是训练不好,都是炼金术。 : : :我觉得arg_scope很有用,那怎么办?
|
m****o 发帖数: 182 | 10 试一下selu?
https://arxiv.org/pdf/1706.02515
据说秒杀现阶段所有的activation function,连batch norm都变得可有可无。
【在 w***g 的大作中提到】 : tf的机制是这样的:一个variable声明到什么设备上,就定在什么设备上了。 : 然后声明在别的设备上的操作要用这个variable会自动拷过去。 : 所以多gpu的机制就是 : - 在CPU或者第一个GPU上构造网络。所有的参数都会分配到这个设备上。 : - 设置variable scope reuse : - 然后在别的设备上构造同样的网络。op会重新命名,但是所有的variable会reuse, : 也就是引用第一个设备上的那套参数。 : - 所以其实所有可训练参数只有一个版本。更新的时候也只要更新这个版本就行。 : - 但是gradient所有的GPU都有自己的版本,需要merge。 : batch_norm有moving average和variance。这个不是用gradient训练的。
|
|
|
s*****V 发帖数: 21731 | 11 TF我搞了半天也是稀里糊涂,还以为是自己笨,看到大牛也有同感,心里终于平衡了。
bias
【在 w***g 的大作中提到】 : 学习了一晚上,总结一下 : - slim似乎已经完蛋了。 : - 现在high-level API是tf.layers。 : - 但是tf.layers和tf.contrib.framework.arg_scope不兼容,所以还是得用tf. : contrib.layers。 : - batch_norm在multiple gpu上似乎没有一个干净的解决方案。 : - tf.variable_scope可以设default initializer, : 但是用不用这个initializer看各个layer实现的喜好。比如,conv2d的weights和bias : 是不服从这个默认值的。batch_norm的moving_mean和beta不服从,但是batch_norm的 : moving_variance服从。这些东西文档里是没有的,得靠自己理解。
|
L****8 发帖数: 3938 | 12 cool
【在 m****o 的大作中提到】 : 试一下selu? : https://arxiv.org/pdf/1706.02515 : 据说秒杀现阶段所有的activation function,连batch norm都变得可有可无。
|
x****u 发帖数: 44466 | 13 为啥不用keras?
bias
【在 w***g 的大作中提到】 : 学习了一晚上,总结一下 : - slim似乎已经完蛋了。 : - 现在high-level API是tf.layers。 : - 但是tf.layers和tf.contrib.framework.arg_scope不兼容,所以还是得用tf. : contrib.layers。 : - batch_norm在multiple gpu上似乎没有一个干净的解决方案。 : - tf.variable_scope可以设default initializer, : 但是用不用这个initializer看各个layer实现的喜好。比如,conv2d的weights和bias : 是不服从这个默认值的。batch_norm的moving_mean和beta不服从,但是batch_norm的 : moving_variance服从。这些东西文档里是没有的,得靠自己理解。
|
w***g 发帖数: 5958 | 14 但是这个东西没有imagenet或者别的比较有名的
benchmark的分数啊。
【在 L****8 的大作中提到】 : cool
|
g*******u 发帖数: 3948 | 15 好像tf自己也发展了一些高级函数 和keras类似,并且 keras现在也是tf的了
整体感觉 就是tf的 高级函数了。两者既有融合又有点区别 但是感觉整合为一的样子
比较大
【在 x****u 的大作中提到】 : 为啥不用keras? : : bias
|
h**c 发帖数: 1979 | 16 Keras这种东西的意义是啥?费老大劲在别人的API上又包装一层API? |
x****u 发帖数: 44466 | 17 keras的api变化比底层小就是卖点,现在keras和tf都是G家的了
【在 h**c 的大作中提到】 : Keras这种东西的意义是啥?费老大劲在别人的API上又包装一层API?
|