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

问题描述

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

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 (将#修改为@)

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...