デジタル・デザイン・ラボラトリーな日々

アラフィフプログラマーが数学と物理と英語を基礎からやり直す。https://qiita.com/yaju

TensorFlowコトハジメ フィボナッチ数列

はじめに

前回、TensorFlowの概要記事を書いた。概要としてはまだ足りないのだが、次に進まないとならない。
TensorFlowのプログラムを組むのに簡単な例として、フィボナッチ数列が良さそうなので、これを題材として理解してみる。

ネットで検索したフィボナッチ数列のPython用プログラムを参考とする。
参照:Python(11)再帰のお勉強:フィボナッチの数列

フィボナッチ数列(Fibonacci number)とは

1+1=2、1+2=3、2+3=5、3+5=8… と、前項2つを加えて、次々とできる数の列のことをフィボナッチ数列といいます。
f:id:Yaju3D:20160417173452p:plain
このフィボナッチ数列の隣接する2つの数の比は限りなく黄金比に近づいています。花びらの数、葉のつき方など自然界にもこの周期が現れるものも多くあります。 また、名刺の縦横比、建物や絵画、彫刻などのバランスの美しさにも、この黄金比が現れていることが多いのです。
blog.livedoor.jp

{F_{0}=0}
{F_{1}=1}
{F_{n}=F_{n-1}+F_{n-2}} {(n>1)}

この漸化式で表せる数列です。
0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765, 10946, …

プログラム 1

d136o/tensor_overflow.py

import argparse
import tensorflow as tf
import sys

def flowfib(n):
    # f_n = f_n-1 + f_n-2
    f = [tf.constant(0),tf.constant(1)]
    
    if n>2:
        for i in range(2,n):
            f_i = f[i-1] + f[i-2]
            f.append(f_i)
    
    with tf.Session() as sess:
        result = sess.run(f)
        print(result)

flowfib(20)

#[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181]

説明

[TensorFlow] APIドキュメントを眺める -Tensor編-

整数リテラルを使って生成した Tensor については tf.int32 が要素の数値型として適用される模様です。

import tensorflow as tf
a = tf.constant(0)
a.dtype

# tf.int32

appendは、Pythonの要素追加メソッドです。

f.append(f_i)

プログラム 2

qiita.com

import tensorflow as tf

u = tf.Variable(tf.cast(1,"int64"))
v = tf.Variable(tf.cast(0,"int64"))

update_u = tf.assign(u, tf.add(u,v)) # u = u + v
update_v = tf.assign(v, tf.sub(u,v)) # v = u - v

init = tf.initialize_all_variables()

with tf.Session() as sess:
    sess.run(init)
    for i in range(100):
        print(i, sess.run(v))
        sess.run(update_u)
        sess.run(update_v)

説明

定義の値の更新の代入にはtf.assignを使う。足し算(tf.add)、引き算(tf.sub)を使う。 https://www.tensorflow.org/versions/0.6.0/api_docs/python/state_ops.html#assign

update_u = tf.assign(u, tf.add(u,v)) # u = u + v
update_v = tf.assign(v, tf.sub(u,v)) # v = u - v

セッションの最初に変数を初期化する必要がある。これには、init = tf.initialize_all_variablesを使う。sess.run(init)にて初期化を実行する。

init = tf.initialize_all_variables()

sess.run(init)

sess.runにより値を取ったり、手続きを実行したりします。

print(i, sess.run(v)) #値の取得
sess.run(update_u)   #定義の実行
sess.run(update_v)   #定義の実行

最後に

モデルを定義してから実行するというのが、今までの習っていたプログラムと違うので、慣れる必要がありますね。 mirai-tec.hatenablog.com

TensorFlowコトハジメ 概要

はじめに

静岡Developers勉強会では、今年の勉強会のテーマとして「人工知能ハンズオン」を2016/4/23に開催します。
これまでインストール記事ばかりで中身が書けていなかったので、概要から書いていきます。

TensorFlowとは

読み方は「テンソルフローテンサーフロー」となります。【2017/02/18 訂正】googleの中の人がテンサーフローと呼んで欲しい
Googleが2015年11月10日に公開したオープンソース多層NN(ディープラーニング)に特化したライブラリで現状C++/PythonでのAPIが存在しています。
Tensor(テンソル)のFlow(流れ)で状態記述します。

ディープラーニングやマシーンラーニングの使いやすいライブラリが整ってはいるものの、それらに特化したフレームワークではなく、多次元配列に入る数字を非常に高速に計算するための汎用のHPCフレームワークとしても使うことができます。

Tensor(テンソル)とは

テンソル(英: tensor, 独: Tensor)とは、 線形的な量または線形的な幾何概念を 一般化したもので、基底を選べば、多次元の配列として表現できるようなものである。 Wikipedia

乱暴に言えば多次元配列に相当する

  • 添え字のついた変数(配列)
    { X_{ij} } { Z_{ijk} }
  • スカラー、ベクトル、行列の一般名

f:id:Yaju3D:20160417104606p:plain

テンソルデータ例

  • 濃淡画像  ・・・ 2階のテンソル
  • カラー画像 ・・・ 3階のテンソル(RGB x 濃淡画像)
  • カラー動画 ・・・ 4階のテンソル(フレーム x カラー画像)

可視化する限度は3階までが限界
f:id:Yaju3D:20160417031730p:plain
図1: ユーザ × 商品 × 時間の3階テンソルとして表現された購買データ
テンソルというのはテーブル形式のデータを多次元に拡張したもので、例えば、複数のユーザがいくつかの種類の商品をある時刻に購入したという購買データを考えるとユーザ × 商品 × 時間の3階テンソルとして表現することができます。

また、テンソルとはごく簡単にいえば「任意座標系で表した量」ということになります。図1だと、購入商品(item)の3個(Qty)が量となります。

