web-dev-qa-db-fra.com

Comment permuter la transposition en tensorflow?

De la docs :

Transpose a. Permute les dimensions selon perm.

La dimension i du tenseur retourné correspondra à la dimension d'entrée perm[i]. Si perm n'est pas donné, il est défini sur (n-1 ... 0), où n est le rang du tenseur d'entrée. Par conséquent, par défaut, cette opération effectue une transposition matricielle régulière sur des tenseurs d'entrée 2D.

Mais je ne sais toujours pas comment découper le tenseur d'entrée. Par exemple. à partir des documents aussi:

tf.transpose(x, perm=[0, 2, 1]) ==> [[[1  4]
                                      [2  5]
                                      [3  6]]

                                     [[7 10]
                                      [8 11]
                                      [9 12]]]

Pourquoi est-ce que perm=[0,2,1] produit un tenseur 1x3x2?

Après quelques essais et erreurs:

twothreefour = np.array([ [[1,2,3,4], [5,6,7,8], [9,10,11,12]] , 
                        [[13,14,15,16], [17,18,19,20], [21,22,23,24]] ])
twothreefour

[en dehors]:

array([[[ 1,  2,  3,  4],
        [ 5,  6,  7,  8],
        [ 9, 10, 11, 12]],

       [[13, 14, 15, 16],
        [17, 18, 19, 20],
        [21, 22, 23, 24]]])

Et si je le transpose:

fourthreetwo = tf.transpose(twothreefour) 
with tf.Session() as sess:
    init = tf.initialize_all_variables()
    sess.run(init)
    print (fourthreetwo.eval())

J'obtiens un 4x3x2 à un 2x3x4 et cela semble logique.

[en dehors]:

[[[ 1 13]
  [ 5 17]
  [ 9 21]]

 [[ 2 14]
  [ 6 18]
  [10 22]]

 [[ 3 15]
  [ 7 19]
  [11 23]]

 [[ 4 16]
  [ 8 20]
  [12 24]]]

Mais quand j'utilise le paramètre perm la sortie, je ne suis pas sûr de ce que j'obtiens vraiment:

twofourthree = tf.transpose(twothreefour, perm=[0,2,1]) 
with tf.Session() as sess:
    init = tf.initialize_all_variables()
    sess.run(init)
    print (threetwofour.eval())

[en dehors]:

[[[ 1  5  9]
  [ 2  6 10]
  [ 3  7 11]
  [ 4  8 12]]

 [[13 17 21]
  [14 18 22]
  [15 19 23]
  [16 20 24]]]

Pourquoi perm=[0,2,1] renvoie une matrice 2x4x3 à partir d'une matrice 2x3x4?

Réessayer avec perm=[1,0,2]:

threetwofour = tf.transpose(twothreefour, perm=[1,0,2]) 
with tf.Session() as sess:
    init = tf.initialize_all_variables()
    sess.run(init)
    print (threetwofour.eval())

[en dehors]:

[[[ 1  2  3  4]
  [13 14 15 16]]

 [[ 5  6  7  8]
  [17 18 19 20]]

 [[ 9 10 11 12]
  [21 22 23 24]]]

Pourquoi perm=[1,0,2] renvoyer un 3x2x4 à partir d'un 2x3x4?

Cela signifie-t-il que le paramètre perm prend mon np.shape et transposer le tenseur en fonction des éléments en fonction de la forme de mon tableau?

C'est à dire. :

_size = (2, 4, 3, 5)
randarray = np.random.randint(5, size=_size)

shape_idx = {i:_s for i, _s in enumerate(_size)}

randarray_t_func = tf.transpose(randarray, perm=[3,0,2,1]) 
with tf.Session() as sess:
    init = tf.initialize_all_variables()
    sess.run(init)
    tranposed_array = randarray_t_func.eval()
    print (tranposed_array.shape)

print (Tuple(shape_idx[_s] for _s in [3,0,2,1]))

[en dehors]:

(5, 2, 3, 4)
(5, 2, 3, 4)
17
alvas

Je pense que perm permute les dimensions. Par exemple perm=[0,2,1] est l'abréviation de dim_0 -> dim_0, dim_1 -> dim_2, dim_2 -> dim_1. Donc pour un tenseur 2D, perm=[1,0] n'est qu'une transposition matricielle. Est-ce que cela répond à votre question?

30
maxymoo
A=[2,3,4] matrix, using perm(1,0,2) will get B=[3,2,4].

Explication:

Index=(0,1,2)
A    =[2,3,4]
Perm =(1,0,2)
B    =(3,2,4)  --> Perm 1 from Index 1 (3), Perm 0 from Index 0 (2), Perm 2 from Index 2 (4) --> so get (3,2,4)
3
Kew Hsein