2016-12-15 1 views
1

Comment plier deux tenseurs en utilisant tensorflow? tensorflow.foldl prend en entréePlier deux listes dans un flux tensoriel

  • une fonction de type a, b -> a (Ici a et b représente le type de tenseurs d'une forme particulière)
  • un tenseur qui peut être décompressé dans une liste [b] d'entrées de type b
  • un accumulateur de type initial de a

I ont besoin d'une fonction qui prend en entrée

  • une fonction de type a, b, c -> a
  • un Tensor qui peut être décompressé dans une liste [b] des entrées de type b
  • un Tensor qui peut être décompressé dans une liste [c] des entrées de type c
  • une accumulateur initial de type a.
+0

Avez-vous essayé de les enchaîner? c'est-à-dire plier (plier (a, b), c)? – Russell

+0

Cela ne fonctionne pas parce que cela équivaut à replier la concaténation de b et c. – holdenlee

Répondre

0

Utilisez concat et transposent et se replient sur 0 dimension, mais il ne fonctionne que pour les mêmes types. Exemple:

data_x = [[i for i in range(1,11)]] 
data_y = [[10*i for i in range(1,11)]] 

x = tf.placeholder(tf.float32, shape=(1,10)) 
y = tf.placeholder(tf.float32, shape=(1,10)) 
c = tf.constant(100.) 

cn = tf.concat([x,y], axis=0) 
t = tf.transpose(cn) 
f = tf.foldl(lambda a,y: a+y[0]+y[1], t, c) 

with tf.Session() as sess: 
    res = sess.run(t, feed_dict={x: data_x, y: data_y}) 
    print(res) 
0

Utilisez une boucle while:

import tensorflow as tf 

def fold2(f, li1, li2, init): 
    (_, a1) = tf.while_loop(lambda i, a: i<tf.shape(li1)[0], lambda i, a: (i+1, f(a, li1[i], li2[i])), (0,init)) 
    return a1 

Soit dit en passant, cela fonctionne aussi avec TensorArray de, alors que tf.foldl ne fonctionne pas.