web-dev-qa-db-ja.com

tensorflowでtf.transposeはどのように機能しますか?

tf.transpose(a, perm=None, name='transpose')

転置a。パーマに従って寸法を並べ替えます。したがって、このマトリックスを使用して変換する場合:

import tensorflow as tt
import os
os.environ["TF_CPP_MIN_LOG_LEVEL"]="3"
import numpy as bb
ab=([[[1,2,3],[6,5,4]],[[4,5,6],[3,6,3]]])
v=bb.array(ab)
fg=tt.transpose(v)
print(v)

with tt.Session() as df:
    print("\n New tranformed matrix is: \n\n{}".format(df.run(fg)))

結果は次のとおりです。

[[[1 2 3]
  [6 5 4]]

 [[4 5 6]
  [3 6 3]]]

 New tranformed matrix is: 

[[[1 4]
  [6 3]]

 [[2 5]
  [5 6]]

 [[3 6]
  [4 3]]]

Process finished with exit code 0

今perm引数を使用する場合:

import tensorflow as tt
import os
os.environ["TF_CPP_MIN_LOG_LEVEL"]="3"
import numpy as bb
ab=([[[1,2,3],[6,5,4]],[[4,5,6],[3,6,3]]])
v=bb.array(ab)
fg=tt.transpose(v,perm=[0,2,1])
print(v)

with tt.Session() as df:
    print("\n New tranformed matrix is: \n\n{}".format(df.run(fg)))

結果は次のとおりです。

[[[1 2 3]
  [6 5 4]]

 [[4 5 6]
  [3 6 3]]]

 New tranformed matrix is: 

[[[1 6]
  [2 5]
  [3 4]]

 [[4 3]
  [5 6]
  [6 3]]]

Process finished with exit code 0

このため、私は混乱しており、2つの質問があります。

  • 行列を転置したいときはいつでも、デフォルトとしてperm [0,2,1]を与えなければなりませんか?
  • ここで0,2,1とは何ですか?
12
stephen

_numpy.transpose_ ドキュメントを見ると、transposeが引数を取る

axesintのリスト、オプション

したがって、transposeのデフォルトの呼び出しは、2Dの場合はnp.transpose(a, axes=[1,0])に、またはnp.transpose(a, axes=[2,1,0])に変換されます。

ここで必要な操作は、「深さ」ディメンションを変更しないままにするものです。したがって、Axes引数では、_0_ th軸である深さ軸を変更しないでおく必要があります。軸_1_および_2_(1は垂直軸)は、位置を変更する必要があります。したがって、軸の順序を最初の_[0,1,2]_から_[0,2,1]_(_[stays the same, changes with other, changes with other]_)に変更します。

テンソルフローでは、何らかの理由でaxespermに名前変更しました。上記の引数は同じままです。

画像

画像に関しては、問題の配列とは異なります。通常、画像の最初の2つの次元にはxとyが格納され、最後のチャネルには_[y,x,channel]_が格納されます。

水平軸と垂直軸が交換される2D転置の意味で画像を「転置」するには、以下を使用する必要があります。

_np.transpose(a, axes=[1,0,2])
_

(チャネルは同じままで、xとyは交換されます)。

enter image description here