微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何获得特定类别输出相对于喀拉斯邦权重的梯度?

如何解决如何获得特定类别输出相对于喀拉斯邦权重的梯度?

我正在尝试将网络输出到目标类别的梯度转换为几对(输入,目标)网络的权重。下面的代码会执行此操作,但是会造成整体损失。如何为每个输入指定我希望输出为特定目标输出而不是总体损失?

def get_gradient_weights(model,data_x,data_y):

    batch_size = 512
    target_class = data_y[:batch_size].flatten()
    data_batch = data_x[:batch_size]
    trainable_weights_list = model.trainable_weights

    inputs = model.inputs[0]
    output = model.layers[-2].output

    gradients = keras.backend.gradients(output,trainable_weights_list)
    get_gradients = keras.backend.function(inputs,gradients)

    #output = tf.gather(output,target_class,axis=1)    
    #output_list = [output[:,target_class[index]] for index in range(batch_size)]

    p = data_x.shape[1]

    gradient_list = []
    for index in range(batch_size):
        gradient_list.append(get_gradients([data_x[index,:].reshape(1,p)]))

    gradient_list = np.mean(np.abs(np.array(gradient_list)),axis=0)

    return gradient_list
    

注释掉的两行用于访问所需的目标类输出,但随后必须在循环中对其进行访问,这需要很长时间。

谢谢

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。