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 の話を書いたのです。

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

機械学習という言葉が最近話題になってきています。少し前に IBM 社の Watson が癌患者を救ったというニュースがありました。

www3.nhk.or.jp

はい。最近はこの IBM の Watson が頑張っています。膨大な情報を読み込み,その中から最適の解を探してくるのです。人間には到底不可能な量の情報を扱うためまさに「人工知能」と言うに相応しいソリューションと言えます。

www.ibm.com

うちの会社でも一部の部隊が Watson を使って何か怪しげなことをやっていますが,Watson はいかんせん「タダじゃない」のです。まあ人間の代わりに学習してより知能を高めていくのですから作った方もタダで使わせてくれるわけはありません。

ところが,世の中にはこの機械学習をタダで試してみることができるものも存在するのです。

我らが Google !

そうです。世界トップクラスの IT 企業とも言える Google が 2015 年 11 月に世に出した TensorFlow というものがあります。これを使えば貧乏サラリーマンでも機械学習ができるのです。

乗るしかない,
このビッグウェーブに!

まあ機械学習で何がしたいか,というと,

  • 会社に行くのが面倒なので代わりに行ってきて欲しい。
  • 家で寝ていてもお金を稼いできて欲しい。
  • 近くのイオンで買い物をしてきて欲しい。
  • 炊事,洗濯,掃除をやって欲しい。
  • ゲームを一緒にプレイして欲しい。
  • ここのブログを毎日更新しておいて欲しい。
  • Twitter で適当につぶやいていて欲しい。

なんとなく機械学習というよりも家政婦さんとか友達とか探した方が良さ気ですが,某ラノベタイトルのごとく「僕は友達が少ない」を実践しているので人工知能にすべてをかけているのです。もう少し言えば,コンピュータというのは人間が楽をするために作られたものなのですから,人間が楽をするために使うのが一番です。代わりに会社へ行ってください。

入門書を買った

本題です。もともと id:tuto0621 さんの記事,

ongaeshi.hatenablog.com

を読んでいて,ここで紹介されている「はじめての Ruby」を Amazon.co.jp で購入しようとしたら,オススメのところに TensorFlow の本が出てきたという次第です。誘惑に負けて TensorFlow の本を買ってしまいました。ごめんなさい。

購入したのはこれ。

TensorFlowはじめました 実践!最新Googleマシンラーニング (NextPublishing)

TensorFlowはじめました 実践!最新Googleマシンラーニング (NextPublishing)

割と表紙が軽いノリだったので買ったのですが,結構読むのに苦労しています。Ruby と並ぶスクリプト言語の巨頭に Python という言語があるのですが,これが最近の機械学習ではよく使われます。今後,人工知能がもっと伸びてくると Python も重要視されてくるんじゃないかと思いますが,この Python が使えるのが最低条件の本です。

でもっ!肝心の TensorFlow のインストールとか書いてないっ!

読むのに苦労しているので他にもきっと苦労している人がいるかもしれないと思って,本を読み進める上で必要なことを書いていきます。

環境構築

まずは Python と TensorFlow が動く環境を作らなければなりません。

Python 3.5.2 のインストール

Python は OS X であれば 2.7 が入っているのですが,今回の書籍では Python 3.5 を使用しているので合わせておきます。Python のインストール方法は様々ですが,今回は簡単のため以下の公式サイトから OS X 用のインストーラをダウンロードします。この記事を書いた時点では 3.5.2 でした。

www.python.org

インストールそのものは出てきた画面の指示にしたがっていくだけです。特に問題はないと思います。インストールが終わったら以下のコマンドを実行してインストールの成功を確認しておきます。

$> python3 --version
Python 3.5.2

Python 3.x 系はコマンドが python3 になっています。今後書いたコードを実行する場合は python とすると古い 2.7 系の Python が実行してしまうので注意が必要です。

TensorFlow のインストール

