blog.tmp.tokyo

No Promises Await at Journey's End

「TensorFlow はじめました」をはじめてます!

前回記事は非常に多くの方にブックマーク等*1いただき嬉しい限りです。恐悦至極。狂喜乱舞*2

tomohiko37-i.hatenablog.jp

最大瞬間風速的な PV 数が当ブログ始まって以来の記録を更新いたしました。以前すごかったのはご存知エド・フォース・ワンです。

tomohiko37-i.hatenablog.jp

思い起こせば,この記事で一気に PV があがり,多くの方を国際線ターミナルへ導いたのでした。あえなくエド・フォース・ワンは 2 タミ側を通過。国際線ターミナルへ来ていた方々はほとんど見えなかったという事態になりました。

時代は TensorFlow

さて本題です。「TensorFlow をはじめました」を第 1 章まで読み進めました。「まだそんなところかよ」とかいうご意見がありそうですが,真面目に本を読むときは遅いのです。一字一句噛み締めながら読んでおります。

訂正してお詫び

前回記事で光栄なことに著者の有山様よりコメントをいただきました。その中で気づいたのですが,TensorFlow のバージョンを記載していませんでした。書籍の中では「0.8.0 および 0.9.0」と明言されておりますが,私は適当にそのまま入れたため最新の「0.10.x」が入ってます。おそらく記事を読まれてそのまま実行するとその時点で最新になるかと思います。まあもう入れてしまったのでそのまま進みたいと思います。tensorboard がそのまま使えなかったのもバージョンが関係している可能性もあります。

反省して私がインストールした環境のバージョンを書いておきます。

  • TensorFlow r0.10
  • Python 3.5.2
  • OS X El Capitan & Yosemite
  • 端末 MacBook Air

休み時間とかに会社の端末でいじったりしているのですが,そっちは Yosemite です。自宅の mac は El Capitan になってます。

第 1 章で気になったこと

ということで書籍の内容は読めば良いですから、私が読み進める中でなんだかよくわからなかったところを調べたりしましたので記録として残しておきたいと思います。Python 初心者*3は同じことを思うはず。

1 行目からわからん

「よくわからなかったところ」と言いながら最初のプログラムの 1 行目からドン詰まりしました。

# coding: UTF-8

まあわかることはわかるんですが,一番得意な Java だと基本的にソースは UTF-8 で書くもんだからプログラムの中にわざわざエンコードを指定するのは違和感がありました。調べてみると Emacs とか Vim とかの書き方と合わせたり正規表現でマッチする書き方なら OK とかいろいろあってもう何がなんだかわからなくなったので,この書籍に書いてある書き方で覚えようと思います。

from と future と import とか

次。

from __future__ import absolute_import

2 行目でまた立ち止まりました。from って何ですか?__future__ って何ですか?import はまあ Java と同じだろうな,と。TensorFlow の前に Python の本を読めよ,と自分で突っ込みたくなりますが,機械学習がやりたいのです。__future__ というモジュールの中の absolute_importimport するということのようです。

from A import *

と A の中身を全部 import するということも可能なようです。

「はらたいらさんに全部!」

ということと理解*4しました。ついでに気になったのは __ で囲まれている __future__ です。__ で囲まれているのは特殊メソッドや属性のようです。

from __future__ import xxx

となっているのは Python2/3 の両方に対応するため,というか 2 でも 3 の恩恵を受けるための記述みたいですね。

実行してみる

ということで「リスト1.1」を実行してみることにします。適当のなエディタでリスト 1.1 の内容を打ち込んで list0101.py というファイル名で保存しました。いろいろな言語をやると命名規則がごっちゃごちゃになります。Java みたいにクラス名とファイル名を一致させるルールだとわかりやすくていいんですが,Ruby とかだとクラス名は HogeHoge なのにファイル名は hoge_hoge.rb としたり,Rails になると複数形だの何だのもうわけワカメ。

書籍の中で解説されている「構築」と「実行」がプログラムの中に表現されています。

# coding: UTF-8
from __future__ import absolute_import
from __future__ import division
from __future__ import print_function

import tensorflow as tf
# ----------------------------------------------
# ↑ ここまでは毎回書く定型文(通称,おまじない)
# ----------------------------------------------

# ----------------------------------------------
# ↓ ここからは「構築」フェーズ
# ----------------------------------------------
const1 = tf.constant(2)
const2 = tf.constant(3)
add_op = tf.add(const1, const2)
# ----------------------------------------------
# ↑ ここまで「構築」フェーズ
# ----------------------------------------------

# ----------------------------------------------
# ↓ ここから「実行」フェーズ
# ----------------------------------------------
with tf.Session() as sess:
  result = sess.run(add_op)
  print(result)
# ----------------------------------------------
# ↑ ここまで「実行」フェーズ
# ----------------------------------------------

という構成になっています。この構成は非常にわかりやすいです。リスト 1.2 で「実行」フェーズを省いたプログラムを例に挙げていますが,この「実行」フェーズがないと TensorFlow の場合は処理が実行されないのですね。

ということで実行するには,python3 コマンドで実行するファイル名を指定します。前回書いた通り python コマンドだと 2.x 系が実行されますので python3 を使うようにしてください。

$> python3 list0101.py
5

という結果を得ます。何となく実行結果が出るまで時間がかかる気がするんですが,これは気のせいでしょうか。マシンスペックが低いのかな。

Coffe Break

さて,ここまでで TensorFlow の基礎の基礎を動かしました。ちょっと話が脇道に逸れます。

Pythonista 3

Pythonista 3

  • omz:software
  • 仕事効率化
  • ¥1,200

iOS のアプリで Pythonista3 というアプリがあります。もともとは Pythonista というアプリでしたが,最近 Python3 対応の Pythonista3 が出たようです。1,200 円とアプリとしては結構高額ですが,それだけの価値があります。

tomohiko37-i.hatenablog.jp

過去に古い方の Pythonista を購入済み。と言っても新バージョンは再度購入が必要でした。このアプリは iOS 端末内で完全に Python が動きます。おまけに iOS の API とも連携できます。各種アプリから Python スクリプトを呼び出して処理をしたりできます。

これで TensorFlow が動かないものか。Pythonista はモジュールの追加も可能なので TensorFlow を入れられないかな,とちょっと考えています。こちらはもう少しいろいろ調べてから記事にしたいと思います。

*1: こんなにブックマークしていただくのは初めて。PV 数もものすごかったですし,一躍人気ブロガーか!とか思ったら翌日は半減。まあそうですよね。安定して TensorFlow の記事を書いていけると良いですが。いろいろなことが同時進行している人生を送っているので TensorFlow の記事はゆっくり進んでいくと思います。

*2: 実際に踊ったわけじゃないですが,踊りたくなったのは事実です。

*3: Python は初心者ですが,Java と C/C++ と Ruby くらいはやっています。プログラミング言語を何かやったことがあれば特に困らないと思います。

*4: これが言いたかったから from と import の話を書いたのです。