V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
northisland
V2EX  ›  机器学习

tensorflow 的玩家,我要用 Optimizer,但想自己搞定 loss 计算,然后 BP。正确的方式是什么?

  •  1
     
  •   northisland · 2018-04-03 21:36:01 +08:00 · 3970 次点击
    这是一个创建于 2452 天前的主题,其中的信息可能已经有所发展或是发生改变。

    普通青年的流程:

    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

    我不知道有没有更好的方案,求教各位,谢谢

    5 条回复    2018-04-04 00:25:35 +08:00
    linthieda
        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.
    cjx5813
        2
    cjx5813  
       2018-04-03 22:38:30 +08:00   ❤️ 1
    首先,文艺青年版本一点都不文艺,没啥区别。
    其次你的文艺青年版本有 typo,第三行应该是 apply_gradients
    告诉你啥叫文艺青年:
    `import tensorflow.contrib.keras as tf`

    最后你的二笔方式确实很二笔,不过有机会应该去了解一下 TF 的 eager execution 模式,不知道比你高到哪里去了
    Xs0ul
        3
    Xs0ul  
       2018-04-03 23:01:07 +08:00 via Android
    换 Pytorch (
    meilaoban945
        4
    meilaoban945  
       2018-04-04 00:16:17 +08:00 via Android
    import torch as tf
    lance6716276
        5
    lance6716276  
       2018-04-04 00:25:35 +08:00 via Android   ❤️ 1
    keras 简单的一笔
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2484 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 15:47 · PVG 23:47 · LAX 07:47 · JFK 10:47
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.