本命の TensorFlow をインストールします。まずはこのサイトが公式サイトです。画面中央の GET STARTED から始めるのが良いでしょう。

www.tensorflow.org

GET STARTED で進んだ先の画面で左側のメニューから「Download and Setup」を選びます。基本的にこのページに書いてある内容を読み進めていけば TensorFlow をインストールできます。英語なので少々解説を。

pip のインストール

OS X の標準で入っている Python 2.7 ですとパッケージ管理の pip が入っていません。そのため,ページの最初の方に書いてある「Pip Installation」を実行すると良いと思います。Python3 を入れていれば pip3 が入っていますので特に何もしなくて OK です。

TensorFlow をインストールする

続けて「Then, select the correct binary to install:」の所で TF_BINARY_URL という環境変数の設定がありますが,どれを選べばいいのか迷うところです。今回は Python 3.5.2 を入れてますので,「Mac OS X, CPU only, Python 3.4 or 3.5:」を選びました。実はすぐ下の「GPU enabled」の方にしてみたらいろいろ面倒だったので一度アンインストールして CPU only に変更しました。

$> export TF_BINARY_URL=https://storage.googleapis.com/tensorflow/mac/cpu/tensorflow-0.10.0rc0-py3-none-any.whl
$> sudo pip3 install --upgrade $TF_BINARY_URL

こんな感じでインストールします。インストールの確認は以下のように python3 を実行すると対話モードになりますので,以下のように import を試してみます。

