问题描述
我正在尝试将网络输出到目标类别的梯度转换为几对(输入,目标)网络的权重。下面的代码会执行此操作,但是会造成整体损失。如何为每个输入指定我希望输出为特定目标输出而不是总体损失?
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 (将#修改为@)