DreamerDreamのブログ

夢想家の夢です。〜揚げたてのモヤっとしたものをラフレシアと共に〜

ディープラーニングの「ターゲット?trainってなんなのさ?」

f:id:DreamerDream:20180426115210j:plain

前回はディープラーニングにおける「次元」について述べました。

 

dreamerdream.hateblo.jp

 

今回はディープラーニングで用いられる「ターゲット」「クラス」「データ」「X」「y」「train」「test」などのWebでの参考資料で説明無くよく使われている見慣れない用語のお話です。

 

こういう用語はあまりに普通にサンプルコードで使われている用語なのでほとんどのページには特に説明がありません。

けど初心者の僕には「train?列車?なんで??配列を列車に例えてるとか???」とチンプンカンプンになるわけですよ。

 

ということで解説です。

(教師ありの)機械学習において、機械に学習させるための「問題」とそれに対する「答え」があるわけですね。上記の用語は全てこれらのことを指しています。

まず、「問題」に対する用語

「データ」「サンプル」「X(x)」という用語がよく当てはめられているようです。

次に、「答え」に対する用語

「ターゲット」「クラス」「y(Y)」という用語がよく当てはめられているようです。

 

サンプルソース等では「X-train」「y-train」「X-test」「y-test」という変数がよく割り振られていますね。

この「train」は列車ではなく、「training」(トレーニング)の略だそうです!!(←ややこしいとこで切んじゃねーよっ!!と盛大にツッコミました。)

つまり

X-train」←トレーニング用データの問題

「y-train」←トレーニング用データの答え

「X-test」←テスト用データの問題

「y-test」←テスト用データの答え

という意味です。ハァ、スッキリ解決ですね!!(笑)QとかAにしてほしかった。

 

 

さて、意味が解ったところでXとyを準備することにしましょう。(さっそく使うヤツ・・・いや慣れが必用ですから)

kerasのサンプルに予め用意されている手書き文字などのデータセットにはXとyはセットで入っていますが、自前のデータを用意する場合、Xだけでなく当然yも作らないといけません。

 

例えば

X[[100,0],[100,15]]に対するyを0

X[[10,103],[10,150]に対するyを1

X[[10,10],[10,15]に対するyを2

と用意する場合、

データセットとしてXは3次元配列の

[

[[100,0],[100,15]],

[[10,103],[10,150],

[[10,10],[10,15]

]

それに対応するyは1次元配列の

[

0,

1,

2

]

として用意することが思い浮かぶと思います。

 

実はXはこの状態で機能しますが(前回記述の「正規化」の処理は必用です)、yは

各データごとの割合として配列にして入力する必用があるようです。

[

[1,0,0],

[0,1,0],

[0,0,1]

]

↑(左から0に対する割合、1に対する割合、2に対する割合のように)

例えば、選択肢が5つであれば

[[1,0,0,0,0],[0,1,0,0,0],[0,0,1,0,0]]

↑(0,1,2)ってこと

という具合に選択肢の数だけ配列を用意することになります

 

そして、学習後に問題を出して導き出される「答え」も同じ「割合の配列」なのです!

[0.993, 0.002, 0.017] のような感じ

機械学習ではこの一番大きい数を「答え」としているのです!

 

けど、この配列を答えの数だけ用意してしかも01を間違えずに打ち込むのって大変すぎるんです!

なのでkerasには便利なツールが予め用意してあります!

keras.utils.to_categorical(「答えの配列データ」,「答えとして用意する配列の数」)

で一発変換してくれます!

 

import numpy as np

import keras

y=np.array([0,3,1,2,0,1,2,3,3,2,3,2]) #numpy配列でyを用意

classes = len(np.unique(y)) #変数classesに答えの数を格納

y = keras.utils.to_categorical(y,classes) #yに配列として保存

print y

出力結果

Using TensorFlow backend.
[[ 1. 0. 0. 0.]
[ 0. 0. 0. 1.]
[ 0. 1. 0. 0.]
[ 0. 0. 1. 0.]
[ 1. 0. 0. 0.]
[ 0. 1. 0. 0.]
[ 0. 0. 1. 0.]
[ 0. 0. 0. 1.]
[ 0. 0. 0. 1.]
[ 0. 0. 1. 0.]
[ 0. 0. 0. 1.]
[ 0. 0. 1. 0.]]

 見事に変換してくれますね!

 

では、どうやって数百個もの訓練データの答えを準備するのか?という疑問が残りますね。

方法は幾通りもありそうですが、

例えば、訓練用のデータを「答え0の問題」「答え1の問題」と分けて手動でドンドン回答別のディレクトリに放り込んで行って訓練データの数だけ同じ答えをnumpy配列で放り込むという方法があります。

numpy形式で全配列に同じ値を入れるには

例)

import numpy as np

cls0 = np.full(10,0)

cls1 = np.full(20,1)

とすることでcls0に10個0が格納され、cls1には20個1が格納されます。

統合するには

y = np.append( cls0, cls1 )

とすることでyに統合出来ます。

そして、上記のkerasのcategoricalを利用すると配列を割合に再構築できます。

例)

import keras

classes = len(y.unique(y)) #変数classesに答えの数を格納

y = keras.utils.to_categorical(y,classes) #yに配列として保存

yの配列は各配列順に「割合の配列」として保存されます。

 

問題Xはnumpy配列として準備する必用がありますが、数値データにしろ画像データにしろ予めnumpy配列として1つのファイルとして保存しておくと便利です。

numpy配列の保存はsave()を使います。

例)

import numpy as np

np.save('data0',data0)

np.save('data1',data1)

 

で保存出来ます。

読み出しはload()を使い、統合はappendで統合できます。

import numpy as np

data0 = np.load('data0')
data1 = np.load('data1')

X = np.append(data0,data1,axis = 0)

 

これでXとyの準備がやっと整いました!

しかし、そのままではXもyも「答え0の集合」+「答え1の集合」という順番になってしまうので問題と答えの順番を維持したままランダムに入れ替え必用があります。

ランダム関数を利用すると

例)

import numy as np

indices = np.random.permutation(len(X))
X_train = X[indices[:]]
y_train = y[indices[:]]

 X、yの順番を維持したまま全てランダムに置き換えられます。

これでデータセットの準備が完了です!

 

 

次に、トレーニング用のデータとテスト用のデータを分ける方法について。

先に配列から分けておく方法とkerasの学習時に自動で分ける方法があります。

明確にテストしたいデータがある場合は先に割り振りますが、面倒なので多くのサンプルコード場合はkerasで自動的にテストデータを割り振っていますね。先に分けるのは特殊なケースだと思います。

 

今回は先に分けておく方法を記載します。

例)

X_train = X[:-10]

y_train = y[:-10]

X_test = X[-10:]

y_test = y[-10:]

 

Pythonでは配列の範囲を指定して抜き取る場合、[:]で指定することが出来ます。

X_train=X[0:10]とした場合、X[0]からX[9]の値がX_trainに格納されます。

X_train=X[:]と範囲を無指定にした場合には、全ての値がX_trainに格納されます。

X_train=X[0:-10]というふうに-を付けて指定した場合には、配列最後から10個目までが格納されます。

従って例)の場合、X_trainにはXの先頭から最後から10個を除いた値が格納され、X_testには最後から10個の値が格納される。というワケです。

 

 

ということで、無事にXとyの準備が出来ましたら、次回は学習モデル設定のお話です。

 

dreamerdream.hateblo.jp