中年の親父が人工知能ブームの影響を受けてこっそり勉強しているブログ

GPU付のマシンもなければ、ここ何年もまともにプログラミングをやっていなかったPython初心者の中年のおっさんが、人工知能ブームに乗って、Python, Anaconda, Theano、Tensorflow、Kerasを含めAIについていろいろ勉強をしてみたメモ

TensorflowのWebサイトは有益な情報の宝庫

Tensorflowについては、いろいろな書籍が出ていますし、ネット上でも有益な情報がたくさんあります。ただ、やはり本家本元のTendorflowのサイトの情報は充実しています。今回は、ここからいくつかPythonのコード解説やサンプルを動かしながら勉強してみたので、簡単にメモしておきます。

 

1.Tensorflowのサイト

サイトのURLはシンプルです(https://www.tensorflow.org/)。開くと次のような画面が出てきます。

f:id:ColdSnap:20170906141452p:plain

このトップページは、最新Versionのお知らせ、大規模イベントのアナウンス、GITHUBへのリンクも右上にあって、なかなか充実しています。Tensorflowをはじめた人向けには「GET STARTED」があります。ここをクリックしてみましょう。

 

2.GET STARTED

f:id:ColdSnap:20170906142113p:plain

TensorflowのAPIは、Tensorflow Core用のAPIとより上位のAPIがありますが、ここではTensorflow Core用のAPIチュートリアルになっています。言語はPythonです。インストール方法へのURLのLinkも乗っています。

f:id:ColdSnap:20170906142146p:plain

続いて、Tensorflowのデータの中心単位がtensorと呼ばれることとそのコード例、PythonでのImport例が書いてあります。

 

さらに、このように基本的なTensoflowの使い方がコード例として出ています。読みながら適時コピペしてつないでIPythonやJupier NoteBookで動かしてゆくことで確認できます。この初心者向けの最初のページだけでも、なかなか情報量があり、図も交えて書かれてあって、とてもいいです。

 

3.Google翻訳を併用してもいい

 

英語の文章を長々と読みたくないという人、英語は苦手という人は、適時Google翻訳を使ってもいいと思います。Google翻訳は使えるケースとあまり役に立たないケースがあるのですが、このサイトの正式文書はきちんと書かれている文章が多いので、比較的マシな日本語が返ってくるものが多いです。例えば、以下のような感じで、自然な訳かどうかはともかく理解の役には立ちます。

 

(オリジナルの英文)

A computational graph is a series of TensorFlow operations arranged into a graph of nodes. Let's build a simple computational graph. Each node takes zero or more tensors as inputs and produces a tensor as an output. One type of node is a constant. Like all TensorFlow constants, it takes no inputs, and it outputs a value it stores internally. We can create two floating point Tensors node1 and node2 as follows:

上記Google翻訳したもの)

計算グラフは、一連のTensorFlow演算をノードのグラフに配置したものです。簡単な計算グラフを作成しましょう。各ノードは、入力として0以上のテンソルをとり、出力としてテンソルを生成する。1つのタイプのノードは定数です。すべてのTensorFlow定数と同様に、入力もなく内部的に格納される値を出力します。node1とnode2の2つの浮動小数テンソルを次のように作成できます。

 

(オリジナルの英文)

As it stands, this graph is not especially interesting because it always produces a constant result. A graph can be parameterized to accept external inputs, known as placeholders. A placeholder is a promise to provide a value later.

上記Google翻訳したもの)

このグラフは、常に一定の結果を生むため、特に興味深いわけではありません。グラフは、プレースホルダと呼ばれる外部入力を受け付けるようにパラメータ化できます。プレースホルダは後で値を提供するという約束です。

 

4.エラーが出る場合

エラーが出る場合もあります。しかし、このページはとても有名でたくさんの人が利用しているので、どんなエラーが出たのか、その行とエラーをコピペして検索すれば結構ヒットして、どうすればいいか対処方法がわかります。

 

私の場合、このページにあるコードを実行したら一部でエラーが出たので、その行とエラーを検索したら、やはり同じエラーに直面した人が質問しているslackがあって(https://www.quora.com/How-should-I-start-learning-tensor-flow)、以下のような感じで出てきたので、それで対処しました。わかってしまえば、なーんだ、ですが。ちなみに、ついでにざっと流して読んだだけですが、このslackはいろんな質問と答えがあって、有益そうです。

f:id:ColdSnap:20170906142416p:plain

5.tf.train APIを用いたLiner Regressionのサンプル

シンプルなLiner Regression(線形回帰)のサンプルも同じページに乗っています。以下の通りです。GPUが乗っていないマシンだと実行時に警告が出ますが、きちんとうごきます。

  • モデルを設定
  • 損失関数を設定
  • 勾配降下法で最適化
  • トレーニング
  • 精度をみる

という機械学習の基本的な形が簡潔なコードで書けることがわかります。

 

import tensorflow as tf

 

# Model parameters

W = tf.Variable([.3], dtype=tf.float32)

b = tf.Variable([-.3], dtype=tf.float32)

# Model input and output

x = tf.placeholder(tf.float32)

linear_model = W * x + b

y = tf.placeholder(tf.float32)

 

# loss

loss = tf.reduce_sum(tf.square(linear_model - y)) # sum of the squares

# optimizer

optimizer = tf.train.GradientDescentOptimizer(0.01)

train = optimizer.minimize(loss)

 

# training data

x_train = [1, 2, 3, 4]

y_train = [0, -1, -2, -3]

# training loop

init = tf.global_variables_initializer()

sess = tf.Session()

sess.run(init) # reset values to wrong

for i in range(1000):

  sess.run(train, {x: x_train, y: y_train})

 

# evaluate training accuracy

curr_W, curr_b, curr_loss = sess.run([W, b, loss], {x: x_train, y: y_train})

print("W: %s b: %s loss: %s"%(curr_W, curr_b, curr_loss))

 

6.tf.train API

先ほどの線形回帰のプログラムを、高レベルのTensorflowのライブラリであるtf.train APIで書き直した例も載っています。コードはサイトを見てください。これもGPU無しだと警告は出ますが、動きます。