我一直在使用tensorflow训练深度NN声学模型进行语音识别。我使用的损失函数是Cross Entropy和NN模型非常好。现在我想将损失函数改为更复杂的一个名为MMI(最大互信息),这也是语音识别领域中使用的经典标准。我在这里放了一个paper来描述这个损失函数,如果你有兴趣的话。
当使用这种特殊的损失函数时,损失函数的导数为w.r.t.输出层的激活可以通过隐马尔可夫模型场景中定义的一些特殊算法来计算。这意味着我可以计算损失函数w.r.t的导数。由我自己激活输出层,而不是只写出损失函数,让Tensorflow自动计算导数。
但基于我糟糕的经历,我不知道如何反击我自己计算的衍生物。有没有办法在不触及Tensorflow C ++源代码的情况下执行此操作?
答案 0 :(得分:0)
如果所涉及的所有计算都使用现有的张量流函数,则可能是。
您只需设置从当前变量计算渐变的操作链。
然后,您只需使用tf.assign_add()
将渐变乘以减去学习率的变量。
因此,您通常会模仿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,...})