TensorflowとKerasのチートシートっぽいもの

TensorflowとKerasでよく使うもので、かつ最初よくわからなかったものを調べてコメントアウトと補足でまとめてみました。
今後コードを書いていく上で、毎回毎回同じものを
「ここなんだろう?」→調べる
という作業をするのは時間がもったいないので、基本的なことはこのページさえ見れば大体わかるっていうものを書いてみました。

詳解 ディープラーニング ~TensorFlow・Kerasによる時系列データ処理~
詳解 ディープラーニング ~TensorFlow・Kerasによる時系列データ処理~

 

Tensorflow

 

結果

 
以下補足。「○行目」は上のコードの行数を指します。
pythonインタプリタで

を事前に実行しているものとします。

 

補足1 random.randnと18行目でしたいこと

np.random.randn(10,2)は標準正規分布に従う乱数で10*2行列を作ります。

このX1の要素に[0,10]を足してあげることで、X1[n][2]が(標準正規分布+10)になり、乱数の値の幅をコントロールしています。

【参考】Numpyによる乱数生成まとめ – Qiita
【参考】正規分布とは何なのか?その基本的な性質と理解するコツ | アタリマエ!

 

補足2 行列をforで作成

これも打ってみると自明ですが、forループを回すことで1行で10*3行列ができます。

 

補足3 concatenate

適当に2*3行列の配列X作ります。

axis=0のとき、行方向に連結します。

axis=1のとき、列方向に連結します。

 

補足4 reduce_sumのreduction_indices

これかなりわかりにくかったんですが、reduction_indicesに何も指定しないと、全要素の和が0階のテンソル(スカラー値,1*1行列の形)で返されます。

 
reduction_indicesに0を入れると、1次元目を足し合わせた和が返されます。
例えば、x[n][1]を見てみると答えの0次元目は
x[1][0] + x[2][0] + x[3][0]
となっています。

 
reduction_indicesに1を入れると、2次元目を足し合わせた和が返されます。
例えば、x[0][n]を見てみると答えの0次元目は
x[0][1] + x[0][2] + x[0][3]
となっています。

【参考】
[TensorFlow] APIドキュメントを眺める -Math編- | Developers.IO
算術記号とTensorFlow関数の対応 | SaintSouth.NET

 

補足5 argmax

1次元配列だとわかりやすいです。
以下の例ではx1[1]が9なので最も大きいですね。
なので「1」と返ってきます。

順番を変えてみました。
x1[5]が最も大きいので「5」と返ってきます。

 
2次元配列を考えてみます。
argmaxの第2引数を0にすると、1次元目(行成分)についての最大値をそれぞれ返します。
つまりy[0][n]とy[1][n]を比べて前者が大きければ「0」、後者が大きければ「1」を返しています。
同様に、argmaxの第2引数を1にすると、2次元目(列成分)についての最大値をそれぞれ返します。
y[n][1]とy[n][2]とy[n][3]とy[n][4]を比較しています。

 

補足6 shuffle

sckit-learnのshuffleを使っています。

結果を見たらわかると思いますが、シャッフルを行うたびに要素がシャッフルされます。

 

Keras

上のコードと全く同じ挙動を示すkeras版のコードです。
tensorflown方で書いたコメントと同じものは端折っているところもあります。

 

結果

 
最初のxのデータの分布図。

 
つまり今回学習させたかったことは
赤○のところ付近にある数字の場合は[1,0,0]
青△のところ付近にある数字の場合は[0,1,0]
緑+付近にある数字の場合は[0,0,1]と返す。
という感じのモデルです。

 

おまけ

最初の変数宣言の部分の「入力データ」や「クラス数」などの意味が文字から連想しにくいので簡単に図を書いてみました。M,K,nがどこを指しているのかひと目でわかると思います。

【参考】
とりあえず描く — matplotlib 1.0 documentation

 
詳解 ディープラーニング ~TensorFlow・Kerasによる時系列データ処理~
詳解 ディープラーニング ~TensorFlow・Kerasによる時系列データ処理~

コメントを残す