f:id:Yaju3D:20160417025250p:plain
他にも2次元画像をRGBに分解して、任意座標のピクセル値(R * 2562 + G * 256 + B)が量となります。

Tensor(テンソル)の計算

高校の数学で行列同士の計算(加算、減算、積、商(逆行列))を習いますが、テンソル同士も行列と同じように計算することが出来ます。計算方法はここでは説明しません。 参照:TensorFlow APIドキュメントを眺める -Math編-

計算例 [1.1.1.1.]+[2.2.2.2.]=[3.3.3.3.]

import tensorflow as tf

with tf.Session():
  input1 = tf.constant([1.0, 1.0, 1.0, 1.0])
  input2 = tf.constant([2.0, 2.0, 2.0, 2.0])
  output = tf.add(input1, input2)
  result = output.eval()
  print(result)

#[ 3.  3.  3.  3.]
畳み込み演算とは?

「畳む」…複数ヶ所(連続的)から値を持ってくる
「込む」…積算する
掛け算の結果を足し集める演算からなり、大量な計算が必要になることからコンピュータ処理の得意とするところです。
数学用語ではコンボリューション(Convolution)といいます。

畳み込み演算の簡単な例として、画像処理ソフトウェアで画像を「ぼかす」フィルターをかける場合を考えます。これは、画像の各ピクセルにおいて、その部分の色をその周りのピクセルの色とまぜて平均化した色に置き換えれば実現できます。その際の掛け算の係数は、3×3などのサイズのマトリックスで指定します。参照:空間フィルタリング処理 f:id:Yaju3D:20160417025351p:plain 3×3サイズのマトリックスを1ピクセルずらしながら演算する。
f:id:Yaju3D:20160417025404g:plain
畳み込み結果の画像が入力サイズより一回り小さくなります。もし同サイズにしたい場合には外側に「ふち」をつけて大きくします。
「ふち」の部分の画素は未定なので何らかの方法(最周囲の画素等)で決める必要があります。

TensorFlowの計算処理

テンソルを計算するには、かなりの計算量が必要となります。CPUが複数あれば並列で計算させることで結果が速く出せますし、GPUを使えば多くの計算結果が速く導くことが可能となります。またクラウドを使って、1台ではなく複数台のコンピューターに分散させればそれだけ速く計算結果を求めることが出来るのです。
そのために、TensorFlowは計算処理を「データフローグラフ」(以降 略:グラフ(Graph))構造で表します。

グラフとは

グラフはノード(Node)といわれる計算ブロックのようなものをエッジ(edge)といわれる線で繋げたもので、データはノードからノードへ、エッジのつながり方に従って受け渡され、計算が行われます。 f:id:Yaju3D:20160417025430p:plain

Opノード

TensorFlowではノードは「op」(operation:計算操作の略)と言われます。 f:id:Yaju3D:20160417025458p:plain

セッション

グラフはセッションに割り当てて計算を行います。セッションは、計算可能になったノード(エッジから送られてくる計算結果がすべてそろったノード)を非同期/並列に計算していきます。
計算に際しては、どのデバイス(cpu/gpu)で行うのかの割振りも行います。 f:id:Yaju3D:20160417025520p:plain

計算方法

TensorFlowでは計算処理は2フェイズ(Define & Run)で行います。

  • Define(定義)
    計算のグラフモデルを構築するフェイズで、この時点では計算結果は確定しない
  • Run(実行)
    グラフモデルから計算結果を確定するフェイズでセッション(Session)にモデルを投入し、計算結果を得る
TensorFlowによる計算プログラム

Pythonの通常の計算プログラム

x = 35
y = x + 5
print(y)

TensorFlowで同じように計算プログラム

import tensorflow as tf

x = tf.constant(35, name='x')
y = tf.Variable(x + 5, name='y')

print(y)

これを実行するとエラー<tensorflow.python.ops.variables.Variable object at 0x7f074bfd9ef0>になります。
これはモデルを定義しただけでは計算が出来ないためです。
計算処理は2フェイズ(Define & Run)する必要があり修正したのが下記となります。

import tensorflow as tf

x = tf.constant(35, name='x')
y = tf.Variable(x + 5, name='y')

# 変数を初期化するための OP を追加します。
model = tf.initialize_all_variables()

with tf.Session() as session:
    session.run(model)
    print(session.run(y)

実際にデータを処理するにはtf.Sessionを使います。セッションの最初に変数を初期化する必要があり、これには「tf.initialize_all_variables」を使います。
これにより計算結果「40」が表示されます。
参照:http://learningtensorflow.com/lesson2/

参照

テンソル分解の基礎と 画像・信号処理への応用 - SlideShare
TensorFlowで遊んでみよう! - SlideShare
Generalization of Tensor Factorization and Applications SlideShare
Bci deep learning_juas - SlideShare
第13回助教の会
コンボリューションを用いた画像の平滑化、鮮鋭化とエッジ検出
Image Scaling using Deep Convolutional Neural Networks
How common is it for neural networks to be represented by tensors of rank 3 or greater?
TensorFlow Tutorialの数学的背景 − Deep MNIST for Experts(その1)- めもめも
4.たたみ込み演算による画像処理
TensorFlowを算数で理解する
TensorFlowのキーコンセプト: Opノード、セッション、変数

WindowsユーザーがTensorFlowをインストールしてみた(AWS EC2 Docker版)

はじめに

静岡Developers勉強会では「人工知能ハンズオン」を2016/4/23に開催します。自PC(Windows 10 Home 64bit)にDockerを使ってGoogleが提供しているオープンソース人工知能ライブラリ「TensorFlow」を入れて動かすことが出来たのですが、Dockerって64bit版のみで32bit版がありません。
勉強会なので32bit PCしか持っていない人をどうしようかと思ったら、あるじゃないですか? そう、クラウドならね。

環境

1年間の無料枠で構築

  • Amazon Linux AMI 2016.03 (HVM), SSD Volume Type 64ビット
  • t2.micro

AWS EC2の登録

AWS EC2の登録は長くなるので別記事にしました。DockerとTensorFlowの導入まで記事がかぶってますが・・・ qiita.com

Dockerのインストール

下記サイトを参考にDockerをインストールしました。
EC2にDockerをインストールしてNginxコンテナを作る

Dockerをインストール

sudo yum install -y docker

Dockerを起動

$ sudo service docker start
Starting cgconfig service:                                 [  OK  ]
Starting docker:

ec2-userをdockerグループに追加

$ sudo usermod -a -G docker ec2-user
$ cat /etc/group |grep docker
docker:x:497:ec2-user

グループに追加されていることを確認したら、一度ログアウト(exit)して再度ログインしてください。

dockerグループに所属していれば、sudoなしで ec2-userから Dockerコマンドが使えます。

docker info
  ︙
Kernel Version: 4.4.5-15.26.amzn1.x86_64
Operating System: Amazon Linux AMI 2016.03

DockerにTensorFlowのインストール

TensorflowのサイトのDocker installationにインストールする方法が記載されています。ポートは指定しました。

$ docker run -p 8888:8888 -p 6006:6006 b.gcr.io/tensorflow/tensorflow
         ︙
[I 08:48:55.427 NotebookApp] The Jupyter Notebook is running at: http://[all ip
addresses on your system]:8888/
[I 08:48:55.427 NotebookApp] Use Control-C to stop this server and shut down all
 kernels (twice to skip confirmation).

