代码之家  ›  专栏  ›  技术社区  ›  Him

如何获得角膜的梯度?

  •  8
  • Him  · 技术社区  · 8 年前

    我正在尝试调试 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
    
    1 回复  |  直到 7 年前
        1
  •  9
  •   mpariente    8 年前

    您需要创建一个符号化的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.engine