De la docs :
Transpose
a
. Permute les dimensions selon perm.La dimension i du tenseur retourné correspondra à la dimension d'entrée
perm[i]
. Siperm
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)
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?
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)