Machine learning 从tf.gradients()返回时的tf.indexedlicesvalue

Machine learning 从tf.gradients()返回时的tf.indexedlicesvalue,machine-learning,tensorflow,Machine Learning,Tensorflow,我有一个问题,我有四个嵌入矩阵,我想得到损失函数相对于这些矩阵的梯度 当我运行会话返回渐变值时,其中两个返回的对象的类型是tensorflow.python.framework.ops.IndexedSlicesValue,另外两个是numpy数组。现在对于numpy数组,它们的形状对应于它们相应的嵌入矩阵的形状,但是我对indexedlicesvalue对象有问题 如果我在其中一个对象上调用.values,我会得到一个形状与梯度形状不匹配的数组,嵌入矩阵的形状是[22,30],但在Indexe

我有一个问题,我有四个嵌入矩阵,我想得到损失函数相对于这些矩阵的梯度

当我运行会话返回渐变值时,其中两个返回的对象的类型是tensorflow.python.framework.ops.IndexedSlicesValue,另外两个是numpy数组。现在对于numpy数组,它们的形状对应于它们相应的嵌入矩阵的形状,但是我对indexedlicesvalue对象有问题

如果我在其中一个对象上调用.values,我会得到一个形状与梯度形状不匹配的数组,嵌入矩阵的形状是[22,30],但在IndexedSlicesValue对象上调用.values,我会得到一个形状为[4200,30]的数组(输入张量的形状的维数为[30,20,7]),这些尺寸的乘积等于4200,不确定这是否相关)。 IndexedSlicesValue对象有一个名为dense_shape的属性,该属性是一个数组,保存渐变应该具有的维度,即数组([22,30])是.dense_shape返回的值

我不太理解这里的文档:

它说:

IndexedLices通常用于表示 形状[LARGE0,D1,…,DN]的较大张量密度,其中LARGE0>>D0。 索引中的值是第一维度的索引 从较大张量中提取的切片

所以这个形状数组(4200,30)是从一个对应于更大的稠密张量的数组中提取出来的

这个IndexedLicesValue对象中的渐变到底是什么?为什么tensorflow会自动对tf.gradients()返回的某些渐变使用这种类型

这是我的密码:

input_tensor = tf.placeholder(tf.int32, shape = [None, memory_size, max_sent_length], name = 'Input')
q_tensor = tf.placeholder(tf.int32, shape = [None,max_sent_length], name = 'Question')
a_tensor = tf.placeholder(tf.float32, shape = [None,V+1], name = 'Answer')
# Embedding matrices
A_prior = tf.get_variable(name = 'A', shape = [V+1,d], initializer = tf.random_normal_initializer(stddev = 0.1))
A = tf.concat(0,[tf.zeros(shape = tf.pack([1,tf.shape(A_prior)[1]])),tf.slice(A_prior,[1,0],[-1,-1])])
B = tf.get_variable(name = 'B', shape = [V+1,d], initializer = tf.random_normal_initializer(stddev = 0.1))
C = tf.get_variable(name = 'C', shape = [V+1,d], initializer = tf.random_normal_initializer(stddev = 0.1))
W = tf.get_variable(name = 'W', shape = [V+1,d], initializer= tf.random_normal_initializer(stddev = 0.1))
embeddings = tf.reduce_sum(tf.nn.embedding_lookup(A,input_tensor),2)
u = tf.reshape(tf.reduce_sum(tf.nn.embedding_lookup(B,q_tensor),1),[-1,1,d])
test = tf.transpose(embeddings, perm = [0,2,1])
test_batch_mul = tf.squeeze(tf.batch_matmul(u,test))
cond = tf.not_equal(test_batch_mul,0.0)
tt = tf.fill(tf.shape(test_batch_mul),-1000.0)
softmax_in = tf.select(cond, test_batch_mul, tt)
p_values = tf.nn.softmax(softmax_in)
c_values = tf.reduce_sum(tf.nn.embedding_lookup(C,input_tensor),2)
o = tf.squeeze(tf.batch_matmul(tf.expand_dims(p_values,1),c_values))
a_pred = tf.nn.softmax(tf.matmul(tf.squeeze(u)+o,tf.transpose(W)))
loss = tf.nn.softmax_cross_entropy_with_logits(a_pred, a_tensor, name = 'loss')
cost = tf.reduce_mean(loss)
global_step = tf.Variable(0,name = 'global_step', trainable= False)
#optimizer = tf.train.MomentumOptimizer(0.01,0.9)
vars_list = tf.trainable_variables()
grads = tf.gradients(cost, vars_list)
#train_op = optimizer.minimize( cost, global_step, vars_list, name = 'train_op')

sess = tf.Session()
init = tf.initialize_all_variables()
sess.run(init)
input_feed = {input_tensor : phrases, q_tensor : questions, a_tensor : answers}
grad_results = sess.run(grads, feed_dict = input_feed)