web-dev-qa-db-ja.com

TensorFlowでは、関数 'tf.one_hot'の引数 'axis'は何ですか

axisTensorFlowにあるone_hot 関数?

ドキュメント によると:

axis:塗りつぶす軸(デフォルト:-1、新しい最も内側の軸)

最も近い SOは説明でしたパンダ に関連する答えに到達しました:

コンテキストが適切かどうかはわかりません。

12
user919426

以下に例を示します。

_x = tf.constant([0, 1, 2])
_

...は入力テンソルおよび_N=4_です(各インデックスは4Dベクトルに変換されます)。

_axis=-1_

one_hot_1 = tf.one_hot(x, 4).eval()を計算すると、_(3, 4)_テンソルが得られます。

_[[ 1.  0.  0.  0.]
 [ 0.  1.  0.  0.]
 [ 0.  0.  1.  0.]]
_

...ここで、最後の次元はワンホットエンコードされています(はっきりと見える)。これはデフォルトの_axis=-1_、つまりlast oneに対応します。

_axis=0_

現在、one_hot_2 = tf.one_hot(x, 4, axis=0).eval()を計算すると_(4, 3)_テンソルが生成されますが、これはワンホットエンコードとしてすぐには認識されません。

_[[ 1.  0.  0.]
 [ 0.  1.  0.]
 [ 0.  0.  1.]
 [ 0.  0.  0.]]
_

これは、ワンホットエンコーディングが0軸に沿って行われ、前のエンコーディングを表示するためにマトリックスを転置する必要があるためです。入力が高次元の場合、状況はより複雑になりますが、考え方は同じです。違いは、ワンホットエンコーディングに使用されるextra次元の配置にあります。

10
Maxim

私にとって、軸は「寸法を増やすためにどこで追加の数字を追加しますか」に変換されます。少なくともこれは私がそれを解釈し、ニーモニックとして機能する方法です。

たとえば、[1,2,3,0,2,1]があり、これは形状(6,1)です。つまり、1次元配列です。 one_hotはゼロを追加し、元の配列のすべての位置で位置を1に変換します。これを行うには、元の配列は元の配列よりも1次元多くなければならず、軸はそれを追加する場所を関数に指示しますこの新しいディメンションは例を識別します


軸= 1

2番目の次元を追加すると、最初の次元が保持されます。これにより、(6,4)配列になります。したがって、結果の配列では、最初の次元(0)を使用して表示される例を確認し、2番目の次元(1、新しいもの)を使用してそのクラスがアクティブかどうかを確認します。 newArr [0] [1] = 1は、例0、クラス1を意味します。この場合、例0はクラス1のものです。

   0   1   2   3  <- class

[[ 0.  1.  0.  0.]   <- example 0
 [ 0.  0.  1.  0.]   <- example 1
 [ 0.  0.  0.  1.]   <- example 2
 [ 1.  0.  0.  0.]   <- example 3
 [ 0.  0.  1.  0.]   <- example 4
 [ 0.  1.  0.  0.]]  <- example 5

軸= 0

最初のディメンションを追加すると、既存のディメンションがシフトされます。これにより、(4,6)配列が生成されます。したがって、結果の配列では、最初の次元(0、新しい次元)を使用して、そのクラスがアクティブであるかどうかを確認し、2番目の次元(1)を使用して、どの例を見るかを確認します。 newArr [0] [1] = 0はクラス0、例1を意味し、この場合、例1はクラス0ではないことを意味します。

   0   1   2   3   4   5  <- example

[[ 0.  0.  0.  1.  0.  0.]   <- class 0
 [ 1.  0.  0.  0.  0.  1.]   <- class 1
 [ 0.  1.  0.  0.  1.  0.]   <- class 2
 [ 0.  0.  1.  0.  0.  0.]]  <- class 3
10
loco.loop