optimizer = tf.train.XXXOptimizer(xxx, yyy)
train_op = optimizer.minimize(loss)
for xxx:
sess.run(train_op, feed_dict=xxxx)
optimizer = tf.train.XXXOptimizer(xxx, yyy)
gradients = optimizer.compute_gradients(loss)
bp_gradient = optimizer.compute_gradients(gradients)
for xxx:
sess.run(bp_gradient, feed_dict=xxx)
因为觉得损失函数,全部用 TensorFlow 里的 tf 数学操作来搞, ==不方便==在训练中临时修改,
还不方便代码共享(出库要出 C++的库)
所以,希望能用上 numpy 或者直接用 boost::python 上 C++(输出代码和训练代码统一)。
目前设想:
net_out = xxx # 作为网络 loss 输入的某些层
# np_loss = ╰(●’◡’●)╮(net_out) # 用 numpy 搞出的损失函数值
loss_pikapika = xxx(net_out, ph0,ph1) # 假的损失函数,保证损失函数值和 np_loss 一样~~~
# 比如 ph0*tf.reduce_mean(net_out)+ph1
optimizer = tf.train.XXXOptimizer(xxx, yyy)
train_op = optimizer.minimize(loss_pikapika)
for xxx
net_out = sess.run(net_out, feed_dict={xxx}) # 先跑前向网络
np_loss = ╰(●’◡’●)╮(net_out)
sess.run(train_op, feed_dict={xxx, ph0=np.array([0.]), ph1=array([np_loss])}) # 跑一趟前向+反向
缺点:要多跑一次前向传递,很 2B
我不知道有没有更好的方案,求教各位,谢谢
1
linthieda 2018-04-03 22:22:39 +08:00 1
普通青年和文艺青年的版本有什么区别吗
而且 tf 并非没有 C++ 的 api, 抛开以上问题,我猜想你的训练模型可能和 RL 有关, 我进而猜想你用 np 可能是为了对 loss 进行某些 scale (比如 A2C 算法) 你在做 inference 的时候可以一并求出 gradient, 然后再用 numpy 进行 scale, 当然这些其实都可以在 tf 内完成。 然后再喂进 train_op. |
2
cjx5813 2018-04-03 22:38:30 +08:00 1
首先,文艺青年版本一点都不文艺,没啥区别。
其次你的文艺青年版本有 typo,第三行应该是 apply_gradients 告诉你啥叫文艺青年: `import tensorflow.contrib.keras as tf` 最后你的二笔方式确实很二笔,不过有机会应该去了解一下 TF 的 eager execution 模式,不知道比你高到哪里去了 |
3
Xs0ul 2018-04-03 23:01:07 +08:00 via Android
换 Pytorch (
|
4
meilaoban945 2018-04-04 00:16:17 +08:00 via Android
import torch as tf
|
5
lance6716276 2018-04-04 00:25:35 +08:00 via Android 1
keras 简单的一笔
|