gpt4 book ai didi

python - 如何获得keras中的梯度?

转载 作者:太空狗 更新时间:2023-10-29 20:19:33 24 4
gpt4 key购买 nike

我正在尝试调试我构建的 keras 模型。似乎我的渐变正在爆炸,或者除以 0 或类似的东西。当它们通过网络反向传播时,能够检查各种梯度会很方便。像下面这样的东西是理想的:

model.evaluate(np.array([[1,2]]), np.array([[1]])) #gives the loss
model.evaluate_gradient(np.array([[1,2]]), np.array([[1]]), layer=2) #gives the doutput/dloss at layer 2 for the given input
model.evaluate_weight_gradient(np.array([[1,2]]), np.array([[1]]), layer=2) #gives the dweight/dloss at layer 2 for the given input

最佳答案

您需要创建一个符号 Keras 函数,将输入/输出作为输入并返回梯度。这是一个工作示例:

import numpy as np
import keras
from keras import backend as K

model = keras.Sequential()
model.add(keras.layers.Dense(20, input_shape = (10, )))
model.add(keras.layers.Dense(5))
model.compile('adam', 'mse')

dummy_in = np.ones((4, 10))
dummy_out = np.ones((4, 5))
dummy_loss = model.train_on_batch(dummy_in, dummy_out)

def get_weight_grad(model, inputs, outputs):
""" Gets gradient of model for given inputs and outputs for all weights"""
grads = model.optimizer.get_gradients(model.total_loss, model.trainable_weights)
symb_inputs = (model._feed_inputs + model._feed_targets + model._feed_sample_weights)
f = K.function(symb_inputs, grads)
x, y, sample_weight = model._standardize_user_data(inputs, outputs)
output_grad = f(x + y + sample_weight)
return output_grad


def get_layer_output_grad(model, inputs, outputs, layer=-1):
""" Gets gradient a layer output for given inputs and outputs"""
grads = model.optimizer.get_gradients(model.total_loss, model.layers[layer].output)
symb_inputs = (model._feed_inputs + model._feed_targets + model._feed_sample_weights)
f = K.function(symb_inputs, grads)
x, y, sample_weight = model._standardize_user_data(inputs, outputs)
output_grad = f(x + y + sample_weight)
return output_grad


weight_grads = get_weight_grad(model, dummy_in, dummy_out)
output_grad = get_layer_output_grad(model, dummy_in, dummy_out)

我编写的第一个函数返回模型中的所有渐变,但扩展它并不困难,因此它支持层索引。但是,这可能很危险,因为模型中任何没有权重的层都将被此索引忽略,并且您最终会在模型和梯度中使用不同的层索引。
我编写的第二个函数返回给定层输出的梯度,索引与模型中的相同,因此可以安全使用它。

注意:这适用于 Keras 2.2.0,不适用于 Keras 2.2.0,因为此版本包含对 keras.engine

的重大重构

关于python - 如何获得keras中的梯度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51140950/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com