关于某些特定变量的渐变

时间:2019-06-12 18:18:58

标签: python tensorflow

我正在使用Tensor-flow来最小化函数:L(y,F(x'))+ Lam * || M || 关于M和D。

  
      
  1. || M ||是M的L1范数,x'=(1-M)* x + M * D
  2.   
  3. F()是我之前训练和保存的Tensor流模型。 (它的权重不会在此脚本中更新)。 F()返回logits。
  4.   L是F()的损失函数。 Y是一键编码的向量。   

如何获得关于M和D的上述函数的Jacobian和Hessian

M,D都是二维矩阵

def nplenet(x):... #model structure

这是函数的代码

def newlossfunction(datain):
    m = tf.Variable(tf.float32, (32, 32), name='mask', constraint=lambda t: tf.clip_by_value(t, 0, 1))
    d = tf.Variable(tf.float32, (32, 32, 1), name='perturbation', constraint=lambda t: tf.clip_by_value(t, 0, 1))
    xt = tf.multiply((tf.subtract(1, m)), datain) + tf.multiply(m, d)  # Todo: Apply Filter
    xt = xt.astype('float32')
    num_examples = xt.shape[0]
    totalloss = 0
    with tf.Session() as sess:
        tf.train.Saver().restore(sess, r".\nplenet")
        inplab = (np.ones(xt.shape[0]) * targetlabel).astype(int)
        for offset in range(0, num_examples, BATCH_SIZE):
            batchx, batchy = xt[offset:offset + BATCH_SIZE], inplab[offset:offset + BATCH_SIZE]
            loss = sess.run(loss_operation, feed_dict={x: batchx, y: batchy, prob: 0.75})
            totalloss = totalloss + loss
        sess.close()
    m = m.flatten()
    finalloss = totalloss + lam * tf.linalg.norm(m, 1)
    return finalloss

我已经使用tf.py_func(https://www.tensorflow.org/api_docs/python/tf/py_func)将该函数转换为张量流操作。

uloss = tf.py_func(func=newlossfunction, inp=[datain], Tout=tf.float32)
dy_dx = tf.gradients(uloss, ['mask', 'perturbation'])
d2y_d2x = tf.hessians(uloss, ['mask', 'perturbation'])

脚本在最后一行(上面)崩溃。此外,dy_dx的值也是一个空列表。

ValueError:尝试将“张量”转换为张量,但失败:

  

错误:不支持任何值。

理想情况下,dy_dx应该是雅可比矩阵,d2y_d2x应该是黑森矩阵。

'mask'是张量m的名称,'perturbation'是张量d的名称。

0 个答案:

没有答案