記載のコマンドを入力するとtensorflowがインストールされていきます。
WebブラウザでdefaultマシンのIPアドレスにポート番号8888を付ければ、Notebook(Jupyter)が動作するとなっています。

Jupyter Notebookの起動

Webブラウザで「http:(パブリックIP):8888/」と入力するとJupyter Notebookが起動されました。
AWS EC2のパブリックIPを指定して下さい。

TensorFlowのサンプル確認

DockerのTensorFlowには、下記のサンプルが最初から用意されています。

  • 1_hellow_tensorflow.ipynb
  • 2_getting_started.ipynb
  • 3_minst_from_scratch.ipynb

※DockerのTensorflowはPython2用となります。

f:id:Yaju3D:20160407003301p:plain

TensorBoradの確認

yaju3d.hatenablog.jp

このサイトの「TensorBoardによる可視化」にあるソースを入力します。
※その上にあるdef x2_plus_b(x, b)関数も入力が必要です。

f:id:Yaju3D:20160407003353p:plain

実行するとlogフォルダが作成されます。 次に右横の「New」で「Terminal」を作成します。

f:id:Yaju3D:20160407003452p:plain

Terminalにて、下記コマンドを入力します。

# tensorboard --logdir=log                                                                                                                                    

f:id:Yaju3D:20160407003516p:plain

これでWebブラウザで「http:(パブリックIP):6006/」と入力すると「TernsorBorad」が表示されます。 f:id:Yaju3D:20160407004805p:plain

※最初にグラフが「No scalar summary tags were found.」のエラーで表示されなかったのですが、Dockerをリスタートしたら表示されるようになりました。

$ docker ps
CONTAINER ID        IMAGE                            COMMAND             CREATED             STATUS              PORTS                                            NAMES
cea774063516        b.gcr.io/tensorflow/tensorflow   "/run_jupyter.sh"   31 hours ago        Up 31 hours         0.0.0.0:6006->6006/tcp, 0.0.0.0:8888->8888/tcp   thirsty_kare
$ docker stop thirsty_kare
$ docker start thirsty_kare

TensorBoradの停止

Runningタブにて該当Terminalの「Shutdown」ボタンをクリックすれば停止します。 f:id:Yaju3D:20160407003537p:plain

WindowsユーザーがTensorFlowをインストールしてみた(Docker版)

はじめに

静岡Developers勉強会では、今年の勉強会のテーマとして「人工知能ハンズオン」を2016/4/23に開催します。 以前、TensorFlowを自PC(Windows 10 64bit)にインストールした記事を書きました。 yaju3d.hatenablog.jp

ですが初心者の人には敷居が高いかと思い、もっと簡単な方法がないか模索していました。
ネットで「Tensorflow Windows インストール」で検索すると、Dockerなら簡単だよというのが見つかるのですが、Dockerってクラウドで使うものだと思い込んでいたために見逃していました。
Dockerを調べるとクラウドでなくても使えることが理解できたので、今回Dockerを使ってのTensorflowのインストールに挑戦してみました。

※Dockerを使用するにはPCが64bitである必要があります。

qiita.com

環境

  • Windows 7 Professional 64bit
  • DockerToolbox 1.10.3
  • VirtualBox 5.0.16

DockerToolboxのインストール

DockerのオフィシャルサイトのDocker ToolboxからDocker Toolboxのインストーラを入手します。このインストーラにはVirtualBoxやGit for Windowsが同梱されてます。

自分はチェックボックスなど気にせずデフォルト状態のままインストールしました。

Docker用の仮想マシンを構築

Docker Quickstart Terminalを起動します。初回のみVirtualBox上にDocker用の仮想マシン(default)を生成します。 その後、Dockerエンジンが動作しているDockerホストの仮想マシンに接続されます。 VirtualBoxを開くとdefaultインスタンスが出来ていることが確認できます。

自PCのWindows 10 Home 64bitではDocker Quickstart Terminalでエラーになりました。その顛末は下記ブログに書いています。 qiita.com

Dockerの動作確認

$ docker-machine ls
NAME      ACTIVE   DRIVER       STATE     URL                         SWARM   ERRORS
default   *        virtualbox   Running   tcp://192.168.99.101:2376

URLにあるIPアドレスは後で入力するので覚えて置いてください。
ちなみにIPアドレスだけを知りたい場合は下記となります。

