我正在使用Tensor-flow来最小化函数:L(y,F(x'))+ Lam * || M || 关于M和D。
- || M ||是M的L1范数,x'=(1-M)* x + M * D
- F()是我之前训练和保存的Tensor流模型。 (它的权重不会在此脚本中更新)。 F()返回logits。
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
的名称。