tf.one_hot符号化の使い方及びone-hot自己符号化

28648 ワード

tf.one_hot符号化の使い方


最近は以前普通の機械で勉強していた一つの項目を三層の全接続ニューラルネットワークで走りたいと思っていますが、labelをする際には(0,1)という二つのlabelをone-hot符号化に変える必要があるので、tfを探究しました.one_hotの使い方.
tf.one_hot(indices, depth, on_value=None, off_value=None, axis=None, dtype=None, name=None)
indices:1つのマトリクスであり、1次元のマトリクス(多数)であってもよいし、多次元であってもよい
depth:出力するone-hot符号化tensorの列の次元、例えば(1800,)の1次元マトリクス、depthは3であり、[1800,3]のshapeのtensorを出力する
on_value:デフォルトは1で、自分で指定することができます.one-hot符号化の「1」をあなたが指定した数字に変えます.
off_value:デフォルトは0です.自分で指定できます.one-hot符号化の「0」を指定した数字に変えます.
axis:デフォルトは-1です.一般的にはデフォルトで、直感に合っています.具体的な使い方は:
If indices is a vector of length features( , 1800) , the output shape will be: features x depth if axis == -1 depth x features if axis == 0 If indices is a matrix (batch) with shape [batch, features]( ) , the output shape will be: batch x features x depth if axis == -1 batch x depth x features if axis == 1 depth x batch x features if axis == 0
dtype:デフォルトはtf.float32
公式に提供された例:
   indices = [0, 1, 2]
   depth = 3
   tf.one_hot(indices, depth)  # output: [3 x 3]
   # [[1., 0., 0.],
   #  [0., 1., 0.],
   #  [0., 0., 1.]]
   
   indices = [0, 2, -1, 1]
   depth = 3
   tf.one_hot(indices, depth,
              on_value=5.0, off_value=0.0,
              axis=-1)  # output: [4 x 3]
   # [[5.0, 0.0, 0.0],  # one_hot(0)
   #  [0.0, 0.0, 5.0],  # one_hot(2)
   #  [0.0, 0.0, 0.0],  # one_hot(-1)
   #  [0.0, 5.0, 0.0]]  # one_hot(1)
   
   indices = [[0, 2], [1, -1]]
   depth = 3
   tf.one_hot(indices, depth,
              on_value=1.0, off_value=0.0,
              axis=-1)  # output: [2 x 2 x 3]
   # [[[1.0, 0.0, 0.0],   # one_hot(0)
   #   [0.0, 0.0, 1.0]],  # one_hot(2)
   #  [[0.0, 1.0, 0.0],   # one_hot(1)
   #   [0.0, 0.0, 0.0]]]  # one_hot(-1)

自分で試してみると、このone-hot符号化は0から始まる符号化であり、たとえあなたのlabelに0がなくても、例えば(1,2)のlabelからでも、0から符号化されるだけで、これは特に注意する必要があります.
>>> indices = [1,2,1,1,2]
>>> depth = 2
>>> tf.one_hot(indices, depth)2 , (depth) , 1
 [[ 0.  1.]
  [ 0.  0.]
  [ 0.  1.]
  [ 0.  1.]
  [ 0.  0.]]
  
 >>>depth = 3
 >>>tf.one_hot(indices, depth)2 , (depth) 
 [[ 0.  1.  0.]
   [ 0.  0.  1.]
   [ 0.  1.  0.]
   [ 0.  1.  0.]
   [ 0.  0.  1.]]

じこコーディング


以前、優達のh深さ学習網の授業でもone-hot符号化に遭遇したことがあるが、mnistデータセットのlabelをone-hot符号化する際にnumpyの一言だけを利用すればよい.
>>>train_label = np.array([0,1,2,3,4,5,6,7,8,9,2,3,0])
>>>train_label_one_hot = (np.arange(10) == train_label[:,None]).astype(np.float32)
>>>train_label_one_hot
array([[ 1.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.],
       [ 0.,  1.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.],
       [ 0.,  0.,  1.,  0.,  0.,  0.,  0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  1.,  0.,  0.,  0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.,  1.,  0.,  0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.,  0.,  1.,  0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.,  0.,  0.,  1.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  1.,  0.,  0.],
       [ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  1.,  0.],
       [ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  1.],
       [ 0.,  0.,  1.,  0.,  0.,  0.,  0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  1.,  0.,  0.,  0.,  0.,  0.,  0.],
       [ 1.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.]], dtype=float32)

np,arange(10)はshapeが(10,)のarray([0,1,2,3,4,5,6,7,8,9])を作成し、train_Label[:,None]で作成したshapeが(13,1)のarrayをブロードキャスト比較し,shapeが(13,10)のTrue,Falseの値行列を得てフォーマットを再変換すればよい.