$ docker-machine ip
192.168.99.100

DockerにTensorFlowのインストール

TensorflowのサイトのDocker installationにインストールする方法が記載されています。

$ docker run -it b.gcr.io/tensorflow/tensorflow
         ︙
[I 08:48:55.427 NotebookApp] The Jupyter Notebook is running at: http://[all ip
addresses on your system]:8888/
[I 08:48:55.427 NotebookApp] Use Control-C to stop this server and shut down all
 kernels (twice to skip confirmation).

記載のコマンドを入力するとtensorflowがインストールされていきます。説明の通りだとWebブラウザでdefaultマシンのIPアドレスにポート番号8888を付ければ、Notebook(Jupyter)が動作するとなっています。

自分はこの通りに入力したのですが、Webブラウザで「http:192.168.99.100:8888/」を入力しても、「このサイトにアクセスできません」のエラーでどうすることも出来なかったため、Control-Cを押すしかありませんでした。

Jupyter Notebookの起動

ネットで調べるとポートを指定するようなことが書かれていました。
How do I start tensorflow docker jupyter notebook

$ docker run -p 8888:8888 -p 6006:6006 b.gcr.io/tensorflow/tensorflow
         ︙
[I 08:48:55.427 NotebookApp] The Jupyter Notebook is running at: http://[all ip
addresses on your system]:8888/
[I 08:48:55.427 NotebookApp] Use Control-C to stop this server and shut down all
 kernels (twice to skip confirmation).

これでWebブラウザで「http:192.168.99.100:8888/」と入力するとJupyter Notebookが起動されました。
※IPアドレスは、Dockerの動作確認した際のURLとなります。

TensorFlowのサンプル確認

DockerのTensorFlowには、下記のサンプルが最初から用意されています。

  • 1_hellow_tensorflow.ipynb
  • 2_getting_started.ipynb
  • 3_minst_from_scratch.ipynb

※DockerのTensorflowはPython2用となります。

f:id:Yaju3D:20160407003301p:plain

TensorBoradの確認

yaju3d.hatenablog.jp

このサイトの「TensorBoardによる可視化」にあるソースを入力します。
※その上にあるdef x2_plus_b(x, b)関数も入力が必要です。

f:id:Yaju3D:20160407003353p:plain

実行するとlogフォルダが作成されます。 次に右横の「New」で「Terminal」を作成します。

f:id:Yaju3D:20160407003452p:plain

Terminalにて、下記コマンドを入力します。

# tensorboard --logdir=log                                                                                                                                    

f:id:Yaju3D:20160407003516p:plain

これでWebブラウザで「http:192.168.99.100:6006/」と入力すると「TernsorBorad」が表示されます。 f:id:Yaju3D:20160407004805p:plain

TensorBoradの停止

Runningタブにて該当Terminalの「Shutdown」ボタンをクリックすれば停止します。 f:id:Yaju3D:20160407003537p:plain

ホストとファイル共有

Dockerはプロセス内にコンテナを生成するので、コンテナ内にファイルを保存してもPC再起動等でプロセスが消えるとコンテナも破棄されます。下記方法でホスト側のフォルダをマウントしておくことでコンテナが破棄されてもファイルが消えることがなくなります。

ホスト側(C:\Users(ユーザー名))の配下に「tensor_share」フォルダ(例)を作成したとします。

$ docker run -d -p 8888:8888 -p 6006:6006 -v /c/Users/(ユーザー名)/tensor_share:/notebooks b.gcr.io/tensorflow/tensorflow

PWDコマンドを使うとカレントディレクトリを取得できます。

$ echo $PWD
/c/Users/(ユーザー名)

$ docker run -d -p 8888:8888 -p 6006:6006 -v $PWD/tensor_share:/notebooks b.gcr.io/tensorflow/tensorflow

qiita.com

WindowsユーザーのTensorFlowことはじめ

はじめに

静岡Developers勉強会では、今年の勉強会のテーマとして「人工知能ハンズオン」を予定しています。
前記事にて、自PCに「TensorFlow」をインストールしてみました。
インストールしただけで、「TensorFlow」がどういったものなのかをまったく理解出来ていません。
ネットで検索した幾つかのサイトを参考にこれから理解していこうと思います。

Pythonの入門として、勉強会仲間であるUsekさんの記事を参考にするといいでしょう。
qiita.com

エディタについて

TensorFlowはPythonを使ってプログラムしていくのですが、エディタが無いことにはプログラムを組みにくいですよね。
以前、静岡Developers勉強会で「実践コンピュータービジョン」を行った際、Python向け統合環境(IDE)の「PyCharm」を使っていました。
その後、もう少し手軽なものとして「IPython Notebook」というPythonのコードを含んだWebページを作成できるものを教わったので、今回はこちらを使用していきます。

IPython Notebookは、その後に多言語対応したこともあって、「Jupyter」という名前に変更されていました。

Jupyter Notebook(IPython)のインストール

下記サイトを参考に「Jupyter Notebook」をインストールしました。
www.task-notes.com

※Anacondaでは最初からインストール済みなんですが、自分はTensorFlow専用の環境(tensorenv)を作成しているため、インストールする必要がある。

tensorenvの環境を有効にしてから、pipコマンドでインストール

$ source activate tensorenv

(tensorenv)$ pip install jupyter 

Jupyterの起動

(tensorenv)$ jupyter notebook

Webブラウザが起動しますので、そこからanaconda3/envs/tensorenvフォルダまで移動させます。
f:id:Yaju3D:20160327185255p:plain

更にtensorenvフォルダ配下に移動して、右横の「New」で新規ファイルを「Python 3」で作成します。
f:id:Yaju3D:20160327192015p:plain

それでは、下記サイトの演算を実際に実行してみましょう。
qiita.com

