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

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

Shizuoka.py #6 and shizudevの資料公開

はじめに

2017/02/18(土)に「Shizuoka.py #6 and shizudev」が開催され、静岡県島田市の会場に11名集まりました。Shizuoka.pyは名前の通りPython向けの勉強会で、shizudev(静岡Developers勉強会)は開発全般の勉強会で今回共同開催となりました。昨年は人工知能ブームで「TensorFlow」が話題になり、静岡Developers勉強会では2016年は4月に「人工知能ハンズオン」を開催しました。その流れでPythonが繋がった次第です。参照:Shizuoka.pyを2/18にやります

TensorFlowの件でPythonの勉強会をやるなら、昨年に「TensorFlowでキュウリの選別・仕分け」で話題になったキュウリ農家の小池さんが静岡県人だったので、なんとか勉強会に呼んでセッションをしてもらいたいと思っており、今回実現することが出来ました。

共同開催

shizudev(静岡Developers勉強会)とShizuoka.pyが共同開催にした理由は下記の3つです。本当は昨年の11月頃に今回の「Shizuoka.py #6 and shizudev」の話があって年2回になるはずだったんですが、発表者の予定があわず2017年に持ち越しとなった次第です。

  • 勉強会の実績として年数回の1つにしたかった
  • 会費がまだ残っていて使い切る必要がある
  • 会場の会議室を過去に使用したことがある

宣伝効果

