我尝试使用GradientTape
Keras 模型(简化),如下所示:
import tensorflow as tf
tf.enable_eager_execution()
input_ = tf.keras.layers.Input(shape=(28, 28))
flat = tf.keras.layers.Flatten()(input_)
output = tf.keras.layers.Dense(10, activation='softmax')(flat)
model = tf.keras.Model(input_, output)
model.compile(loss='categorical_crossentropy', optimizer='sgd')
import numpy as np
inp = tf.Variable(np.random.random((1,28,28)), dtype=tf.float32, name='input')
target = tf.constant([[1,0,0,0,0,0,0,0,0,0]], dtype=tf.float32)
with tf.GradientTape(persistent=True) as g:
g.watch(inp)
result = model(inp, training=False)
print(tf.reduce_max(tf.abs(g.gradient(result, inp))))
但是对于 的一些随机值inp
,梯度处处为零,而对于其余的,梯度幅度非常小(<1e-7)。
我也用 MNIST 训练的 3 层 MLP 进行了尝试,结果是一样的,但是用没有激活的 1 层线性模型进行尝试。
这里发生了什么?