機械学習/MacでTensorFlowを使う のバックアップソース(No.5)

*はじめに [#ja3312a3]

ここでは、Googleが公開しているオープン・ソース・ソフトウェア (OSS) のTensorFlowをMac (OS X) にインストールして使います。


*環境 [#kd6c49b9]

-OS X Yosemite 10.10.5
-Python 3.5.1
-TensorFlow 0.7

*Python3のインストール(アップグレード) [#zf2975fa]

まず、Python3を最新版にアップグレードします。
下記のサイトから''Mac OS X 64-bit/32-bit installer''をダウンロードして、インストール。
-[[Python 3.5.1:https://www.python.org/downloads/release/python-351/]]


*TensorFlowのインストール [#seb185d6]

基本的にはここに書いてある通りなんですが、なぜかsixのeasy_installが先にできなかったので、順序を逆にしました。
-[[Download and Setup:https://www.tensorflow.org/versions/r0.7/get_started/os_setup.html#download-and-setup]] - TensorFlow

#geshi(sh){{
$ sudo pip3 install --upgrade https://storage.googleapis.com/tensorflow/mac/tensorflow-0.7.1-cp35-none-any.whl
$ sudo easy_install --upgrade six
}}

*Virtualenvのインストール [#ab5cc2c7]

#geshi(sh){{
$ sudo pip3 install --upgrade virtualenv
$ virtualenv --system-site-packages /Users/Shared/tools/tensorflow
$ source /Users/Shared/tools/tensorflow/bin/activate
(tensorflow)$ pip3 install --upgrade https://storage.googleapis.com/tensorflow/mac/tensorflow-0.7.1-cp35-none-any.whl
(tensorflow)$ deactivate
}}
私の研究室では、共有フォルダーのtoolsというフォルダー (/Users/Shared/tools/) に、みんなで使うツールをインストールしています。
/Users/Shared/tools/tensorflow を ~/tensorflow などTensorFlowをインストールしたいフォルダーに変更してください。



*TensorFlowを動かす [#te2b5012]

TesorFlowのサイトに掲載されているHello Worldを動かします。
-[[Test the TensorFlow installation:https://www.tensorflow.org/versions/r0.7/get_started/os_setup.html#test-the-tensorflow-installation]] - TensorFlow

#geshi(sh){{
$ source /Users/Shared/tools/tensorflow/bin/activate
(tensorflow) $ python3
Python 3.5.1 (v3.5.1:37a07cee5969, Dec  5 2015, 21:12:44) 
[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import tensorflow as tf
>>> hello = tf.constant('Hello, TensorFlow!')
>>> sess = tf.Session()
>>> print(sess.run(hello))
b'Hello, TensorFlow!'
>>> a = tf.constant(10)
>>> b = tf.constant(32)
>>> print(sess.run(a + b))
42
>>> quit()
(tensorflow) $ deactivate
}}


*irisで線形回帰 [#ka2954e2]

まずは、おなじみのirisデータセットで線形回帰をやってみましょう。
irisデータセットは、4つの説明変数(花びらの長さ、幅、がく片の長さ、幅)とカテゴリー (setosa, versicolor, virginica) からなる分類問題用のデータセットですが、4つの説明変数を3つの説明変数と1つの目標変数にして、回帰問題用のデータセットにします。

UCI Machine Learning Repositoryからファイルをダウンロードします。
中身はこんな感じです。
#geshi(txt){{
5.1,3.5,1.4,0.2,Iris-setosa
4.9,3.0,1.4,0.2,Iris-setosa
4.7,3.2,1.3,0.2,Iris-setosa
4.6,3.1,1.5,0.2,Iris-setosa
5.0,3.6,1.4,0.2,Iris-setosa
}}

ソースコードはこんな感じです。

以下のページを参考にしました。
-[[TensorFlowで回帰をやってみる:http://qiita.com/syoamakase/items/db883d7ebad7a2220233]] - Qiita

#geshi(python){{
import tensorflow as tf
import numpy as np

# 損失関数
def loss(o, y):
  with tf.name_scope('loss') as scope:
    loss = tf.reduce_mean(tf.square(o - y))
  return loss


# CSVファイルの読み込み
iris = np.genfromtxt('iris.data', delimiter=",")

# 説明変数
x = iris[:,0:3].astype(np.float32)

# 目的変数
y = iris[:,3:4].astype(np.float32)


# 学習データ (train) とテストデータ (test) に分割
N = 100
x_train, x_test = np.vsplit(x, [N])
y_train, y_test = np.vsplit(y, [N])
N_test = y_test.size


# 入力層
n0 = 3
x = tf.placeholder("float", shape=[None, n0])

# 中間層1(活性化関数はReLU)
n1 = 64
with tf.name_scope('l1') as scope:
  w1 = tf.Variable(tf.truncated_normal([n0, n1], stddev=0.1), name="w1")
  b1 = tf.Variable(tf.constant(1.0, shape=[n1]), name="b1")
  o1 = tf.nn.relu(tf.matmul(x, w1) + b1)

# 中間層2(活性化関数はReLU)
n2 = 64
with tf.name_scope('l2') as scope:
  w2 = tf.Variable(tf.truncated_normal([n1, n2], stddev=0.1), name="w2")
  b2 = tf.Variable(tf.constant(1.0, shape=[n2]), name="b2")
  o2 = tf.nn.relu(tf.matmul(o1, w2) + b2)

# 出力層(線形結合)
n3 = 1
with tf.name_scope('l3') as scope:
  w3 = tf.Variable(tf.truncated_normal([n2, n3], stddev=0.1), name="w3")
  b3 = tf.Variable(tf.constant(1.0, shape=[n3]), name="b3")
  o3 = tf.matmul(o2, w3) + b3


loss_op  = loss(o3, y_train)
train_op = tf.train.AdagradOptimizer(0.01).minimize(loss_op)
min = float("inf")


# 初期化
init_op = tf.initialize_all_variables()


# セッション
with tf.Session() as sess:
  sess.run(init_op)
  for i in range(100001):
    loss = sess.run(loss_op, feed_dict={x:x_train})
    sess.run(train_op, feed_dict={x:x_train})
    if loss < min:
      min  = loss
      best = sess.run(o3, feed_dict={x:x_test})
    if i == 0 or i % np.power(10, np.floor(np.log10(i))) == 0:
      r = np.corrcoef(best.flatten(), y_test.flatten())[0][1]
      print('{}: Loss = {}, R = {}'.format(i, min, r))
}}

実行すると、次のようになります。
#geshi(sh){{
(tensorflow) $ python3 tfRegression.py 
0: Loss = 0.9924622178077698, R = -0.31376540185534374
1: Loss = 0.33512526750564575, R = -0.2809933838930298
2: Loss = 0.3103932738304138, R = -0.2605662262997624
3: Loss = 0.29998070001602173, R = -0.19988817587575336
4: Loss = 0.29054442048072815, R = -0.10261393047830965
5: Loss = 0.2815440893173218, R = -0.0030378746322473078
6: Loss = 0.2728765904903412, R = 0.06743248160241787
7: Loss = 0.26452258229255676, R = 0.11218694086822772
8: Loss = 0.25640469789505005, R = 0.14083619953594895
9: Loss = 0.24850055575370789, R = 0.15955179537740188
10: Loss = 0.2407849133014679, R = 0.17325851369183962
20: Loss = 0.17123618721961975, R = 0.2119044088136728
30: Loss = 0.11361732333898544, R = 0.21242390033328104
40: Loss = 0.07034626603126526, R = 0.21351552138337554
50: Loss = 0.04281529411673546, R = 0.2112161148516869
60: Loss = 0.027972474694252014, R = 0.21323103613228045
70: Loss = 0.02100631780922413, R = 0.2133350814777594
80: Loss = 0.01804741658270359, R = 0.21420981216605972
90: Loss = 0.016845906153321266, R = 0.2153937757021539
100: Loss = 0.01631508581340313, R = 0.21719647880323853
200: Loss = 0.01521082129329443, R = 0.2440402497636383
300: Loss = 0.014608824625611305, R = 0.2645834921419263
400: Loss = 0.014166736975312233, R = 0.28157404933081204
500: Loss = 0.013829934410750866, R = 0.2952680005290892
600: Loss = 0.013562848791480064, R = 0.30675864601619857
700: Loss = 0.013374903239309788, R = 0.3164113669058739
800: Loss = 0.013220920227468014, R = 0.3264013737506945
900: Loss = 0.013091418892145157, R = 0.3328174293176383
1000: Loss = 0.012949838303029537, R = 0.33802548623013406
2000: Loss = 0.012516467832028866, R = 0.3696120433568608
3000: Loss = 0.012403683736920357, R = 0.3809822832215991
4000: Loss = 0.012310308404266834, R = 0.38904775116540224
5000: Loss = 0.012245077639818192, R = 0.39475342114404327
6000: Loss = 0.0121763302013278, R = 0.39984150610626895
7000: Loss = 0.012104801833629608, R = 0.40494473659532704
8000: Loss = 0.012028640136122704, R = 0.4100277288577437
9000: Loss = 0.011952037923038006, R = 0.41544311557772695
10000: Loss = 0.011868388392031193, R = 0.42219982940390616
20000: Loss = 0.011160679161548615, R = 0.46866687115166755
30000: Loss = 0.0105402497574687, R = 0.4942357990758039
40000: Loss = 0.010395915247499943, R = 0.5026822424224162
50000: Loss = 0.01029052771627903, R = 0.49972020218055674
60000: Loss = 0.010193731635808945, R = 0.48942378308652223
70000: Loss = 0.010111675597727299, R = 0.4797740509869646
80000: Loss = 0.009985744953155518, R = 0.4579861414250584
90000: Loss = 0.009862487204372883, R = 0.43707398862896835
100000: Loss = 0.009671863168478012, R = 0.4074325332085266
}}
トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS