Tensorflow索引2-D矩阵更新

时间:2016-11-01 17:18:54

标签: python indexing machine-learning tensorflow

我是机器学习编码的新手,也是使用Tensorflow进行编码的新手。

我在Tensorflow中使用索引时遇到问题。在简单的python中使用numpy非常简单,但在Tensorflow库中我无法弄清楚如何制作它。

我想应用softmax函数不是在每个类的例子中,而是仅在每个行的两个随机类中应用,并在特定索引中的所有类的大矩阵(最初为零)中返回这些值。之前采取的随机课程)。 numpy中的算法更容易,因为可以使用简单的索引,但在tensorflow中,我会想到它:

给定矩阵X:(NxD)和矩阵W:(KxD)以及0和K-1之间两个随机数的数组rem_cl

S is an empty matrix
for every line in X
   take Wsamp = W[rem_cl] 
   mult = X[line] * Wsamp.T
   apply softmax on mult
   put those numbers in an array "s" of zeros (1xK) in the indexes of rem_cl
   append s in S

矩阵S最终将具有形状(NxK)

我现在制作的张量流代码是:

Xnp = np.array([[1,0,0,0,0],[1,0,1,0,0],[1,0,1,1,2],[4,2,1,0,0],[3,0,1,1,2],[1,2,1,0,0]], np.float32)
K = 4
W = tf.Variable(tf.random_uniform((K,5)))
rand = tf.random_uniform((),0,K-1, tf.int32)
s = tf.Variable(tf.zeros((K)))
S = tf.Variable(tf.zeros((K)))
for line in range(4):
    rem_cl = tf.constant([sess.run(rand),sess.run(rand)])   
    Wsampled = (tf.gather(W,rem_cl))
    mult = (tf.matmul(Xnp[line:line+1],Wsampled,transpose_b=True))
    mult = (tf.nn.softmax(mult)) 
    rem_cl = tf.reshape(rem_cl,(2,1))
    rem_cl = tf.transpose(rem_cl)
    k = sess.run(tf.scatter_update(s,rem_cl,mult))
    sess.run(s.assign(tf.zeros(K)))
    S = tf.pack([S,k], axis=0)

最后一行给出以下错误

  

形状必须等于等级,但是为2和1       从形状0与其他形状合并。

我的问题是: 1)首先,是否有更简单的方法来更新Tensorflow中矩阵的数组指定值? 2)如果没有,为什么会出现这个错误,或者更好地说,如何在现有矩阵中添加新行呢?

1 个答案:

答案 0 :(得分:0)

如果你正在使用Python循环,我只会使用一个Python的Tensors列表。如果你最终使用TensorFlow while_loop(有助于保持图形较小),我会考虑使用TensorArray(或者像scan()这样的高级循环结构之一隐式使用它。)

至于错误只是为了完成,我认为你需要concat,向量为expand_dims。 Pack添加了一个维度,并要求其参数具有相同的形状。