在计算https://arxiv.org/abs/1602.02697
中发布的基于雅各布的数据集扩充所使用的梯度的符号时,我试图理解我的错误” Jacobian矩阵维的符号,对应于由Oracle $ \ vec {x} $ 的标签“> $ \ tilde {O} $ : $ sgn(J_F(\ vec {x})[\ tilde {O}(\ vec {x})]) $ “
对于计算,您可以忽略预言O,而只是将其视为分类结果Y。
据我正确理解该术语,我必须计算神经网络通过输入学习的函数的梯度,然后使用当前输入向量x对其进行评估。然后,结果应该是一个数组,其中包含每个类的输入向量的梯度。
出于演示目的,我根据https://www.kaggle.com/lavajiit/deep-learning-iris-dataset-keras/notebook用Iris数据集训练了一个keras模型。 然后通过以下方式计算梯度的符号:
out = model.output
in = model.input
gradients = k.gradients(out,in)[0]
session = k.get_session()
session.run(tf.initialize_all_variables())
evaluated_gradients = session.run([tf.sign(gradients)], feed_dict={model.input: X_train})[0]
不幸的是,我没有得到期望的结果:
如您所见,它仅包含120个输入向量的4个特征的渐变,因此形状为(120,4),但应该为每个类计算它们。 例如3 x(120,4)
另外,梯度大多为零,但在中间,有些行似乎是正确计算的。
非常感谢您的帮助。
答案 0 :(得分:0)
需要分别为3个输出分别计算梯度:
tf.gradients(out[:, class_i], in)