【发布时间】:2020-05-13 09:46:33
【问题描述】:
我已尝试将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的一些随机值,梯度处处为零,其余的梯度幅度非常小(
我也用 MNIST 训练的 3 层 MLP 进行了尝试,结果是一样的,但是用没有激活的 1 层线性模型进行尝试。
这是怎么回事?
【问题讨论】:
-
我不认为“这里发生了什么”真的是一个有效的问题,你期望什么梯度值以及为什么你认为有问题?
-
好吧,给定一个随机输入,它的前馈阶段给出了错误的分类,那么梯度是否应该足够大,以至于我们可以用合理的步长进行 SGD?这就是我所期待的结果。编辑:我曾经在那里有一个损失层,在调试过程中我正在寻找反向传播链中的中间值。所以我的期望不是太小。
标签: python tensorflow keras gradienttape