では、実際にTensorFlowを使って計算してみます。最初は、以下の式を書いてみます
y = x^2 + b

import tensorflow as tf

def x2_plus_b(x, b):
    _x = tf.constant(x)
    _b = tf.constant(b)
    result = tf.square(_x)
    result = tf.add(result, _b)
    return result

print resultではエラーとなったため、print(result)に修正しました。

with tf.Session() as sess:
    result = sess.run([x2_plus_b(2., 3.)])
    print(result)

実行結果(printの出力)は以下のようになります。
2^2 + 3 = 7 なので、きちんと計算できていることがわかります。
f:id:Yaju3D:20160327205925p:plain

TensorBoardによる可視化

TensorFlowには、TensorBoardという強力なビジュアライゼーションツールが付いている点も特徴の一つになっています。

先ほどの続きとして下記ソースを入力します。

import tensorflow as tf

def monitor_calculation(x, b):
    title = "b = {0}".format(b)
    c = x2_plus_b(float(x), float(b))
    s = tf.scalar_summary(title, c)
    m = tf.merge_summary([s])  # if you are using some summaries, merge them
    return m

with tf.Session() as sess:
    writer = tf.train.SummaryWriter("log", graph_def=sess.graph_def)    
    xaxis = range(-10, 12)

    for b in range(3):
        for x in xaxis:
            summary_str = sess.run(monitor_calculation(x, b))
            writer.add_summary(summary_str, x)

これを実行すると、ログがフォルダ(/home/yaju/anaconda3/envs/tensorenv/log)に出力されます。
f:id:Yaju3D:20160327225938p:plain

Jupyterの停止

TensorBoardのコマンドはターミナルで行うので、Jupyterの停止する必要があります。
停止するには、ターミナルにて「Ctrl + C」キーを押します。

追記 2016/04/07
Jupyterの右横にある「New」に「Terminal」がありました。
これを使えば、Jupyterを停止する必要はありません。

TensorBoardの実行

logdirには絶対パスを指定します。

(tensorenv)$ tensorboard --logdir=/home/yaju/anaconda3/envs/tensorenv/log

