tf.transpose()関数とテンソル転置演算(パラメーターパーマ)の説明と考え方



Explanation Thinking Tf



今日は、TensorFlowでのテンソルTensor転置関数tf.transpose()の使用法を、そのパラメーターpermとその原理に焦点を当てて共有します。

テンソル順序

転置関数の紹介を始める前に、テンソルの順序を見てみましょう。



テンソルTensorがスカラー、つまり方向のないスカラーの場合、その次数は0です。

x0 = tf.constant(1) print(x0) # Output tf.Tensor(1, shape=(), dtype=int32)

テンソルが[1、2、3]などのベクトルの場合、その次数は1です。



x1 = tf.constant([1, 2, 3]) print(x1) # Output tf.Tensor([1 2 3], shape=(3,), dtype=int32)

テンソルが行列の場合、その次数は2です。
画像

x2 = tf.constant([[1, 2], [3, 4]]) print(x2) # Output tf.Tensor([[1 2] # [3 4]], shape=(2, 2), dtype=int32)

また、3次テンソルは、次の図に示すように、複数の小さな立方体で構成される立方体番号のセットと見なすことができ、各小さな立方体には番号が格納されます。

3



x3 = tf.constant([[[1, 2, 3], [4, 5, 6]], [[7, 8, 9], [10, 11, 12]]]) print(x3) # Output tf.Tensor([[[ 1 2 3] # [ 4 5 6]] # # [[ 7 8 9] # [10 11 12]]], shape=(2, 2, 3), dtype=int32)

テンソル転置

次に、テンソルの転置について説明します

次数0と次数1のテンソルの転置は無意味であると言えます。次数2のテンソルの転置は次のような行列の転置と同等です。
二
に転置
二
大学の線形代数部分に属し、あまり導入する必要はありません

焦点を当てましょう 次数3のテンソルの転置 、次に、tf.transpose()関数を使用する必要があります

tf.transpose()関数の公式文書では、関数にパラメーターpermがあることが紹介されており、permの値を指定することでTensorの転置が完了します。

permは、テンソル次数の指定された変更を表します。テンソルの次数が2で、その形状が=(x、y)であるとすると、この状態では、デフォルトでperm = [0、1]になります。 2次テンソルを転置する場合、tf.transpose(perm = [1、0])を指定すると、行列の転置が直接完了し、このときのテンソルの形状は=(y、x)になります。

x2_ = tf.transpose(x2) print(x2_) # Output tf.Tensor([[1 3] # [2 4]], shape=(2, 2), dtype=int32)

処理オブジェクトが3次テンソルの場合、以下の例では、 公式文書 この文は次のように与えられます:
画像

# 'perm' is more useful for n-dimensional tensors, for n > 2

だから問題は、なぜperm = [0、2、1]を設定するのかということです。パラメータperm = [0、2、1]が設定されている場合、なぜこのような転置結果が得られるのですか?

tf.transpose()関数とpermパラメーターの詳細な説明

これは、元のTensor自体の形状に関連しています。

まず、Tensorx3がどのように構成されているかを見てください。テンソルでは、最も外側のブラケットに2つのブラケットが含まれ、これら2つのブラケットにはそれぞれ2つのブラケットが含まれ、これら2つのブラケットには3つのint型の値が含まれるため、その形状値は(2、2、3)です。次の図に示すように、この3Dテンソルをボリュームグラフに描画すると。
3

x3 = tf.constant([[[1, 2, 3], [4, 5, 6]], [[7, 8, 9], [10, 11, 12]]]) print(x3) # Output tf.Tensor([[[ 1 2 3] # [ 4 5 6]] # # [[ 7 8 9] # [10 11 12]]], shape=(2, 2, 3), dtype=int32)

ここに鍵があります、ここで私たちはパーマを次のように理解することができます 立方体をカットするためのカット順序 。 Tensor x3の形状は(2、2、3)であることがわかっています。これは、元のパーマの切断順序に対応しています。順番は、 縦に、横に平行にカットします。再び水平にカット水平エッジに平行に垂直に再度カットします 、下図のように、テンソルの元の形状が得られます。
1
次の図に示すように、この切断順序を0、1、2として定義するため、perm = [0、1、2]となります。
画像
この対応を理解した後。コード結果が渡されない場合に、転置されたテンソルの形状を決定する方法を見てみましょう。

この3次元テンソルx3を転置し、パーマ値を[0、2、1]に設定すると、この時点での対応する形状は(2、3、2)に変換されます。どうして?

perm = [0、2、1]は、立方体を次の順序でカットする必要があることを意味します。 縦に、横に平行にカットします。水平エッジに平行に垂直に再度カットします再び水平にカット 、下図のように、転置されたテンソルの形状が得られます。
画像
画像
このとき、関数ステートメントtf.transpose(x3、perm = [0、2、1])を使用して、転置結果が推定結果と一致していることを確認します。つまり、shape =(2、2、3)のテンソルはperm = [0、2、1]に転置され、shape =(2、3、2)のテンソルになります。

x3_ = tf.transpose(x3, perm = [0, 2, 1]) print(x3_) # Output tf.Tensor([[[1 4] # [2 5] # [3 6]] # # [[7 10] # [8 11] # [9 12]]], shape=(2, 3, 2), dtype=int32)

これが、TensorFlow2.0の公式Webサイトチュートリアルで、 公式の推奨事項は、テンソル次元が2より大きい場合です。転置操作にpermパラメーターを使用する 、効果を出す方が便利です。 もちろん、元のテンソル形状と必要な変形テンソル形状を明確にし、その後の要件に従ってパラメーターpermの値を決定する必要があることが前提です。

この記事がTensorを理解するのに役立つことを願っています!