【问题标题】:Bugs of getting gradient of loss function with respect to input using Keras使用 Keras 获取相对于输入的损失函数梯度的错误
【发布时间】:2018-11-15 02:29:29
【问题描述】:
model = keras.Sequential([         #my model, trained on Fashion_MNIST
    keras.layers.Conv2D(32, (3,3), activation=tf.nn.relu, input_shape=(28,28,1)),
    keras.layers.MaxPooling2D(),
    keras.layers.Conv2D(64, (3,3), activation=tf.nn.relu),
    keras.layers.MaxPooling2D(),
    keras.layers.Flatten(),
    keras.layers.Dense(1000, activation='relu'),
    keras.layers.Dense(10, activation=tf.nn.softmax)
])

model.load_weights('./weights/235model')            #load weights
model.compile(optimizer=tf.train.AdamOptimizer(),   
          loss='sparse_categorical_crossentropy',
          metrics=['accuracy'])

tmp = np.full((10,1),0.0)                           #get correct label
tmp[test_labels[0]] = 1.0
y_tensor=tf.convert_to_tensor(tmp)

loss = keras.losses.sparse_categorical_crossentropy(model.output,    y_tensor)
gradients = keras.backend.gradients(loss, model.input)
print(gradients)

我正在做一个迭代 FGSM 攻击,所以我需要获取损失相对于输入的梯度,但是当我打印梯度时,它显示 [None] 而不是有效的张量。

稍后我运行它,

with keras.backend.get_session() as sess:

    evaluated_gradients = sess.run(gradients, feed_dict={model.input:np.reshape(test_images[0],(1,28,28,1))})

它给了我错误 /.local/lib/python2.7/site-packages/tensorflow/python/client/session.py”,第 258 行,在 for_fetch 类型(获取))) TypeError: Fetch 参数 None 的类型无效

如果我在设置梯度时将损失更改为 model.output,它可以正常工作,但如果我在那里使用交叉熵损失,它就不起作用,有人可以帮助我吗?我是 keras 和 tensorflow 的初学者。

【问题讨论】:

    标签: python tensorflow keras


    【解决方案1】:

    您将参数的顺序颠倒为keras.losses.sparse_categorical_crossentropy。应该是

    loss = keras.losses.sparse_categorical_crossentropy(y_tensor, model.output)
    

    https://keras.io/losses/#sparse_categorical_crossentropy

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-02-24
      • 1970-01-01
      • 1970-01-01
      • 2019-12-06
      • 1970-01-01
      • 2021-03-11
      • 2020-09-10
      相关资源
      最近更新 更多