Starting TensorBoard  on port 6006
(You can navigate to http://0.0.0.0:6006)

Webブラウザにて、下記URLを入力します。

localhost:6006

f:id:Yaju3D:20160327231243p:plain

今回はここまでとします。

WindowsユーザーがTensorFlowをインストールしてみた

はじめに

静岡Developers勉強会では、今年の勉強会のテーマとして「人工知能ハンズオン」を予定しています。
人工知能ハンズオンとして、Googleが提供しているオープンソースの人工知能ライブラリ「TensorFlow」の使い方を学ぶという方向にでもしようかな。
とりあえずセッションを担当する自分が現状では何も分かっていない状態ですので、先ずは「TensorFlow」を自PCにインストールしてみました。

TensorFlow Ver 0.12でWindowsがサポートされましたので、記事を作成しました。
yaju3d.hatenablog.jp

もはやLinux版の環境が古くなったため、新しく記事を作成しました。
yaju3d.hatenablog.jp

インストールがお手軽なDocker版も一緒にお読み下さい。
yaju3d.hatenablog.jp

アクセス解析をみると「tensorflow 32bit版」があったので下記サイトをリンクしておきます。
TensorFlowを32bit-Ubuntuにインストールした時のメモ | Workpiles

環境

  • Windows 10 Home 64bit
  • Oracle VM VirtualBox 5.0.16

インストール準備

残念ながら、「TensorFlow」はLinux版とMac版しか用意されていません。
Windows PCをお持ちの方は、仮想PCにLinuxを入れて使用するということになります。

ちなみに、Python数値計算環境「Anaconda」のWindows版を入れれば動くかもと、「TensorFlow」をインストールしようとしましたが、Linux版やMac版のどちらを入れても、「not supported」エラーとなりました。AnacondaのWindows版はあくまでWindows上として動作するためでした。

VirtualBoxにUbuntu(64bit)をインストール

下記サイトを参考にVirtualBoxにUbuntu 14.04.2 LTSをインストールしました。
サイトとの違いとして、メモリは2048MByte、仮想ハードドライブサイズは40GByteにしています。
ottan.xyz

このままでは画面サイズは640x480と狭いので、下記サイトを参考に画面サイズを変更します。
opensourcetech.hatenablog.jp

インストール時のエラー

Ubuntu(64bit)を入れようとするとPCによっては下記のエラーが出ます。
「This kerner requures an X86-64 CPU, but only detected an i686 CPU」
これはVirtualBoxのUbuntu 32bit用に64bit版をインストールしようとしたためです。
何故、VirtualBoxにUbuntu 64bit用がリストに表示されないのかというと、PCのBIOSの仮想化機能が有効になっていないためです。有効にするためには、BIOSの設定(Lenovoでは再起動時にF1キーを押す等)で、Security→Vitualizationを「Enabled」にして保存後に再起動する必要があります。

クリップボードの共有

Ubuntuのインストールが完了したら、VirtualBoxメニューのデバイスの「クリップボードの共有」を双方向にしておくとWindowsのクリップボードを貼り付け出来たりして便利です。また、「ドラッグ&ドロップ」も同様に双方向にするといいでしょう。

ターミナルの起動

Ubuntuを使うのは初めてだったので、何をどうすればいいのかちょっと迷いました。
先ずはWindowsのコマンドプロンプトのようなのを起動する必要があります。
Ubuntuの左横のパネルメニューから「コンピューターとオンラインリソースの検索」をクリックします。
検索ボックスで「terminal」を入力すると「端末」(ターミナル)が出てきますのでクリックします。

pipのインストール

ターミナルが起動したら、最初に「pip」をインストールして下さい。
pipとは、Pythonで書かれたパッケージソフトウェアをインストール・管理するためのパッケージ管理システムです。RubyのRubyGemsやPerlのCPANやWindowsのNuGetといったところです。
ターミナル上で下記のコマンドを入力します。

$ sudo apt-get install python-pip

※$より前の部分は自分の環境では「yaju@yaju-VirtualBox:~$」です。これはインストール環境によって変わります。説明する上で便宜上省略しています。

Python数値計算環境「Anaconda」のLinux版をインストール

AnacondaとはPythonの数値計算環境を構築するために様々なパッケージをまとめた無料のディストリビューションです。
Anacondaをインストールをすると、NumPy,SciPy,matplotlib、scikit-learn等のパッケージがインストールされます。

Ubuntu上のWebブラウザ「FireFox」で下記サイトからAnaconda for Linux PYTHON 3.5 LINUX 64-BITをダウンロードしてください。ファイルの保存先は「ダウンロード」にしました。
https://www.continuum.io/downloads

※Python2.7ではなくPython3.5にしたのは、サイト「http://learningtensorflow.com/lesson1/」を参考にしたためです。

ターミナル上で「bash 」と入力したら、Ubuntuの左横のパネルメニューから「ファイル」からダウンロードフォルダにある「Anaconda3-2.5.0-Linux-x86_64.sh」をドラッグ&ドロップしました。引用符は付いたままでもいいかも知れませんが、一応消しました。

$ bash /home/yaju/ダウンロード/Anaconda3-2.5.0-Linux-x86_64.sh

AnacondaのTensorflow用環境を作成

Anacondaのインストールが終わったら、一旦ターミナルを閉じて下さい。
これはTensorflow用環境を作成する際に使用する「conda」コマンドがまだ有効になっていないためです。

Tensorflow用環境を作成するため、ターミナル上で下記のコマンドを入力します。
サイト「http://learningtensorflow.com/lesson1/」と一緒にするため、名前は「tensorenv」にしました。envは環境(environment)の略称

$ conda create --name=tensorenv python=3.4

環境が作成されていきます、途中のProceedの確認は「y」を入力します。

Proceed ([y]/n)? y

Fetching packages ...
openssl-1.0.2g 100% |################################| Time: 0:00:08 383.49 kB/s
xz-5.0.5-1.tar 100% |################################| Time: 0:00:03 174.33 kB/s
python-3.4.4-0 100% |################################| Time: 0:00:37 430.92 kB/s
setuptools-20. 100% |################################| Time: 0:00:01 268.10 kB/s
wheel-0.29.0-p 100% |################################| Time: 0:00:00 133.57 kB/s
pip-8.1.1-py34 100% |################################| Time: 0:00:04 376.02 kB/s
Extracting packages ...
[      COMPLETE      ]|###################################################| 100%
Linking packages ...
[      COMPLETE      ]|###################################################| 100%

以下のコマンドで作った環境の一覧を表示できます。

$ conda info -e

Using Anaconda Cloud api site https://api.anaconda.org
# conda environments:
#
tensorenv                /home/yaju/anaconda3/envs/tensorenv
root                  *  /home/yaju/anaconda3

作成した環境を有効にするには下記のコマンドを入力します。

$ source activate tensorenv

これで先頭に「(tensorenv)」が付くようになります。

(tensorenv)$

pipのバージョン確認

TensorFlowをインストールしようした際、pipのバージョン 8.1.1でないと下記のエラーが表示されます。

You are using pip version 8.0.2, however version 8.1.1 is available.
You should consider upgrading via the 'pip install --upgrade pip' command.

下記のコマンドでpipのバージョンが確認できます。

(tensorenv)$ pip -V

もし、pipのバージョン 8.1.1でない場合、下記のコマンドでpipをアップグレードします。

(tensorenv)$ pip install --upgrade pip

※tensorenvの環境を有効にしないまま、TensorFlowをインストールしようとしたからpipのバージョン 8.0.2のままだったのかも。tensorenvの環境を有効にしたなら、pipのバージョン 8.1.1がインストールされているはず。

TensorFlowのインストール

TensorFlowには、「CPU only」と「GPU enabled」の2種類が用意されています。今回は「CPU only」版をインストールします。
ファイル名はPython34にしているので「tensorflow-(version No)-cp34」となります。ちなみにPython27は「cp27」です。
バージョンは現時点(2016/03/27)で最新の「0.7.1」を入れます。
入力が長いのでクリップボードにコピーして貼り付ければいいです。

(tensorenv)$ pip install --upgrade https://storage.googleapis.com/tensorflow/linux/cpu/tensorflow-0.7.1-cp34-none-linux_x86_64.whl

Building wheels for collected packages: numpy あたりで10分程度かかりました。

Collecting tensorflow==0.7.1 from https://storage.googleapis.com/tensorflow/linux/cpu/tensorflow-0.7.1-cp34-none-linux_x86_64.whl
  Downloading https://storage.googleapis.com/tensorflow/linux/cpu/tensorflow-0.7.1-cp34-none-linux_x86_64.whl (13.8MB)
    100% |████████████████████████████████| 13.8MB 36kB/s 
Requirement already up-to-date: wheel>=0.26 in ./anaconda3/envs/tensorenv/lib/python3.4/site-packages (from tensorflow==0.7.1)
Collecting numpy>=1.8.2 (from tensorflow==0.7.1)
  Downloading numpy-1.10.4.tar.gz (4.1MB)
    100% |████████████████████████████████| 4.1MB 79kB/s 
Collecting six>=1.10.0 (from tensorflow==0.7.1)
  Downloading six-1.10.0-py2.py3-none-any.whl
Collecting protobuf==3.0.0b2 (from tensorflow==0.7.1)
  Downloading protobuf-3.0.0b2-py2.py3-none-any.whl (326kB)
    100% |████████████████████████████████| 327kB 315kB/s 
Collecting setuptools (from protobuf==3.0.0b2->tensorflow==0.7.1)
  Downloading setuptools-20.3.1-py2.py3-none-any.whl (508kB)
    100% |████████████████████████████████| 512kB 276kB/s 
Building wheels for collected packages: numpy
  Running setup.py bdist_wheel for numpy ... done
  Stored in directory: /home/yaju/.cache/pip/wheels/66/f5/d7/f6ddd78b61037fcb51a3e32c9cd276e292343cdd62d5384efd
Successfully built numpy
TensorFlowのインストールエラー

途中で下記のエラーが発生してインストールが止まります。

Installing collected packages: numpy, six, setuptools, protobuf, tensorflow
Found existing installation: setuptools 20.3
Cannot remove entries from nonexistent file /home/yaju/anaconda3/envs/tensorenv/lib/python3.4/site-packages/easy-install.pth

これは、パッケージの依存関係のコンフリクトっぽいので対象パッケージをremoveしてから再度Tensorflowをインストールします。

conda remove -n tensorenv setuptools

途中のProceedの確認は「y」を入力します。

Using Anaconda Cloud api site https://api.anaconda.org
Fetching package metadata: ....

Package plan for package removal in environment /home/yaju/anaconda3/envs/tensorenv:

The following packages will be REMOVED:

    setuptools: 20.3-py34_0

Proceed ([y]/n)? y

Unlinking packages ...
[      COMPLETE      ]|###################################################| 100%
TensorFlowの再インストール

コマンド入力したのは履歴が残っていますので、矢印の上キーを入力すると楽です。

(tensorenv)$ pip install --upgrade https://storage.googleapis.com/tensorflow/linux/cpu/tensorflow-0.7.1-cp34-none-linux_x86_64.whl

setuptoolsのコンフリクトを解消させてからTensorFlowのインストールすれば再インストールする必要はないんですが、既にインストールされている部分は飛ばすので時間はかかりません。

Collecting tensorflow==0.7.1 from https://storage.googleapis.com/tensorflow/linux/cpu/tensorflow-0.7.1-cp34-none-linux_x86_64.whl
  Using cached https://storage.googleapis.com/tensorflow/linux/cpu/tensorflow-0.7.1-cp34-none-linux_x86_64.whl
Requirement already up-to-date: wheel>=0.26 in ./anaconda3/envs/tensorenv/lib/python3.4/site-packages (from tensorflow==0.7.1)
Requirement already up-to-date: numpy>=1.8.2 in ./anaconda3/envs/tensorenv/lib/python3.4/site-packages (from tensorflow==0.7.1)
Requirement already up-to-date: six>=1.10.0 in ./anaconda3/envs/tensorenv/lib/python3.4/site-packages (from tensorflow==0.7.1)
Collecting protobuf==3.0.0b2 (from tensorflow==0.7.1)
  Using cached protobuf-3.0.0b2-py2.py3-none-any.whl
Collecting setuptools (from protobuf==3.0.0b2->tensorflow==0.7.1)
  Using cached setuptools-20.3.1-py2.py3-none-any.whl
Installing collected packages: setuptools, protobuf, tensorflow
Successfully installed protobuf-3.0.0b2 setuptools-20.3.1 tensorflow-0.7.1

TensorFlowの動作確認

バージョンが表示されればインストール成功です。

(tensorenv)$python -c "import tensorflow; print(tensorflow.__version__);"

0.7.1

これでやっとTensorFlowを始められます。

Σ(シグマ)の数式を理解してみる

Σ(シグマ)って何

高校2年生頃に数列としてΣ(シグマ)という数式を習います。
例えば、1からnまでの数列の総和を求めなさいといった場合、下記のよう数式になります。
1+2+3+\cdots+n
\displaystyle \sum_{k=1}^{n}{a_{k}}=\Large a_1+a_2+a_3+\cdots+a_n

このくらいは簡単に理解できますね。
ちなみに、1からnまでの数列の総和は下記の公式で簡単に求めることが出来ます。
\displaystyle \sum_{k=1}^{n}{{k}}=\frac1{2}n(n+1)
参照:ガウスの少年時代の逸話

あと、足し算ではなく掛け算の場合、Π(パイ)という数式を使います。
1 \times 2 \times 3 \times \cdots+n
\displaystyle \prod_{k=1}^{n}{a_{k}}=\Large a_1 \times a_2 \times a_3 \times \cdots \times a_n
でも、掛け算の場合は対数にして掛け算を足し算に変換するため、Σ(シグマ)にすることが多いです。

Σ(シグマ)の意味

Σの意味は「合計」です。英語で言えば、「sum」です。
そして、Σは「シグマ」と読むギリシャ文字(σの大文字)で、英語のアルファベットの「S」(sの大文字)に相当します。
ですから、頭文字としてΣが使われます。

Σ(シグマ)の入門

世間的にはビッグデータを活用しようと統計学を学ぶ機会が増えてきました。
幾つかのデータの総和と平均値を求める数式を作成してみます。
データを x_1, x_2, x_3,\cdots,x_nとした場合、
合計値 \Large S_n = \displaystyle \sum_{i=1}^{n}{{x_i}}=\Large x_1+x_2+x_3+\cdots+x_n
平均値 \Large \bar{x} =\displaystyle {1 \over n} \sum_{i=1}^{n} x_i

ここで急に変数を k から i に変更しましたが、これは好みの問題です。
公式では変数は k なのですが、プログラムを組む側とすると繰り返し変数は i の方が馴染みやすいというだけです。
qiita.com

Σ(シグマ)の応用

統計学で急に難しく感じるのは標準偏差ですよね。数式も急に複雑に感じます。
標準偏差 \sigma = \sqrt{\displaystyle {1 \over n} \sum_{i=1}^n(x_i - \bar{x})^2 }

これを紐解いていきます。自分は自身の学習のためにこれから書いていきますが、標準偏差については図入りで分かりやすい下記サイトを見るといいでしょう。
qiita.com

標準偏差の数式の中身を分解していきます。
(x_i - \bar{x})
これは何をしているかというと、各データ(x_i)と平均値(\bar{x})の差を求めています。
これを「偏差」といいます。※平均値(\bar{x})については、Σ(シグマ)の入門のところで数式を求めましたよね。

先ほどのQiitaのサイトのデータを拝借してみます。
各IDの数学の点数から平均値の81を減算します。

ID 点数 偏差
1 96 96-81= 15
2 63 63-81= -18
3 85 85-81= 4
4 66 66-81= -15
5 91 91-81= 10
6 89 89-81= 8
7 77 77-81= -4

次に進みます。
\displaystyle \sum_{i=1}^n(x_i - \bar{x})^2
これは、先程の偏差をそれぞれ2乗して総和を求めます。

ID 偏差 偏差^2
1 15 15^2 = 225
2 -18 -18^2 = 324
3 4 4^2 = 16
4 -15 -15^2= 225
5 10 10^2 = 100
6 8 8^2 = 64
7 -4 -4^2 = 16

総和は 225+324+16+225+100+64+16 = 970 となります。

ちなみに2乗しないまま総和すると、15-18+4-15+10+8-4 = 0と値が 0 になってしまいます。
2乗することで負数がなくなりすべて正数になります。
単純に正数にするなら絶対値でいいのではないかという疑問がわくと思います。余談ですが、実際「平均偏差」の場合は絶対値を使っています。
rikunora.hatenablog.com

ここは、ピタゴラスの定理(三平方の定理)を思い出して欲しいのです。直角三角形の斜辺の長さを求めるには\sqrt{x^2 + y^2}
つまり、「データのばらつきとは、平均点からの距離を表している」のです。そのため2乗するわけです。
f:id:Yaju3D:20160228160455j:plain

機械学習を学ぶ時に2乗誤差が出てきます。2乗なら簡単に微分できるのですが、絶対値の微分は面倒だったりします。その点でも2乗するのは利点があります。

次に進みます。
\displaystyle {1 \over n} \sum_{i=1}^n(x_i - \bar{x})^2
これは単純ですね。先ほど求めた2乗の総和の平均を求めるためです。
この平均からの偏差を二乗したものを足し合わせて平均を取ったものを「分散」と言います。
分散は、  970 / 7 = 138.571428

最後の標準偏差の数式に戻りました。
\sigma = \sqrt{\displaystyle {1 \over n} \sum_{i=1}^n(x_i - \bar{x})^2 }
分散で求めた値をルートした結果が標準偏差となります。
ちなみに、ルート √ は二乗したらその値になるという定義で、\sqrt{25}=5 となります。
標準偏差は、 \sqrt{138.571428} = 11.771636
Excelにて標準偏差関数(STDEVP)を使って求めた場合、11.77164となりました。

ついでに学力を測定する値として「偏差値」ということばをよく耳にしますが、偏差値は標準偏差を分母に使った下記の数式となります。
\Large T_i = \displaystyle {10(x_i - \bar{x}) \over \sigma} + 50

参照:偏差値の求め方 - すぐる学習会

Σ(シグマ)の実習

Σ(シグマ)の数式に変換するのに、内積が丁度いい題材としてあります。
3次元のベクトルの内積を取る計算は下記のようになります。
\vec{a}=(a_1,a_2,a_3),\vec{b}=(b_1,b_2,b_3)
\vec{a} \cdot \vec{b} = a_1b_1 + a_2b_2 + a_3b_3

\vec{a}\cdot\vec{b} = \displaystyle \sum_{k=1}^{3}a_{ik}b_{ik}

内積では1行だけなので、複数行にした行列の積の場合
\begin{pmatrix}
a_{11} & \ldots & a_{1n} \\
\vdots & \ldots & \vdots \\
a_{n1} & \ldots & a_{nn} \\
\end{pmatrix}
\begin{pmatrix}
b_{11} & \ldots & b_{1n} \\
\vdots & \ldots & \vdots \\
b_{n1} & \ldots & b_{nn} \\
\end{pmatrix} =
\begin{pmatrix}
\sum_{i}a_{1i}b_{i1} & \ldots & \sum_{i}a_{1i}b_{in} \\
\vdots & \ldots & \vdots \\
\sum_{i}a_{ni}b_{i1} & \ldots & \sum_{i}a_{ni}b_{in} \\
\end{pmatrix}

(ab)_ij = \displaystyle \sum_{k=1}^{n}a_{ik}b_{kj}
これをプログラムで書くと下記になります。※数式と違いk=1ではなくk=0にしています。

for (i = 0; i < n; i++) {
    for (j = 0; j < n; j++) {
      c[i][j] = 0;
      for (k = 0; k < n; k++) {
	c[i][j] += a[i][k] * b[k][j];
      }
    }
}

Σ(シグマ)の二重和

Σ(シグマ)を2つ繋げて書く方法があります。参照:シグマ計算を機械的に行うための3つの公式
シグマが2つ並んだ場合,内側のシグマから順番に計算します
\displaystyle \sum_{i=1}^{m}\sum_{j=1}^{n}a_{ij}
 = \displaystyle \sum_{i=1}^{m}(\Large a_1+a_2+a_3+\cdots+a_n)
 = \Large a_{ij} のすべての和

これの用途ですが、画像フィルタなどに使われています。
線形フィルタ(Linear filter)は M行xN列 の近傍マトリックス、及び同じサイズの係数マトリックスで積和演算を行い注目画素の画素値を変換するフィルタのことです。
g(i,j) = \displaystyle \sum_{n=-w}^{w}\sum_{m=-w}^{w}f(i + m, j + n)h(m,n)
参照:フィルタ処理の概要


f:id:Yaju3D:20160417025404g:plain

スポンサーリンク