2017-09-06 46 views
0

我一直在使用张量流来训练深度NN语音模型的语音识别一段时间。我使用的损失函数是交叉熵,并且NN模型性能非常好。现在我想将损失函数改为更复杂的名为MMI(最大互信息)的函数,这也是语音识别领域中使用的经典标准。我在这里放置了一个paper,它描述了这种损失函数,以防你有兴趣。无论如何反推衍生物的自定义损失函数的衍生物是由我自己计算

当使用这种特殊的损失函数时,损失函数的导数w.r.t.输出层的激活可以通过隐马尔可夫模型场景中定义的一些特殊算法来计算。这意味着我可以计算损失函数w.r.t的导数。通过我自己激活输出层而不是只写出损失函数并让Tensorflow自动计算衍生产品。

但是基于我的糟糕经历,我不知道如何反推我自己计算的衍生产品。有没有办法做到这一点,而无需触摸Tensorflow C++源代码?

回答

0

如果涉及的所有计算都使用现有的tensorflow函数,可能是。

您只需设置计算来自当前变量的梯度的操作链。

然后,您只需使用将您的梯度乘以减去学习率的变量。

因此,您通常会模仿TF背景中发生的情况。

编辑:如果在numpy计算例如你可以使用的梯度。

#perform numpy calculations 

a=f(output_npy,variables_npy) 
grad_from_user=tf.placeholder(tf.float32, a.shape) 
grad_update=tf.assign_add(variables_tf,-lr*grad_from_user) 
#and then 
sess.run(grad_update,feed_dict={grad_from_user:a,...}) 
+0

感谢您的回答。计算损失函数的导数w.r.t.激活输出层是在Tensorflow之外计算的,我倾向于使用占位符来接收这些值。而且你说我必须建立业务链,这是否意味着我必须自己计算未解决的衍生工具?如果NN模型太复杂以至于难以弄清链式操作,例如LSTM + CNN。 – lijianhackthon

+0

使用占位符也可以很好地工作。 – jean

+0

我不明白你的评论的结尾,你可以使用tensorflow backprop来完成你的工作或者自己完成工作。如果你想混合使用这两种,你可以使用'tf.gradients()'这会给你所需的中间体。 – jean