読者です 読者をやめる 読者になる 読者になる

アラカン"BOKU"のITな日常

人事評価と人工知能について考えたことがメインテーマです。

TensorFlowの使い方をざっくりと理解する。今度は、Numpyと併用してみる。

ディープラーニング プログラミング

TensorFlowが「データフローグラフを使用した数値計算用のオープンソースソフトウェアライブラリ」であるという部分をもう少し見てみます。

 

本家のサイトにAPIのリファレンスのページがあります。

https://www.tensorflow.org/api_docs/python/

 

ここで、モジュール tfの下を見ていくと、なるほど、sin()とかcos()とかtan()とかcell()とか・・数値計算用のライブラリでおなじみのメソッド名が並んでます。

 

前回、単一の数字を使った足し算・掛け算をやったので、今回は配列データを生成して計算するというのを、TensorFlowでやるとどうなるのかな?と思ってやってみました。

 

 0から6までの数字を0.1刻みで生成して、その配列を渡して、sin()値を計算するというのをやります。

 

まず、Numpyでやってみます。

x = np.arange(0,6,0.1)
y = np.sin(x)

 ですね。上の行で、「0から6までの数字を0.1刻みで生成」し、下の行で「sin()値を計算」しています。

 

これをTensorFlowでやるとこうなります。

def get_sin():
    x = tf.range(0.,6.,0.1)
    return tf.sin(x)

with tf.Session() as sess:

    y = sess.run([get_sin()])

 

 tf.range(0.,6.,0.1) で「0から6までの数字を0.1刻みで生成」し、 tf.sin(x)で「sin()値を計算」するんですけど、TensorFlowの場合は、tf.sin(x)だけではグラフを構築しただけでしかないので、sess.runでそれを実行しているというわけですね。

 

どちらも結果は全く同じです。こんな感じのサインカーブを描ける値を生成します。

f:id:arakan_no_boku:20170309194510j:plain

 

値は同じなんですが、OUTPUTの型が全く違います。Numpyは「Numpy配列」、TensorFlowは「Tensor」です。

 

じゃあ、Tensorとはなんだ?です。

 

Tensorは「テンソル」と読み「線形的な量または線形的な幾何概念を一般化したもの」だそうです。

 

多次元配列で表現されているんですが、Rankというもので次元をあらわし、Rankが0なら「スカラー値」、1なら「ベクトル」、2なら「行列」、3なら例えば画像データなどを扱える「3-Tensor」などと一般化形式が決まります。

 

その形式に収めるデータ・タイプは、例えば「float32」「float64」「int8」「int16」・・など、様々なものを収めることができます。

 

もっと知りたい場合は

Tensor Ranks, Shapes, and Types  |  TensorFlow

に詳しく書いてあります。(英語ですけどね)

  

どうも、あらゆるデータ型の多種多様な線形的な量または幾何概念を、ひとつのTensorというオブジェクトで表現できてしまうみたいです。すごくないですか。

 

でも、正直、簡単な数式計算をするだけなら、やっぱNumpyの方が楽ですし、速いわけです。

 

ごちゃごちゃした計算はNumpyでやって、結果だけをTensorFlowに渡して後続の処理をやれないか?って、思いますよね。

 

ということでやってみました。

def get_sin_graph():
    x = np.arange(0,6,0.1)
    y = np.sin(x)
    return tf.constant(y.astype(np.float32))

 

with tf.Session() as sess:

    sin_result = sess.run([get_sin_graph()])

 

Numpy配列を、asTypeを使って、float32とかのTensorでサポートしている型にしてやれば良いみたいです。

f:id:arakan_no_boku:20170309202947j:plain

 

float32の型(dtype)の1次元配列になっていますね。これは、Rank=1 のVectorデータのTensorです。いけたみたいですね。