其实现在 TensorFlow 1.13 版已经有大量 tf.keras 的 API 了, 我尝试将 MobileNet V2 用 keras 那套 subclassing 方法写了一遍。 发现无论怎样操作都无法把 tf.keras.layers 里 Batch Normalization 的 running mean 以及 running variance 加进 UpdateOps 这个 Collection, 同时,类似这种情况含有 regularization 的 Conv2D 中也不会把 regularization 加进 regularization loss collection 里。 查了下 GitHub 上相关的 issue, 有人说用 keras 那套 model.compile 和 model.fit 来进行 training 可以 update 这些。 这是不是意味着以后习惯静态图的玩家基本就没有框架可用了。
1
ipwx 2019-05-05 10:47:45 +08:00
1、是的,静态图已经没有市场了。Collection 已经在 2.0 消失了。
2、但是其实没有太大问题,你只要改一改习惯就好了。。。 我去年也写了个库,写深度生成模型的,接下来也得大改,哭瞎。不过其实仔细想想,是改的了的。 https://github.com/haowen-xu/tfsnippet |
2
ipwx 2019-05-05 10:56:18 +08:00 1
另外 TF 2.0 的 API 和 PyTorch 其实很接近了,如果你有心,是可以写个兼容层的。。。
TF 2.0 替代全局 collection 的是可以直接递归从根组件收集各种对象,比如 update ops,比如 regularization loss。 ---- 其实你们 Keras 党还好啦,没有多少变更。我作为 tf.layers 党才蛋疼呢。。。 写 Bayesian 网络的时候,每个概率式子都是一个子网络,算上概率分布的参数还得有更多。一个 x,y,z 三变量的网络就得有 6 个子隐藏网络 + 四个高斯分布各两个独立的线性激活层,统共 14 个组件。(比如 HVAE https://arxiv.org/abs/1705.07120 )。如果按照 Keras 的做法,你得在构造函数里面创建 14 个独立的对象,然后在合适的地方调用,简直太坑爹了。 如果用上 reuse + tf.layers,只要在构造网络的时候写一遍就行了。 比如我的库写的 p(x,y,z) = p(x|z) p(z|y) 三变量的 p 网络: https://github.com/haowen-xu/tfsnippet/blob/develop/tfsnippet/examples/auto_encoders/gm_vae.py#L144 再比如别人用 PyTorch 写的 p(x,z1,z2) = p(x|z1,z2) p(z1|z2) 三变量的 p 网路: https://github.com/jmtomczak/vae_vampprior/blob/master/models/HVAE_2level.py#L225 哪个简洁,一目了然。 ---- 可惜的是,Bayesian net 不是主流,被默默地忽视了。明明 reuse 在这个场景下超级有用的。 |
3
ipwx 2019-05-05 10:59:21 +08:00
而且讲道理我本来是想今年完善文档然后发布一下我这个库,写个小论文的(我这库可以写 Bayesian net + flow model + pixelcnn,再加个 gan 的画就能四项全能了,目前还没有这么完整能写 deep generative model 的库,大多只能写某一类)。结果 TF 2.0 大改。。。( OTZ )
|
4
rayhy 2019-05-05 11:08:23 +08:00
tf 的版本太多了,而且各种不兼容,早期写的 tf 的代码现在要想再用得脱层皮。最近搞毕设接触非得用到 tf 的代码,不知道该骂 tf 还是骂自己笨,疯了。
pytorch 早期的代码现在再用就基本没甚问题,要改也是.data[0]改成.item()就差不多没了。 |