$> python3
Python 3.5.2 (v3.5.2:4def2a2901a5, Jun 26 2016, 10:47:25) 
[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
>>> 

エラーが出なければ OK です。ちなみに対話モードを終えるときは ctrl + D です。

tensorboard が使えない

書籍を読み進めていくと使用する tensorboard コマンドですが,TensorFlow を pip3 から入れていれば使えると書いてあるのですが残念ながら私の mac では使えませんでした。会社の mac でも事象は同じだったので使えないのでしょう。まあ調べてみるとないことはないのでパスが通ってないとかそういった感じの話です。

$> sudo find / -name tensorboard

でどこに入っているのか調べます。以下の場所にあるので移動します。

$> cd /Library/Frameworks/Python.framework/Versions/3.5/bin

ここに移動して実行します。

$> ./tensorboard
ERROR:tensorflow:A logdir must be specified. Run `tensorboard --help` for details and examples.
A logdir must be specified. Run `tensorboard --help` for details and examples.

エラーがでますが現時点では OK です。書籍を読み進めていく中でオプションをつけて実行することになります。

次回は具体的に

ここまでやれば「TensorFlow はじめました」を読み進める準備ができました。次回は実際に作っていくプログラムを解説します。なぜかというと書籍中に書かれているプログラムは一部分のみが書かれている基本的に不完全なので動かせる状態のものを解説したい動く状態を解説するのがいいと思います。

2016.08.24 12:45 改訂
昨晩公開から非常に高い反響をいただいており,著者の方にまでコメントをいただいております。そんなわけで文章がおかしいところを一部修正しました。

旧世界の黒歴史 Flex の XML の扱い方が「神」だった件

突然ですが本日はプログラミングの技術的かつ専門的かつ割とどうでもいい話です。

職業が SE すなわちシステムエンジニアなどと名乗っておりますが、基本的にプログラマでありたいと思って常々意味のないプログラミングをしては悦に入るのが楽しいです。そんな自称プログラマの私が一番嫌いなのが XML です。最近はそれほど騒がなくなった気もしますが、一時期はこの世の中の全ての事象は XML で表現すべし、とでも言いたげに何でもかんでも XML でデータ構造を保持していました。

<root>
    <a></a>
    <b></b>
</root>

こんなもの考えついたのは誰だよ。余計なこと思いつきやがって。とにかく XML が嫌なのはアクセスしにくい。データ定義なら、

a=あ
b=い

でいいじゃん。さらに意識高くなると、

<root>
    <a id="01" name="名前1" value="あ" />
    <b id="02" name="名前2" value="い" />
</root>

とかやり始めます。.../> のあたりがちょっと意識高い系。で、プログラムでこの XML にアクセスする(つまり読み込んでデータとして取得する)ことが結構面倒なのです。実は今から 10 年ほど前の西暦 2006 年に Java で XML を扱うための機構である JAXB に出会いました。運命の出会いです。革命です。JAXB は XML スキーマとして .xsd のファイルを作っておいて xjc コマンドで XML にアクセスするための Java のプログラムが静的に出力されるものです。

<schema>
     <element name="root">
        <complexType>
            <sequence>
                <element ref="a" minOccurs="1" maxOccurs="1" />
                <element ref="b" minOccurs="1" maxOccurs="1" />
            </sequence>
        </complexType>
    </element>

    <element name="a" type="string">
        <attribute name="id" type="string" />
        <attribute name="name" type="string" />
        <attribute name="value" type="string" />
    </element>

    <element name="b" type="string">
        <attribute name="id" type="string" />
        <attribute name="name" type="string" />
        <attribute name="value" type="string" />
    </element>
</schema>

こんな感じで XML スキーマを書きます。上の例、細かいところは端折ってます。あくまでイメージです。これを xjc でコンパイルすると Java のソースが出てくるのです。

Root root = new Root();
A a = root.getA();
B b = root.getB();

ってな感じで簡単に XML が読めるんです。美しいです。何が美しいかって XML の奇怪な構造を Java のオブジェクト指向に合わせたプログラミングに置き換えて扱えるようにしている点が美しいです。JAXB を考えた人は天才だ!と 2006 年に思ったわけです。

ところが、2016 年。再び衝撃が!

Flex という今はもうただのお荷物としか言いようがない Flash のプログラミングをするための言語のお仕事があって非常に苦しんでいるのですが、これでたまたま XML を作らなきゃいけなくなったのです。JAXB 使いたいなぁと思いつつも Flex じゃダメかと思って調べていたらなんと Flex すごいよ!という急展開。

var xml:XML =
    <root>
        <a>あ</a>
        <b>い</b>
    </root>

と定義すると、

var a:String = xml.a;
var b:String = xml.b;

だけで読めるんです。さらにさらに、

xml.c = "う";

とすれば、

<root>
    <a></a>
    <b></b>
    <c></c>
</root>

という感じに更新されるという神仕様。非常に素晴らしいです。これ 10 年前に知っていたら Flex の布教活動に人生を捧げたかもしれません。もはや iOS にも Android にも相手にされなくなった Flash なのでこのまま静かにお見送りするだけですが。とにかくこれを知って楽しくて仕事で書いてるプログラムを作るのに時間を忘れて 23 時を過ぎていた、というのが本日のお話です。

それではまた。

はてなブログ PRO に変更して Google Adsense に申し込もうかな?と思った話

思い立ったらすぐに行動はするものの、大抵トホホな結果になる人生を毎日楽しく送っております。思えば飛行機に興味をもって 787 に一目惚れして、いざ乗ろうと思って 787 の便を予約して羽田に行ったら機材変更で違う機体になったり、思い立って何か買ってみたらすぐに新製品が登場したり。

今回、Google Adsense の広告をブログに貼って小銭を稼ぐか、と邪な思いとともに PRO 版へ登録しました。細かいプロセスはともかくはてなポイントやらを購入する際は自動リチャージはオフで購入するのが良いみたいです。

で、めでたく PRO デビュー。

広告を取っ払って Google Adsense に申し込むぜ、と意気込んでこのブログの URL を登録してみたらエラーになりました。どうやらサブドメインでは Google Adsense に申し込めなくなったみたいです。PRO 版では独自ドメインを使えるわけですが、独自ドメインを取ってブログの URL を変更して申し込まなくてはならないみたいです。サブドメインで登録できたのは少し前までだったようで、さっさとやっておけばよかったというお話です。

まあ「お名前.com」とかでドメイン取ればいいんですが、そっちにもお金がかかるし・・・。

ということでカッコつけて「邪魔な広告を撤廃して見やすくしました!」という結論にたどり着きました。お金は正攻法で iPhone のアプリとか作って稼ごうと思います。

というわけで多少は見やすくなったかと思いますので、今後とも当ブログをよろしくお願いいたします。

... その後追記
PRO 版機能をいろいろ見ていたのですが、割と邪魔だなと思っていたキーワードリンクが消せるみたいなので設定を有効にしました。確かにこの記事からは消えたのですが、PRO 版になる前に投稿した記事は残ったままのようです。もう一度編集して再投稿すればいいみたいなのですが、誰がそんな面倒なことをするのでしょうか。ということでこれからの記事はキーワードリンクが消えます。

学生気分

お疲れ様です。少しブログのテーマを変えてみました。以前も使っていたのですが、再びこれに。ちょっと表示が遅かったりするかもしれません。

f:id:tomohiko37_i:20160615074525j:plain

久々に学生気分になってます

毎週月曜日に島根大学の講義に社会人で参加しているのですが、来週の月曜日が中間発表なのでグループの打ち合わせを週半ばにやっておこうという話になり、今日の昼過ぎに大学へ行ってきました。大学の正門で待ち合わせして図書館でいろいろ議論したり報告書を書いたりプレゼン資料を作ったり、ということを学生達数人とやっていました。

久々に学生っぽい感じだなぁ〜と思いながらいろいろ議論していたのですが、これも島根に来ないと経験できないことだったりするのです。大学を卒業してから十数年経つわけですが、やっぱり大学の雰囲気は楽しいですね。学生達と違って成績がついたりとか試験や課題などとは無縁の講義に参加するだけなのでかなり気楽な感じで楽しんでいます。

2 時間ほどグループで作業をして大学をあとに職場へ戻ってきました。現実に戻るとツライです。

DQH2 現状報告

終盤に来ていますが、かなりボス戦で行き詰っています。主人公が僧侶でそれなりに強いのですが、いかんせんボスの体力が高いので火力を求めて修行中です。チビヒゲを倒す前に強くなります。

強化内容

  • 主人公を僧侶から武闘家に転職させる。
  • 武闘家 Lv20 まで修行する。
  • 武闘家 Lv20 で転職サイトに行くと上級職バトルマスターへの道というクエストを受けられるようになる。
  • クエストを受注。大峡谷(南)のバトルにおいて 15 分間で 250 体のモンスターを倒す。ちなみに主人公一人。
  • 武闘家でやって失敗。
  • 戦士に切り替えて小さい敵を中心に狩りまくる。ゲージが溜まったらなるべく多くの敵を巻き込む感じでギガスラッシュをお見舞いする。
  • 残り 24 秒で 250 体撃破。
  • バトルマスターに転職。
  • さくさくレベルを上げていき「無心こうげき」を覚える。
  • 「ぶんしんけん」と併用して「無心こうげき」を使う。
  • 強力。あとはレベルを上げて強くなるだけ。火力はこれで十分らしい。
  • 残りのパーティのメンツは、ミネア、マーニャ、オルネーゼに決定。
    • 見た目だけで選考。
    • とは言ってもミネアは回復役、マーニャは空中戦が得意、オルネーゼは破壊神、なのでそれなりにバランスもいい。

今日の写真

今日貼った写真です。すっかり忘れていましたが、先月末に大阪へ行った時に最終日ヒマだったときに撮影したものです。久々に撮影した 787 です。実はこの「顔」が好き。窓が 4 枚なのが 787 の特徴です。日々 1 枚ずつくらい以前撮影した写真を貼りたいと思います。