【发布时间】:2017-08-31 12:33:59
【问题描述】:
我正在尝试使用 theano 后端在 Keras 中为 improved WGAN training 实现梯度范数的正则化项。基本上我想根据它与 1 的距离来惩罚梯度的 l2 范数。
我正在实现这样的自定义损失:
def get_gradient_norm(model, y_pred):
weights = model.trainable_weights
gradients = model.optimizer.get_gradients(K.mean(y_pred), weights)
acc = None
for g in gradients:
s = K.sum(K.square(g))
if acc == None:
acc = s
else:
acc = s + acc
return K.sqrt(acc)
def make_w_reg_loss(model):
lvar = K.variable(lamb, name="Lambda")
def foo(y_true, y_pred):
gnorm = get_gradient_norm(model, y_pred)
return lvar * K.square(gnorm - 1)
return foo
[...]
critic.compile(loss=make_w_reg_loss(critic), optimizer=RMSprop(learn_rate))
一旦训练过程尝试获取我的自定义损失函数的梯度,它就会抛出 DisconnectedInputError。
为什么?
用一些标准的损失代替损失是可行的。错误与我定义的损失函数有关。
请参阅此要点以了解我的尝试a minimal not-working example
编辑:
所以我想我现在知道如何让它工作了。 首先,我只是在从 foo(y_true, y_pred) 返回之前直接将这个术语随机添加到我的损失中:
K.mean(y_pred) - K.mean(y_pred)
显然是一个恒定的零,如果我只使用这个术语作为我的损失,我确实得到一个零。 但是,如果我将这个“恒定零”添加到我的正则化损失中,它会突然正常工作。我得到了一个非零的损失,因此来自正则化,并且对许多 train_on_batch 的优化也确实减少了损失。
那么,theano 在抛出异常时有点过分热心,这是一个奇怪的问题吗?我的问题仍然存在:为什么它会抛出原始代码。由于添加一个常数零项可以修复它,所以对我来说它看起来像是一个错误?
【问题讨论】:
标签: neural-network theano keras