计算Keras中基于Jacobian的数据集增强所使用的梯度

时间:2019-01-18 16:29:03

标签: keras gradient

在计算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]

不幸的是,我没有得到期望的结果:

enter image description here

如您所见,它仅包含120个输入向量的4个特征的渐变,因此形状为(120,4),但应该为每个类计算它们。 例如3 x(120,4)

enter image description here

另外,梯度大多为零,但在中间,有些行似乎是正确计算的。

非常感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

需要分别为3个输出分别计算梯度:

tf.gradients(out[:, class_i], in)

enter image description here