从tf.gradients()

时间:2016-04-12 10:35:31

标签: machine-learning tensorflow

我遇到了以下问题,我有四个嵌入矩阵,并希望得到关于这些矩阵的损失函数的渐变。

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

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

我真的不明白这里的文档:https://www.tensorflow.org/versions/r0.7/api_docs/python/state_ops.html#IndexedSlices

它说:

  

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

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

此IndexedSlicesValue对象中的渐变究竟是什么?为什么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)

0 个答案:

没有答案
相关问题