今回の勉強会用に「数学史」のセッションを作成していたのですが、資料をまとめるのが大変で飽きてしまい、その合間に以前から疑問に思っていたPythonについてのブログを書きはじめたのですが、これも年表を作成し始めたら大変になってしまった(^-^;
このブログ内に勉強会の宣伝を入れておいたところ、神奈川から1人参加して頂きました(キュウリが目的です)

qiita.com

勉強会内容

資料はこちら→Shizuoka.py #6 and shizudev - 資料一覧 - connpass

セッション 発表者
Bottle RESTサービスをWebTestでテストしてみる & Pythonメタプログラミングでテストの自動生成 @oec014
clickでお手軽コマンド作成 @fmkz___
数学の歴史 @yaju
TensorFlowを使ったキュウリの仕分けあれこれ @ike_jpn
TensorFlowでFizzBuzz @yaju
AWS Lambda Pythonについて @aoshiman
LT 確定申告をpythonで乗り切る @hrs_sano645

気になったこと

全部は書けないので2つのみ。

TensorFlowを使ったキュウリの仕分けあれこれ

キュウリの仕分け機は試作3号機を制作していて、カラー画像を活かしてキュウリの表面の傷なども認識したいとのことです。
資料の22ページにある「教師データの錬金術」の話が興味深かったです。本来キュウリにしても不良品を作らないように頑張っているわけですが、教師データには不良品が大量に必要になるわけです。どうしたら良いのかと見つけたのが下記の論文(PDFダウンロード)です。
[1612.03019] Automatic Model Based Dataset Generation for Fast and Accurate Crop and Weeds Detection

下図は野菜と雑草を見分けるのに、Unityを使って仮想上にデータを作成しているわけです。
「そもそも集まらない場合は、仮想世界で瞬時に大量生産したデー タで学習して、現実世界に適用すればよい。 最近のゲームを見ても分かる通り、高品質なテクスチャだけでなく、光効果、物理現象す らもリアルに再現するよ。 」ってことで、まさに錬金術ってことです。
f:id:Yaju3D:20170301005602p:plain

この話を聞いて帰宅後に思い出したのが、Googleが自動運転カーで仮想空間を走行させているって記事でした。Googleだから自動走行のシミュレーションをたくさんやれると思われ、日本企業で同じことをやるにはサーバー代のコストが問題となりそう。どんどん差がついて、敵わなくなりそうだ。 gigazine.net

AWS Lambda Pythonについて

AWS Lambdaとは、AWSの新サービスで、従来は複雑な仕組みを必要としたイベントドリブンなアプリケーションを簡単に開発できるプラットフォームとのことです。例えばメールを受け取ったら、別のサービスを起動させるみたいな。

以前、違う方法にしていたのをAWS Lambdaに切り替えたとの話です。

  • 子供の習い事の送迎バスは到着10分前にメールをくれる
  • しかしメールに気づかない場合が多い
  • 音声などで知らせてくれる仕組みが必要

AWS Lambdaを使ってメール通知を受け取ったらクラウド電話APIサービス「Twilio」を呼び出す、自宅の固定電話(ナンバーディスプレイ付き)を鳴らす、ナンバーディスプレイの音声読み上げ機能を使って「バスが来ます」と知らせてくれる。
システム構成図:個人ユースにおけるAWS Lambda Python事例

ナンバーディスプレイは自宅でも使用していますが、携帯電話では一般的な機能なのに400円と高いです。NTTさんどうにかして下さい。
Twilioも使い方次第で便利そう、価格的にも悪くない。

最後に

キュウリの仕分けってソフトウェア側だけでなくハードウェア側があるから凄いんですよね。やはりハードウェアってやってみたくなりました。今なら「Raspberry Pi」や「Arduino」を使ってモーターを動かしたり、3D CAD/CAM ソフトウェア「Fusion 360」で歯車や部品とか作って3Dプリンタに出力できるんですよね。あとはやる気と勉強次第です。

身近な人を楽にさせてあげようと作ったものが、次第に周りに広まって大きくなっていく。

有名な発明や開発のきっかけとかってこんな感じですよね。

懇親会はとても楽しかったです。とある理由で不覚にもホテルに泊まることになってしまったけどね。

「サザエさんのじゃんけん データ分析」の2016年の結果

はじめに

明けましておめでとうございます。

昨年は東芝の不正会計について触れたのですが、また今年も東芝のことを触れるとは思っていませんでした。 不正会計後に少しずつ回復傾向にあったのに、まさか昨年末に再度危機的状況になるなんて。 東芝家電のためにサザエさんがあるのに家電売却したら意味が無いんじゃないと思うんですが、まー国民的アニメですから東芝がスポンサー降りたら別のスポンサーになるだけですよね。

さてさて、2016年のサザエさんのじゃんけん結果はどうなったでしょう。 ちなみに、2015年のサザエさんのじゃんけん結果は、32勝9敗9分(勝率0.78)でした。

R言語からPythonに移植

もともと2013年に静岡Developers勉強会で機械学習を学んだ際にR言語を覚えたのですが、その後に1年に1回だけサザエさんのじゃんけんのためだけにR Studioを起動するだけになっていて、操作も思い出す感じでやっている状態だったのです。
昨年、Visual Studio CodeでPythonの開発環境を整えることが出来たので、R言語からPythonに移植してみました。とはいっても、Pythonを本格的に意識して組むこと自体は今回初めてなので、そこそこ苦労しました。

はてなブログにPythonのソースコードを掲載しようとしたら表示がおかしくなるため、Qiitaにしました qiita.com

次の手の予測アルゴリズム

  • チョキが多いので、グー > チョキ > パーの優先順位とする
  • 前回と違う手を出すので、上記の優先順位で勝手を選ぶ
  • 二手前と一手前が違う手なら、残りの手を出すので勝手を選ぶ
  • 三手の中に同手がある場合、 残りの手を出すので勝手を選ぶ
  • 二手前と一手前が同じ手なら、勝手を出すので負手を選ぶ

2016年の勝敗結果

年月 サザエさんの手 予想の手 勝敗結果
01月03日 休み
01月10日 チョキ グー 勝ち
01月17日 グー グー 引き分け
01月24日 チョキ チョキ 引き分け
01月31日 グー チョキ 負け
02月07日 パー チョキ 勝ち
02月14日 チョキ グー 勝ち
02月21日 チョキ パー 負け
02月28日 グー パー 勝ち
03月06日 パー チョキ 勝ち
03月13日 パー グー 負け
03月20日 グー グー 引き分け
03月27日 チョキ グー 勝ち
04月03日 パー チョキ 勝ち
04月10日 グー パー 勝ち
04月17日 グー グー 引き分け
04月24日 チョキ グー 勝ち
05月01日 チョキ チョキ 引き分け
05月08日 パー チョキ 勝ち
05月15日 パー パー 引き分け
05月22日 グー パー 勝ち
05月29日 パー グー 負け
06月05日 チョキ グー 勝ち
06月12日 グー パー 勝ち
06月19日 パー チョキ 勝ち
06月26日 グー グー 引き分け
07月03日 チョキ グー 勝ち
07月10日 チョキ チョキ 引き分け
07月17日 パー チョキ 勝ち
07月24日 チョキ パー 負け
07月31日 グー パー 勝ち
08月07日 グー チョキ 負け
08月14日 チョキ チョキ 引き分け
08月21日 パー チョキ 勝ち
08月28日 チョキ パー 負け
09月04日 パー パー 引き分け
09月11日 グー パー 勝ち
09月18日 グー グー 引き分け
09月25日 パー グー 負け
10月02日 チョキ グー 勝ち
10月09日 グー パー 勝ち
10月16日 チョキ チョキ 引き分け
10月23日 休み
10月30日 パー チョキ 勝ち
11月06日 チョキ パー 負け
11月13日 グー パー 勝ち
11月20日 グー チョキ 負け
11月27日 パー チョキ 勝ち
12月04日 パー グー 負け
12月11日 チョキ グー 勝ち
12月18日 グー パー 勝ち
12月25日 パー チョキ 勝ち

結果は、27勝11敗12分(勝率0.71)となりました。

ちなみに、サザエさんじゃんけん研究所 公式ウェブサイトサザエさんの手の予想と勝負結果(2016年)が22勝13敗15分(勝率0.628)でした。

これまで研究所公式側に僅差で負けていましたが、今回は勝ちました。といってもアルゴリズムは何も変えてないので、単に相手側がミスったということですね。

データ分析 研究所公式
2013 24勝13敗12分(勝率0.65) 25勝9敗17分(勝率0.735)
2014 30勝10敗11分(勝率0.75) 30勝9敗12分(勝率0.769)
2015 32勝9敗9分(勝率0.78) 33勝9敗8分(勝率0.785)
2016 27勝11敗12分(勝率0.71) 22勝13敗15分(勝率0.628)

スライド

2013年に静岡Developers勉強会で機械学習を学び、2014年1月にネタとしてSlideShareに公開しました。

最後に

本当は、TensorFlowを使って人工知能のディープラーニングで予測手を作りたかったのですが、まだ組むだけの理解度(n-gramモデル)が足りないため持ち越しです。
でも、今年中には実現したいと思っています。

Visual Studio CodeをPythonの開発環境として使ってみる

はじめに

これまでPythonを使用するのに「Jupyter Notebook」を使用してきたのですが、簡単な確認ならこれで十分なんですが本格的に開発するとなるとブレークポイントを使ったデバッグが出来ないと自分には辛いということで、Python開発環境を整えることにしました。

候補として以前使用したことがあるPython統合開発環境(IDE)「PyCharm (パイチャーム)」とマイクロソフト発のクロスプラットフォームテキストエディターである「Visual Studio Code」があります。
今回は、話題になっている「Visual Studio Code」を使用してみます。

ちなみに、PyCharm (パイチャーム)については下記サイトを参考にするといいでしょう。

qiita.com

環境

OS:Windows10 Home(64bit)
Python:Python 3.5.2 :: Anaconda 4.2.0.0 (64bit) → 5.0.1(2017/11/25)
エディタ:Visual Studio Code version 1.8.1 → 1.10.2(2017/03/12) → 1.19.1(2018/01/01)

Visual Studio Codeのインストール

Windows版をダウンロードして、実行します。 code.visualstudio.com

Python実行環境を整える

下記サイトを見ながらデバッグ出来る環境まで整えます。 renga.hatenadiary.com

先にAnacondaにてTensorflow用のテスト環境として専用の環境「tensorenv2」を作ってTensorFlowをインストールしました。

(C:\Anaconda3) C:\Users\(ユーザー)> conda create --name=tensorenv2 python=3.5」
(C:\Anaconda3) C:\Users\(ユーザー)> activate tensorenv2
(tensorenv2) C:\Users\(ユーザー)>pip install --upgrade https://storage.googleapis.com/tensorflow/windows/cpu/tensorflow-0.12.0rc1-cp35-cp35m-win_amd64.whl

ところが「print("test")」といった実行は出来たのです、4つの問題が発生しました。

デバッグブレークポイントが止まらない

本来なら先頭に黄色マークが出て処理が止まるはずなのですが、止まりません。ブレークポイントをセットしてもそのまま実行されてしまいます。
この理由が全然分からなくて、「launch.json」を削除してやり直したり、「Python拡張機能をアンインストールしてから再度インストールもしてみたのですが、結果が変わらない。
指定したフォルダが「C:\Anaconda3\envs\tensorenv2\test」だったので、試しに「C:\DEV」としてフォルダの場所を変更してみたところ先頭に黄色マークが出てデバッグが出来るようになりました。
フォルダ階層が深いとダメなのかも知れませんね。 f:id:Yaju3D:20161231224452p:plain

デバッグ実行でimport Errorが発生する

「test2.py」として下記ソースコードを作成しましたが、先頭行で「tensorflow」がimport Errorとなります。

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

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

静岡Developers勉強会仲間である@uroshika_yの下記のブログ記事が解決の糸口となりました。 uroshika.blogspot.jp

これはTensorflow用のテスト環境(tensorenv2)にしかtensorflowがインストールされてないからです。
なので、Pythonの実行環境の場所を変更する必要があります。
参考にしたサイトでは「launch.json」内の「pythonPath」の設定値を変更するように書かれていますが、ここは「"${config.python.pythonPath}"」のままにしておきます。

先ず、ファイル→基本設定→ワークスペース設定を選択します。ユーザー設定とワークスペース設定の2つありますが、今回はワークスペース設定にします。 「Python Configration」内の「"python.pythonPath": "python",」のペンアイコンをクリックで設定コピーして、PythonPathの場所を書き換えます。 f:id:Yaju3D:20161231231501p:plain

tensorenv2環境内に「python.exe」があるので絶対パスを指定します。この際に"\"(バックスラッシュ)は"/"(スラッシュ)に書き換えます。

// 既定の設定とユーザー設定を上書きするには、このファイル内に設定を挿入します
{
    "python.pythonPath": "C:/Anaconda3/envs/tensorenv2/python.exe"
}

ワークスペース設定なので、「C:\DEV\.vscode」フォルダ内に「settings.json」が作成されます。
f:id:Yaju3D:20161231232217p:plain

これにより、「import Error」とならずにデバッグが出来るようになりました。

【追記 2018/01/01】
ユーザー設定にした場合の保存場所は「%APPDATA%\Code\User」フォルダ内に作成されます。
Visual Studio Codeの設定「虎の巻」:IDE編

スクランナーの実行でimport Errorが発生する

「Ctrl」+「Shift」+「B」のショートカットで「test2.py」が実行することが出来るのですが、「import Error」となってしまいます。
どうもデバッグとは設定が別のようなので変更する必要があります。 「tasks.json」内の「"command": "pyhon",」を「launch.json」内の「pythonPath」の設定値と同じにするため下記に変更します。

【追記 2018/01/01】
久しぶりにVSCodeを動かしバージョンアップ(1.19.1)したら、エラーが出るようになったので今回修正しました。
"label"プロパティや"type"プロパティなどが必要になりました。また、ShellはPowerShellになりました。あと、出力ウィンドウの日本語が文字化けも設定が無くても出なくなりました。

{
    // See https://go.microsoft.com/fwlink/?LinkId=733558
    // for the documentation about the tasks.json format
    "version": "2.0.0",
    "tasks": [
        {
            "label": "Python",
            "command": "${config:python.pythonPath}",
            "type": "shell",
            "args": [
                "${file}"
            ],
            "presentation": {
                "reveal": "always",
                "panel": "shared"
            },
            "group": {
                "kind": "build",
                "isDefault": true
            }
        }
    ]
}

以下は以前のバージョン用です。一応、残しておきます。
【追記 2017/03/12】
出力ウィンドウで日本語が文字化けする問題の対応で、「options」属性を追加しました。

{
    // See https://go.microsoft.com/fwlink/?LinkId=733558
    // for the documentation about the tasks.json format
    "version": "0.1.0",
    "command": "${config.python.pythonPath}",
    "isShellCommand": true,
    "args": ["${file}"],
    "showOutput": "always",
    "options": {
        "env": {
            "PYTHONIOENCODING": "UTF-8"
        }
    }
}

「Ctrl」+「Shift」+「B」のショートカットで結果「[7.0]」が求まりました。
f:id:Yaju3D:20161231234049p:plain

「出力」での文字化け

print("あいう")として「Ctrl」+「Shift」+「B」のショートカットで実行した場合、「出力」で文字化けしてしまいます。どうもVisual Studio Codeのバグのようです。
デバッグ コンソール」では正常に表示されるので、とりあえずはいいかな。 teratail.com

【追記 2017/03/12】「tasks.json」内で「options」属性を追加することで文字化けは解決しました。 segmentfault.com

【追記 2018/01/01】「tasks.json」で未設定でも文字化けしなくなりました。

最後に

これで最低限のPythonの開発環境が整いました。
あとはLintなど警告エラーなどをどうしていくのか考えていきます。

参照

Tensorflowの上位ラッパーライブラリ Kerasを試してみる

はじめに

これは、TensorFlow Advent Calendar 2016の16日目の記事です。

本当は、Tensorflowで足し算をやりたかったのですが、間に合いませんでした。足し算といっても桁上りがあるので簡単ではなさそうです。
下記サイトのNPI(Neural Programmer-Interpreters)とか理解できるようになりたいところ。 qiita.com

私がTensorFlowをやるようになったのは、静岡Developers勉強会で2016/4/23「人工知能ハンズオン」を開催するためでした。ともかく流行りで話題になっているのを勉強会として企画したんですが、何も分からない状態で数週間前から準備しただけですから、勢いだけで良くやったよねって感じです。
その時のTensorFlowのインストール記事だけが、未だにアクセス数を稼いでいます。 yaju3d.hatenablog.jp

勢いでやっただけで人工知能は凄いとは思いつつも、数学も苦手だし普通のWindowsのノートPCしかない、MNISTの手書き文字の認識率が高くなったからって何が楽しいのってことでモチベーション的には停滞してました。

そんな中でJoel Grusさんの「Fizz Buzz in Tensorflow」の記事を知ることになります。 これは、プログラマー採用試験としてFizzBuzz問題のプログラムを書きなさいというIT会社面接官に対して「では、まずTensorFlowをインポートします…」というジョークとして話題になりました。つまり人工知能によってFizzBuzz問題を解くという更に高度な提案をしたわけです。
実際に試してみて数分くらいで結果が出て、これは面白いと思いました。これがTensorFlowにちゃんと向き合うきっかけになりました。
FizzBuzz問題Deep Learning入門としては良い題材と思います。 yaju3d.hatenablog.jp

では、本題に入ります。

Keras とは

KerasはPython製の深層学習ライブラリです。バックエンドとしてTheanoとTensorflowの両方が使え、より高レイヤな表現で深層学習のさまざまなアルゴリズムが記述できる。インドネシア語でkerasは"強い"や"硬い"を意味する ギリシャ語で"角"を意味するそうで読み方は「ケラス」です。
メイン開発者はGoogleのFrançois Chollet(フランソワ・ショレ)さんで迅速な実験を可能にすることに重点を置いて開発されました。 Tensorflowの上位ラッパーライブラリなので、今後はTensorflowよりkerasで書かれたソースが多くなることでしょう。

Keras のインストール

TensorFlow 0.12からWindowsをサポートしたので、Windows版で行います。「TensorFlow 0.12.0rc1」となります。

yaju3d.hatenablog.jp

(tensorenv) c:\Anaconda3>pip install keras

Kerasのインストールエラー

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

numpy.distutils.system_info.NotFoundError: no lapack/blas resources found

scipyが悪さしているようなのでインストールします。「pip install Scipy」ではエラーとなったため、「conda install scipy」でインストールしました。その後に再度、「pip install keras」とします。

(tensorenv) c:\Anaconda3>conda install scipy
The following NEW packages will be INSTALLED:

    mkl:   11.3.3-1
    numpy: 1.11.2-py35_0
    scipy: 0.18.1-np111py35_0

Proceed ([y]/n)? y


(tensorenv) c:\Anaconda3>pip install keras
Collecting keras
Collecting theano (from keras)
Collecting pyyaml (from keras)
  Using cached PyYAML-3.12-cp35-cp35m-win_amd64.whl
Requirement already satisfied: six in c:\anaconda3\envs\tensorenv\lib\site-packa
ges (from keras)
Requirement already satisfied: numpy>=1.7.1 in c:\anaconda3\envs\tensorenv\lib\s
ite-packages (from theano->keras)
Requirement already satisfied: scipy>=0.11 in c:\anaconda3\envs\tensorenv\lib\si
te-packages (from theano->keras)
Installing collected packages: theano, pyyaml, keras
Successfully installed keras-1.1.2 pyyaml-3.12 theano-0.8.2

設定ファイルの書き換え

kerasのバックエンドのデフォルトは「Theano」になっていますので、「Tensorflow」に設定ファイルを書き換えます。
設定ファイルは「import keras」を実行した際に作られます。 作られる場所は、下記コマンドで知ることが出来ます。pythonは「CTRL + Z」で停止します。

(tensorenv) C:\Anaconda3>python
Python 3.5.2 |Anaconda 4.2.0 (64-bit)| (default, Jul  5 2016, 11:41:13) [MSC v.1900 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import os
>>> print(os.path.expanduser('~'))
C:\Users\(ユーザー)

「import keras」を実行します。最初に「ImportError: No module named ‘keras'」と出たので、「Anaconda Prompt」を起動し直しました。
pythonは「CTRL + Z」で停止します。

(tensorenv) C:\Anaconda3>python
Python 3.5.2 |Anaconda 4.2.0 (64-bit)| (default, Jul  5 2016, 11:41:13) [MSC v.1900 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import keras
Using TensorFlow backend.

C:\Users(ユーザー).keras\keras.jsonファイルを開きます。
“backend”: “theano” → "tensorflow" に変更します。

{
    "image_dim_ordering": "tf",
    "backend": "tensorflow",
    "floatx": "float32",
    "epsilon": 1e-07
}

Keras の動作確認

jupyter notebook を起動します。

(tensorenv) C:\Anaconda3>jupyter notebook

「keras XOR」で検索して見つけたサイトstewartpark/xor.pyソースコードを変更して「AND」に変更してみました。これは「nb_epoch=1000」だと、jupyter notebook上では応答なしになるし、「XOR」だとnb_epochの値を少なくすると正しい値にならないためです。

論理演算をするのに下記サイトではTFLearnという別のライブラリーですが参考になると思います。

qiita.com

清水 亮さんの「はじめての深層学習(ディープラーニング)プログラミング Kindle版」でも論理演算を入門として扱っています。

from keras.models import Sequential
from keras.layers.core import Dense, Dropout, Activation
from keras.optimizers import SGD
import numpy as np 

X = np.array([[0,0],[0,1],[1,0],[1,1]])
y = np.array([[0],[0],[0],[1]])

model = Sequential()
model.add(Dense(8, input_dim=2))
model.add(Activation('tanh'))
model.add(Dense(1))
model.add(Activation('sigmoid'))

sgd = SGD(lr=0.1)
model.compile(loss='binary_crossentropy', optimizer=sgd)

model.fit(X, y, show_accuracy=True, batch_size=1, nb_epoch=100)
print(model.predict_proba(X))

結果ですが、1と1の組み合わせでは0.94108927と1に近い値となっています。他の「OR」や「NAND」や「XOR」もやってみるといいでしょう。

Epoch 100/100
4/4 [==============================] - 0s - loss: 0.0367     
4/4 [==============================] - 0s
[[ 0.0010068 ]
 [ 0.03769387]
 [ 0.03732052]
 [ 0.94108927]]

最後に

TensorFlowにちゃんと向き合うきっかけになった。Joel GrusさんのFizzBuzz問題pydata-chicago 2016の説明用に「keras」を使っています。 github.com www.youtube.com

ちなみにJoel GrusさんのFizzBuzzを動かすのに、下記のインストールが必要でした。

pip install matplotlib
pip install pillow
pip install pyqt5
conda install pyqt=4
conda install h5py

自分としては、FizzBuzzや論理演算や足し算など身近で分かりやすい題材で人工知能に向き合っていくつもりです。下記のような小ネタもたまにはやります。 yaju3d.hatenablog.jp

線形回帰で二乗和を2で割る理由について

はじめに

これは、機械学習に必要な高校数学やり直しアドベントカレンダー Advent Calendar 2016の10日目の記事です。

線形回帰 ー 誤差の和の式(データ個数 n 個の場合)

\displaystyle E(\theta)=\frac{1}{2}\sum_{i=1}^{n}(y^{(i)}-f\theta(x^{(i)}))^2

2乗することに関しては、以前書いた下記の記事にてピタゴラスの定理で距離を求めるという理解を得ることが出来ました。
正の数と負の数が混ざっていると都合が悪いから、必ず正の数にするために2乗するってことです。
それなら絶対値を取った値でもいいと思われるが、目的関数を微分することになった時に絶対値の微分より2乗の微分の方が簡単になる。
絶対値だと微分ができない場所があるのと、場合分けをしないといけないから面倒なのです。 yaju3d.hatenablog.jp

でも、全体を 2 で割ってる理由はなんだろうという疑問を持ちました。

経緯

「やる夫で学ぶ機械学習 - 単回帰問題 -」とgihyo.jpの「機械学習 はじめよう 第9回 線形回帰」も、全体を 2 で割る理由について、もやっとする感じな書き方なんです。

全体を 2 で割るのが、やる夫が言っているように「おまじない的なものは気持ち悪いお…、」なんです。本筋ではないので記事的に省略するのは仕方ないですけどね。

やる夫
全体を 2 で割ってるのは何だお?

やらない夫
後で E(θ) を微分することになるんだが、微分した式をちょっとだけ簡単にするためのトリックだ。最適化問題は、何か定数が全体に掛かっていたとしても、求まる答えは変わらないからこういうことができる。まあ、あまり深く考えなくていいさ。

やる夫
おまじない的なものは気持ち悪いお…、うーん、全体像はわかったけど、ちょっと、まだピンときてないお。
出典:やる夫で学ぶ機械学習 - 単回帰問題 -

ただし一般的な記法にあわせて,二乗和を2で割ったものを使います(注1)。
注1
2で割っていることは今回の範囲では全く本質的ではないのですが,次回以降の話との整合性のためにこの形式を用います。
出典: 機械学習 はじめよう 第9回 線形回帰[後編]

調査

ネットで数時間かけて検索してみたのですが、ぜんぜん見つからないです(笑)。こういう時は人に頼るということで、 Yahoo!知恵袋に質問しました。

線形回帰の求め方で二乗和を2で割るの理由? - 数学 | Yahoo!知恵袋

2人から回答をいただきました。その内の1人はブログに書き起こしくれました。 勉強会で知り合った@K_Ryuichirouさんです。 線形回帰の求め方で二乗和を2で割る理由 - Qiita

では、解決したのかというとそうではなく、理解する知識がまだ自分にはなかったのです、まずは微分を理解する必要があります。

理解

Yahoo!知恵袋のzatsugakusanさんの回答を一部抜粋すれば

例えば

f(x)=(x-1)2

を最小にするxを求めればx=1となりますが、

f(x)=100(x-1)2

を最小にするxを求めてもx=1になります。

二乗和の式をこれから微分すると分かっているのですから、微分して「2」が出てくることも予めわかっています。

ですから、二乗和の損失関数に1/2を掛けていれば微分したときに消えてくれるのでそうしておく。ただそれだけのことです。そうして求まるパラメータ自体には何の影響もありません。
「2で割るのは、単に二乗和が微分したら2が出てくることが分かっているからです。」

導関数の定義では、二次関数 y=x^2微分すると y=2x になる。

参照:

この2を打ち消すということだが、まだピンとこない。

修正量による考え

修正された値をxとし、2つの計測値を a_1a_2とする。それぞれの計測値に修正を加える修正量を v_1v_2とした場合、これらの間には「計測値+修正量=修正された計測値」の関係が成り立ち、これを数式にしてみる。

a_1 + v_1 = x
a_2 + v_2 = x

これらを修正量=・・・の形式に書き換えます。

v_1 = x - a_1
v_2 = x - a_2

これを修正量の2乗の総和を S とすれば次のように計算できる。

S = v_1^2 + v_2^2
  = (x-a_1)^2 + (x-a_2)^2
  = 2x^2 - 2(a_1+a_2)x + a_1^2 + a_2^2

総和 S は、二次関数になるのでグラフが下向きの放物線になります。 そして、放物線の頂点が最小値ということになります。 総和 S を x で微分した上で「微分した値 = 0」とすれば目的の値を求めると次のような計算になります。

\displaystyle \frac{dS}{dx}=4x-2(a_1+a_2)=0

\displaystyle 4x=2(a_1+a_2)

\displaystyle 2x=(a_1+a_2)

\displaystyle x=\frac{(a_1+a_2)}{2}

f:id:Yaju3D:20161209030620p:plain

よって、最小値は図の赤丸のところで下記の式となる。

\displaystyle x = \frac{(a_1+a_2)}{2}

これはa_1a_2の平均である。

でも、これは平均でたまたま2つだから2で割っただけで、3つになったら意味が違うかも知れない。

参照: わかりやすい測量の数学 ―行列と最小二乗法― 著者: 小白井 亮一 Kindle版

微分係数とは何か

f(x)=(x-1)2

を最小にするxを求めればx=1となりますが、

f(x)=100(x-1)2

を最小にするxを求めてもx=1になります。

つまり、最小値に微分係数は関係ないようだ。そこで微分係数で検索していたら下記サイトを見つけた。

微分係数は、ある点における接線の傾きともいうことができます。虫めがねの図を思い出してください。
最小値をとるところ、つまり、x=0では接線の傾き(=微分係数)はどうなりますか?
・・・接線は水平になりますね。
ということは、傾きは・・・ 0ですね。
だから、微分係数が0になる点が最小値(yの値ですよ。)になるのです。

参照:6.微分の応用

http://www.minc.ne.jp/~ryokan/bibun/bibun26.gif

結論

微分係数はある点における接線の傾きで最小値は水平となるので、微分係数は無視してx=0を代入した値が最小値となる。

二乗和を微分したら微分係数に2が付くけど、微分係数は無視するので求まる答えは変わらない。
微分係数2は数式上は1/2を掛けて(2で割る)相殺しておくことが、数学として一般的な記法なっているということです。

最後に

これで、やらない夫の「何か定数が全体に掛かっていたとしても、求まる答えは変わらない」とYahoo!知恵袋のzatsugakusanさんの「2で割るのは、単に二乗和が微分したら2が出てくることが分かっているからです。」が分かったような気がします。

ただ、理解が間違っていたらご教示ください。

追記(2017/09/01)

実際に計算した結果をみると理解しやすいです。

yaju3d.hatenablog.jp 上記サイトでリンゴとミカンの最小値はリンゴ90円とミカン30円ですが、今回は求める上で2乗誤差の平均値を使ったので3で割っています。別に平均値ではなく合計値のままでもいいし、公式通りに1/2にしてもいいです。でも求まる最小値はリンゴ90円とミカン30円で結果は変わらない。 数学の通例として公式では1/2にしているだけです。

追記(2019/03/24)

もう少しいい説明として下記の本を参考にしました。

今回の式は目的関数と呼ばれるもの。

\displaystyle E(\theta)=\frac{1}{2}\sum_{i=1}^{n}(y^{(i)}-f\theta(x^{(i)}))^2

E(\theta)E は、誤差を英語で言った時の Error の値を文字から取っている。
この E(\theta) の値が一番小さくなるような \theta を見つけるのが目的で、こういうのを最適化問題という。

今回のように勝手に定数 \displaystyle\frac{1}{2} を掛けてもの問題ないのは、誤差 E を求めるのではなく最小値を求めるのが目的だから。

下図の f(x)=x^{2}のグラフで左側の場合の最小値は x=0 、定数を掛けた f(x)=\displaystyle\frac{1}{2}x^{2}のグラフで右側の場合の最小値も同じように x=0 となる。
f:id:Yaju3D:20190324150422p:plain

正の定数を掛けてもグラフの形が横に潰れたり縦に細くなるだけで、どこで最小値になるのかという場所は変わらない。
よって、 f(x)=x^{2}微分した時の微分係数 2 は数式上は \displaystyle\frac{1}{2} を掛けて( 2 で割る)相殺しておくことが、数学として一般的な記法なっている。

TensorFlowがWindowsサポートしたのでインストールしてみた

はじめに

TensorFlow 0.12からWindowsをサポートするようになりました。これにより、VirtualBoxやDockerを使う必要がなくなります。

【追記 2017/03/02】
2017/02/16にTensorFlow 1.00がリリースされました、遅ればせながら今回TensorFlowをバージョンアップしました。

【追記 2017/11/25】
2017/11/08にTensorFlow 1.40がリリースされました、遅ればせながら今回TensorFlowをバージョンアップしました。
TensorFlow 1.4.0 リリースノート(翻訳)

(tensorenv) C:\Users\(ユーザー)>pip install --ignore-installed --upgrade tensorflow 

(tensorenv) C:\Users\(ユーザー)>python -c "import tensorflow; print(tensorflow.__version__);"
1.4.0

※TensorFlow(読み方:テンソルフローではなくテンサーフロー 参照:https://togetter.com/li/1027115)

qiita.com

yaju3d.hatenablog.jp

TensorFlowバージョンアップによる変更点

【追記 2017/03/08】
過去ブログのTensorFlow用プログラムでは、TensorFlowバージョンアップによりエラーや警告が出ますので、下記の点を修正してください。

tensorflow 1.0 error: ValueError: Only call sigmoid_cross_entropy_with_logits with named arguments (labels=..., logits=..., ...)
https://github.com/tensorflow/tensorflow/issues/7814

tf.nn.sigmoid_cross_entropy_with_logits(u, y_)
↓ labels=, logits=を付ける
tf.nn.sigmoid_cross_entropy_with_logits(logits=u, labels=y_)

TensorFlowのinitialize_all_variablesがDeprecatedになった件

tf.initialize_all_variables
↓ 置き換える
tf.global_variables_initializer

環境

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

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

下記サイトからAnaconda 4.2.0 For Windows PYTHON 3.5 64-BITをダウンロードしてください。
2017/11/25現在では、Anaconda 5.0.1になっています。
https://www.continuum.io/downloads#windows

自分は、「C:\Anaconda3」をインストール先にしました。

Anacondaのアップデート

2017/11/25現在では、Anaconda 5.0.1になっているので、全パッケージをアップデートしてみました。

(C:\Anaconda3) > conda list anaconda
# packages in environment at C:\Anaconda3:
#
anaconda                  4.2.0               np111py35_0
anaconda-clean            1.0.0                    py35_0
anaconda-client           1.5.1                    py35_0
anaconda-navigator        1.3.1                    py35_0
nb_anacondacloud          1.2.0                    py35_0

下記コマンドを入力して、20~30分待ちます。
パッケージ管理を行う conda 自身を更新してから、他のパッケージを更新します。
通信エラーが出たら、再度「conda update --all」をします。

(C:\Anaconda3) > conda update conda
(C:\Anaconda3) > conda update --all

anacondaのバージョンがcustomになってしまったので、「conda update anaconda」を追加しました。

(C:\Anaconda3) > conda list anaconda
# packages in environment at C:\Anaconda3:
#
anaconda                  5.0.0            py35h91a80f2_0
anaconda-clean            1.1.0                    py35_0
anaconda-client           1.6.5            py35h18499f7_0
anaconda-navigator        1.6.8            py35h84e1151_0
anaconda-project          0.8.0            py35h54b767f_0
nb_anacondacloud          1.4.0                    py35_0

AnacondaのTensorflow用環境を作成

Anaconda3 (64-bit)メニュー配下から「Anaconda Prompt」を選択します。

使用していくうちに開発環境を使い分けたい場合(共存できないライブラリがあったり新しいライブラリを試したいなど)がでてきます。そのような場合に環境管理システム(virtualenvやpyvenv)を使うのですが、Anacondaにはその上位版としてパッケージ管理システム(conda)があります。
参照:データサイエンティストを目指す人のpython環境構築 2016
今現在は開発環境を使い分ける必要がない方は、下記の「conda create」の作業は不要です。
「TensorFlowのインストール」に進んで下さい。

Tensorflow用環境を作成するため、コマンドプロンプト上で下記のコマンドを入力します。
名前は「tensorenv」にしました。envは環境(environment)の略称 ※(ユーザー)のところは各自違います。

(C:\Anaconda3) C:\Users\(ユーザー)> conda create --name=tensorenv python=3.5

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

Fetching package metadata .........
Solving package specifications: ..........

Package plan for installation in environment C:\Anaconda3\envs\tensorenv:

The following packages will be downloaded:

    package                    |            build
    ---------------------------|-----------------
    pip-9.0.1                  |           py35_0         1.7 MB

The following NEW packages will be INSTALLED:

    pip:            9.0.1-py35_0
    python:         3.5.2-0
    setuptools:     27.2.0-py35_1
    vs2015_runtime: 14.0.25123-0
    wheel:          0.29.0-py35_0

Proceed ([y]/n)? y

Fetching packages ...
pip-9.0.1-py35 100% |###############################| Time: 0:00:02 786.13 kB/s
Extracting packages ...
[      COMPLETE      ]|##################################################| 100%
Linking packages ...
[      COMPLETE      ]|##################################################| 100%
#
# To activate this environment, use:
# > activate tensorenv
#
# To deactivate this environment, use:
# > deactivate tensorenv
#
# * for power-users using bash, you must source
#

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

(C:\Anaconda3) C:\Users\(ユーザー)>conda info -e
# conda environments:
#
tensorenv                C:\Anaconda3\envs\tensorenv
root                  *  C:\Anaconda3

作成した環境を有効にするには下記のコマンドを入力します。
Windows版はsourceコマンドが無いため、activateからとなります。

(C:\Anaconda3) C:\Users\(ユーザー)>activate tensorenv

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

(tensorenv) C:\Users\(ユーザー)>

ちなみに作成した環境から戻るには下記のコマンドを入力します。

(tensorenv) C:\Users\(ユーザー)> deactivate

TensorFlowのインストール

【追記】2017/11/25
TensorFlow 1.40が2017/11/08リリースされました。もはや普通に入れればいい。

(tensorenv) C:\Users\(ユーザー)>pip install --ignore-installed --upgrade tensorflow
Collecting tensorflow
  Using cached tensorflow-1.4.0-cp35-cp35m-win_amd64.whl
 ︙
Successfully installed bleach-1.5.0 enum34-1.1.6 html5lib-0.9999999 markdown-2.6.9 numpy-1.13.3 protobuf-3.5.0.post1 setuptools-37.0.0 six-1.11.0 tensorflow-1.4.0 tensorflow-tensorboard-0.4.0rc3 werkzeug-0.12.2 wheel-0.30.0

Anaconda Navigatorを使えばもっとシンプルでインストールできる。
geeknavi.net

もはや、ごちゃごちゃしてしまっているが、下記はメモとして残しておく。

TensorFlowには、「CPU only」と「GPU enabled」の2種類が用意されています。今回は「CPU only」版をインストールします。 ファイル名はPython35にしているので「tensorflow-(version No)-cp35」となります。 バージョンは現時点(2016/12/06)で最新の「0.12.0」を入れます。

入力が長いのでクリップボードにコピーして貼り付ければいいです。

参照:https://www.tensorflow.org/versions/r0.12/get_started/os_setup.html#pip-installation-on-windows

【追記】2016/12/18
2016/12/18に確認したところ「0.12.0rc1」になっていましたので、下記は書き換えました。

(tensorenv) C:\Users\(ユーザー)>pip install --upgrade https://storage.googleapis.com/tensorflow/windows/cpu/tensorflow-0.12.0rc1-cp35-cp35m-win_amd64.whl

【追記】2017/03/02
2017/02/16にV1.00がリリースされましたのでTensorFlowサイトに従いインストールしてみたところ、下記のエラー(not a supported wheel on this platform)が発生しました。

(tensorenv) C:\Users\(ユーザー)>pip install --ignore-installed --upgrade https://storage.googleapis.com/tensorflow/windows/cpu/tensorflow-1.0.0-cp35-cp35m-win_x86_64.whl

tensorflow-1.0.0-cp35-cp35m-win_x86_64.whl is not a supported wheel on this platform.  

Anaconda用のWindows版でPython3.5のCPU版と何も間違ってないのにプラットフォーム違いなのは何でと、ネットで検索して同様のエラーの方が質問されていました。

stackoverflow.com

ここの回答によると、「win_x86_64.whl」版ではなく「win_amd64.whl」版をインストールしたら成功したとのこと。
下記の通りに無事、tensorflow 1.0.0 にバージョンアップ出来ました。

(tensorenv) C:\Users\(ユーザー)>pip install -U --ignore-installed --upgrade https://storage.googleapis.com/tensorflow/windows/cpu/tensorflow-1.0.0-cp35-cp35m-win_amd64.whl
 ︙
Successfully installed appdirs-1.4.2 numpy-1.12.0 packaging-16.8 protobuf-3.2.0 pyparsing-2.1.10 setuptools-34.3.0 six-1.10.0 tensorflow-1.0.0 wheel-0.29.0

(tensorenv) C:\Users\(ユーザー)>python -c "import tensorflow; print(tensorflow.__version__);"
1.0.0

ちなみに拡張子「whl」はWheelの略で、Wheelとは最近になって導入された Python の新しいパッケージング規格です。whlファイルは単なる ZIP アーカイブなので unzip コマンドなどを使って容易に中身を見ることができます。
wheelはコンパイル済みのバイナリファイルを含むことができるのが大きな特徴です。
pip installするとその場でライブラリのコンパイルが走るのですが、コンパイル環境が無い場合はエラーでコケルというデメリットがあります。最近の pip が新しいパッケージング規格である Wheel をこっそりと裏側で使っています。 参照:Python: pip と Wheel キャッシュについて

インストールされます。(下記以降は記事当初の「0.12.0rc0」のままです。)

Collecting tensorflow==0.12.0rc0 from https://storage.googleapis.com/tensorflow/windows/cpu/tensorflow-0.12.0rc0-cp35-cp35m-win_amd64.whl
  Downloading https://storage.googleapis.com/tensorflow/windows/cpu/tensorflow-0.12.0rc1-cp35-cp35m-win_amd64.whl (12.2MB)
    100% |################################| 12.2MB 27kB/s
Collecting six>=1.10.0 (from tensorflow==0.12.0rc0)
  Downloading six-1.10.0-py2.py3-none-any.whl
Collecting protobuf==3.1.0 (from tensorflow==0.12.0rc0)
  Downloading protobuf-3.1.0-py2.py3-none-any.whl (339kB)
    100% |################################| 348kB 475kB/s
Collecting numpy>=1.11.0 (from tensorflow==0.12.0rc0)
  Downloading numpy-1.11.2-cp35-none-win_amd64.whl (7.6MB)
    100% |################################| 7.6MB 38kB/s
Requirement already up-to-date: wheel>=0.26 in c:\anaconda3\envs\tensorenv\lib\site-packages (from tensorflow==0.12.0rc0)
Collecting setuptools (from protobuf==3.1.0->tensorflow==0.12.0rc0)
  Downloading setuptools-30.2.0-py2.py3-none-any.whl (472kB)
    100% |################################| 481kB 396kB/s
Installing collected packages: six, setuptools, protobuf, numpy, tensorflow
  Found existing installation: setuptools 27.2.0

TensorFlowのインストールエラー

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

Cannot remove entries from nonexistent file c:\anaconda3\envs\tensorenv\lib\site-packages\easy-install.pth

パッケージの依存関係のコンフリクトが原因のようで、下記サイトの「2. pip で setuptools を TensorFlow と互換性があるものに upgrade する」で対応します。※下記サイトは、mac版です。
datalove.hatenadiary.jp

よって、下記コマンドを入力して再インストールします。
pip自体のupgradeが必要かも知れません。先に「pip install --upgrade pip」を実行するといいでしょう。
Permission Errorが発生した場合は、「python -m pip install --upgrade pip」 にする。

(tensorenv) C:\Users\(ユーザー)>pip install --upgrade -I setuptools
Collecting setuptools
  Using cached setuptools-30.2.0-py2.py3-none-any.whl
Installing collected packages: setuptools
Successfully installed setuptools-30.2.0


(tensorenv) C:\Users\(ユーザー)>pip install --upgrade https://storage.googleapis.com/tensorflow/windows/cpu/tensorflow-0.12.0rc0-cp35-cp35m-win_amd64.whl
Collecting tensorflow==0.12.0rc0 from https://storage.googleapis.com/tensorflow/windows/cpu/tensorflow-0.12.0rc0-cp35-cp35m-win_amd64.whl
  Using cached https://storage.googleapis.com/tensorflow/windows/cpu/tensorflow-0.12.0rc0-cp35-cp35m-win_amd64.whl
Collecting numpy>=1.11.0 (from tensorflow==0.12.0rc0)
  Using cached numpy-1.11.2-cp35-none-win_amd64.whl
Collecting protobuf==3.1.0 (from tensorflow==0.12.0rc0)
  Using cached protobuf-3.1.0-py2.py3-none-any.whl
Requirement already up-to-date: wheel>=0.26 in c:\anaconda3\envs\tensorenv\lib\site-packages (from tensorflow==0.12.0rc0)
Requirement already up-to-date: six>=1.10.0 in c:\anaconda3\envs\tensorenv\lib\site-packages (from tensorflow==0.12.0rc0)
Requirement already up-to-date: setuptools in c:\anaconda3\envs\tensorenv\lib\site-packages (from protobuf==3.1.0->tensorflow==0.12.0rc0)
Installing collected packages: numpy, protobuf, tensorflow
Successfully installed numpy-1.11.2 protobuf-3.1.0 tensorflow-0.12.0rc0

TensorFlowの動作確認

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

(tensorenv) C:\Users\(ユーザー)>python -c "import tensorflow; print(tensorflow.__version__);"
0.12.0-rc0

Jupyter Notebookのインストール

Web上の実行環境である「Jupyter Notebook」はAnacondaと同時にインストールされているのですが、自分はTensorFlow専用の環境(tensorenv)を作成しているため、インストールする必要があるようです。そうしないと、「ImportError: No module named tensoflow」となります。

(tensorenv) C:\Users\(ユーザー)>pip install jupyter 

【追記】2017/11/25
新しいバージョンでは専用に環境作成しても、 既にインストール済みとなります。

(tensorenv) C:\Users\(ユーザー)>pip install jupyter 
Requirement already satisfied: jupyter in c:\anaconda3\lib\site-packages

Jupyterの起動

カレントフォルダを移動しておきます。

(tensorenv) C:\Users\(ユーザー)>cd C:\Anaconda3 
(tensorenv) C:\Anaconda3 >jupyter notebook

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

更にtensorenvフォルダ配下に移動して、右横の「New」で新規ファイルを「Python 3」で作成します f:id:Yaju3D:20161206022344p: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:20161206023119p:plain

TensorBoardの可視化

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

WindowsでのTensorBoardですが、TensorFlowのバージョンが「0.12.0rc0」では動作しないので「0.12.0rc1」にしてください。
※2016/12/18以降なら「0.12.0rc1」になっています。

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

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)

これを実行すると、ログがフォルダ(C:\Anaconda3/envs/tensorenv/log)に出力されます。

f:id:Yaju3D:20161218235453p:plain

TensorBoardの実行

WindowsでのJupyter notebook上ではTerminalがありません。 その為、「Anaconda Prompt」をもう1つ起動します。

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

(C:\Anaconda3) C:\Users\(ユーザー)>activate tensorenv

(tensorenv) C:\Users\(ユーザー)>cd c:\Anaconda3

(tensorenv) c:\Anaconda3>tensorboard --logdir=c:\anaconda3\envs/tensorenv/log
Starting TensorBoard b'39' on port 6006
(You can navigate to http://192.168.99.1:6006)

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

localhost:6006/

f:id:Yaju3D:20161219000417p:plain

最後に

ようやっとWindowsをサポートされることになりましたが、いろいろやっていくと不足しているところが出てくるかも知れませんね。

VirtualBoxにUbuntu16.04 LTS と TensorFlow をインストール

はじめに

日本語形態素解析システム「JUMAN++」をインストールするために、久しぶりにVirtualBoxのUbuntuを使ったのですが、各システムのバージョンも古くなってきているので新規にインストールし直します。
以前書いた下記の記事(2016年3月27日)を基にインストールをしたのですが、バージョンが新しくなって記事内容があわなくなってきたので書き直しました。 yaju3d.hatenablog.jp

環境

  • Windows 10 Home 64bit
  • Oracle VM VirtualBox 5.1.10

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

下記サイトを参考にVirtualBoxにUbuntu 16.04 LTSをインストールしました。 サイトとの違いとして、メモリは2048MByte、仮想ハードドライブサイズは20GByteにしています。 qiita.com 仮想ハードドライブサイズは後で変更することが出来ますが、面倒なので最初からそれなりの大きさにしておきましょう。 qiita.com

画面サイズは1024x768になっています。

インストール時のエラー

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」にして保存後に再起動する必要があります

Guest Additionsのインストール

Guest Additionsは、ビデオ性能の向上、共有フォルダ、クリップボード共有等の機能を提供するVirtualBoxの追加コンポーネントです。
Guest Additionsインストール前だとUbuntu 16.04のディスプレイ解像度は2種類だけですが、インストール後だと任意の解像度に変更できます。

VirtualBoxのメニューのデバイスにある「Guest Additions CD イメージの挿入」をクリックします。インストールが成功したら、Ubuntu 16.04を再起動します。

Ubuntu 16.04: VirtualBox上のUbuntu 16.04にGuest Additionsをインストールする - Narrow Escape

クリップボードの共有

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

ターミナルの起動

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

pipのインストール

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

$ sudo apt-get install python-pip
$ pip install --upgrade 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-4.2.0-Linux-x86_64.sh」をドラッグ&ドロップしました。引用符は付いたままでもいいかも知れませんが、一応消しました。

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

AnacondaのTensorflow用環境を作成

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

Tensorflow用環境を作成するため、ターミナル上で下記のコマンドを入力します。
名前は「tensorenv」にしました。envは環境(environment)の略称

$ conda create --name=tensorenv python=3.5

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

The following NEW packages will be INSTALLED:

    openssl:    1.0.2j-0     
    pip:        9.0.1-py35_0 
    python:     3.5.2-0      
    readline:   6.2-2        
    setuptools: 27.2.0-py35_0
    sqlite:     3.13.0-0     
    tk:         8.5.18-0     
    wheel:      0.29.0-py35_0
    xz:         5.2.2-0      
    zlib:       1.2.8-3      

Proceed ([y]/n)? y

Fetching packages ...
pip-9.0.1-py35 100% |################################| Time: 0:00:02 742.12 kB/s
Extracting packages ...
[      COMPLETE      ]|###################################################| 100%
Linking packages ...
[      COMPLETE      ]|###################################################| 100%
#
# To activate this environment, use:
# > source activate tensorenv
#
# To deactivate this environment, use:
# > source deactivate tensorenv
#

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

$ 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)$

ちなみに作成した環境から戻るには下記のコマンドを入力します。

(tensorenv)$ source deactivate

TensorFlowのインストール

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

参照:https://www.tensorflow.org/versions/r0.11/get_started/os_setup.html

(tensorenv)$ pip install --upgrade https://storage.googleapis.com/tensorflow/linux/cpu/tensorflow-0.11.0-cp35-cp35m-linux_x86_64.whl

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

Collecting tensorflow==0.11.0 from https://storage.googleapis.com/tensorflow/linux/cpu/tensorflow-0.11.0-cp35-cp35m-linux_x86_64.whl
  Downloading https://storage.googleapis.com/tensorflow/linux/cpu/tensorflow-0.11.0-cp35-cp35m-linux_x86_64.whl (39.8MB)
    100% |████████████████████████████████| 39.8MB 9.8kB/s 
Requirement already up-to-date: wheel>=0.26 in ./anaconda3/envs/tensorenv/lib/python3.5/site-packages (from tensorflow==0.11.0)
Collecting protobuf==3.0.0 (from tensorflow==0.11.0)
  Downloading protobuf-3.0.0-py2.py3-none-any.whl (342kB)
    100% |████████████████████████████████| 348kB 258kB/s 
Collecting six>=1.10.0 (from tensorflow==0.11.0)
  Downloading six-1.10.0-py2.py3-none-any.whl
Collecting numpy>=1.11.0 (from tensorflow==0.11.0)
  Downloading numpy-1.11.2-cp35-cp35m-manylinux1_x86_64.whl (15.6MB)
    100% |████████████████████████████████| 15.6MB 22kB/s 
Collecting setuptools (from protobuf==3.0.0->tensorflow==0.11.0)
  Downloading setuptools-29.0.1-py2.py3-none-any.whl (472kB)
    100% |████████████████████████████████| 481kB 290kB/s 
Installing collected packages: setuptools, six, protobuf, numpy, tensorflow
  Found existing installation: setuptools 27.2.0

TensorFlowのインストールエラー

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

Cannot remove entries from nonexistent file /home/yaju/anaconda3/envs/tensorenv/lib/python3.5/site-packages/easy-install.pth

パッケージの依存関係のコンフリクトが原因のようで、下記サイトの「2. pip で setuptools を TensorFlow と互換性があるものに upgrade する」で対応します。※下記サイトは、mac版です。
datalove.hatenadiary.jp

よって、下記コマンドを入力して再インストールします。

(tensorenv)$ pip install --upgrade -I setuptools
Collecting setuptools
  Using cached setuptools-29.0.1-py2.py3-none-any.whl
Installing collected packages: setuptools
Successfully installed setuptools-29.0.1

(tensorenv)$ pip install --upgrade https://storage.googleapis.com/tensorflow/linux/cpu/tensorflow-0.11.0-cp35-cp35m-linux_x86_64.whl
 ︙
Successfully installed numpy-1.11.2 protobuf-3.0.0 six-1.10.0 tensorflow-0.11.0

TensorFlowの動作確認

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

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

0.11.0

最後に

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

これ以降は下記サイトを参考にして下さい。Web上の実行環境である「Jupyter Notebook」はAnacondaと同時にインストールされています。
yaju3d.hatenablog.jp

スポンサーリンク