tetsunosukeのnotebook

tetsunosukeのメモです

tensorflowを手早く試したい

Windows でもTensorflowしたい!

会社の人が Tensorflow 触ってみたいというから・・・。

必要なもの

セットアップ作業

tensorflow-ipy をダウンロード。HTTPSとかZIPとかGitとかは好きにして。

あとは書いてあることに従う。

> vagrant up

すると、ubuntu/trusty64をダウンロードして起動したり、必要なライブラリとかをばしばしいれてくれる。待ち時間およそ15分(ネットワーク回線の速度によるところが大きい)

特に

==> default: Notice: /Stage[main/ ..,.

とか出てるあたりが長いから覚悟しろ。

==> default: Notice: Finished catalog run in ...

とか出たら終わり。

触ってみる

これもドキュメントに書いてある。

> vagrant ssh

こっから先はUbuntuの作業だ。

vagrant@tensorflow-ipy:~$

はじめのサンプル

この作業をすれば、 /vagrant/python/first-tensorflow.py ってのが入ってる。

$ python /vagrant/python/first-tensorflow.py 
I tensorflow/core/common_runtime/local_device.cc:25] Local device intra op parallelism threads: 1
I tensorflow/core/common_runtime/local_session.cc:45] Local session inter op parallelism threads: 1
Hello, TensorFlow!
42

これは、 Run TensorFlow from the Command Line と同じだ。

楽しくないから画像分類やるぞ!

github.com

これコピーしてくる。できたら、

$ python classify_image.py

すると

$ python classify_image.py 
>> Downloading inception-2015-12-05.tgz 100.0%()
('Succesfully downloaded', 'inception-2015-12-05.tgz', 88931400, 'bytes.')
I tensorflow/core/common_runtime/local_device.cc:25] Local device intra op parallelism threads: 1
I tensorflow/core/common_runtime/local_session.cc:45] Local session inter op parallelism threads: 1
giant panda, panda, panda bear, coon bear, Ailuropoda melanoleuca (score = 0.89233)
indri, indris, Indri indri, Indri brevicaudatus (score = 0.00859)
lesser panda, red panda, panda, bear cat, cat bear, Ailurus fulgens (score = 0.00264)
custard apple (score = 0.00141)
earthstar (score = 0.00107)

おもむろにパンダの画像を分類した結果を返してくるぞ。

適当にちょうちょの画像でも持ってきて

https://raw.githubusercontent.com/Itseez/opencv/master/samples/data/butterfly.jpg

$ python classify_image.py --image butterfly.jpg
I tensorflow/core/common_runtime/local_device.cc:25] Local device intra op parallelism threads: 1
I tensorflow/core/common_runtime/local_session.cc:45] Local session inter op parallelism threads: 1
admiral (score = 0.60748)
lycaenid, lycaenid butterfly (score = 0.09707)
monarch, monarch butterfly, milkweed butterfly, Danaus plexippus (score = 0.07980)
ringlet, ringlet butterfly (score = 0.02835)
lacewing, lacewing fly (score = 0.00367)

微妙に頭悪いな!

以上。

2015年を振り返る

「忘れる必要があるほど何かを成し遂げた感じもしない一年」みたいな忘年会を開きましたが、いろいろと列挙してみると、特に仕事の上ではいろいろなことがあった一年だったような気がする。

というわけで、久々の(というかこれしか書かない)1年の振り返り。

会社でQiita:Teamを導入したので、インターネットに向けて何かアウトプットをする、みたいな習慣がなくなってしまった。データに関するセミナー等でよく感じるのですが、社内のデータに関しては外に出すことができないので、外に出せないデータを分析している方法などは、ノウハウの抽象化が難しくてアウトプットしにくい。。。

主に心身の変化

疲れた

「休まらない」感じのある一年でした。「休む」「楽しむ」ことに対しての罪悪感が強くなってしまったことが一つの大きな原因。

そんなこともあって、「ストレスとのつきあい方」を変えるべく読んでいるのがこの本。
まだ読み終わっていないけどアプローチがとても興味深い。
特にストレスのある環境において、自分に発生しやすい傾向(例えばオキシトシンの不足により、人との交流をどんどん避ける方向へ行ってしまう)に対しての自覚を正しく持ち、その対策を打てるようになる気がする、という面がある。

スタンフォードのストレスを力に変える教科書

スタンフォードのストレスを力に変える教科書

6月に業務過多などの関係でストレスがとてもたまってしまい、気分転換のスポーツや遊びに行くなどを試みたら財布を落としてしまったりと、小さな疲れの積み重ねが大きなミスを呼ぶなどの典型をぶちかましてしまい、ほんとうに良くなかった。

人を信用出来ない

これは主に仕事上の問題なのだけど、良い意味で信用していない(きちんとチェックするように心がける)という部分ももちろんあるけど、「この人は自分を仕事上の関係でメリットがあるからという側面でのみ付き合ってくれているんだ」と思うようなことがとても多く(ある程度の割合で上記ストレス状態の影響でそう思い込んでしまう部分がある)、そういう意味でも「あまり信用出来ないと思った人と深く付き合うのをやめる」というところに達した。

いわば、「あなたのことを幸せにしてくれない人のことをあなたが幸せにする必要はない」という感じ。多くの「誤魔化し」や「言い訳」を目にして、うんざりしたというのも、「自身が過剰に期待してしまっている」ということだと思うので、そこからは一旦距離を置かないとと思う。


講演会やドラマや漫画の影響

今年聞いて良かったなと思ったのは

  • 「絶対にやったほうが良いという衝動的な気持ち」で動きましょう
  • 「夢はゴールではなくスタートである」

ということ話でした。また、ドラマ「下町ロケット」を見ていて「全社員が心から拍手できるようなこと」を成し遂げられるような何かを推進できるようにならなくてはいけないな、という気持ちがとても強くなりました。

どうしても緊急ではなく重要なこと、ということに時間を割けなくなってしまうのですが、そのヒントは、「他の人にとっても重要なこと」にも近づけることではないかと思い

note.mu

また、何かを成し遂げるにあたり1人の力ではどうしようもないわけだから、他の人にとって重要な事を知ったり、自分が重要だと思うことをそうであると周りに伝えていかないといけないなということを強く感じました。

仕事

主に、今年は大きく、長めの案件をずっと担当していることが多かった。会社としてもプレスリリースを出せるような案件の多くにメインで関わることができたことは、昨年からの仕込みを含めてよかったことではなかったかと思う。

仕込みからの業務への適応

主にしばらくやっていたこととしては

  • OpenCVなどを用いた画像解析の方法 → DeepLearningフレームワークCaffeに関わる業務
  • GoogleAnalytics個人資格(GAIQ)の取得→UniversalAnalyticsへの以降ならびにE-Commerce活用の設計
  • 統計学機械学習関連 → 類似度ラベリング関連の業務
  • 季節性のあるサービスの運営(企画と分析)

あたりがポイントになった。このあたりはまだまだ知識が不十分ではあるが、特にGAIQの取得に関連したデータ解析・データ評価に関する知見は、部署の異動をすることにもなり、積極的に活かす環境を与えてもらえたのが良かった。同時に、社内での若手の育成という面でも、自身の知見を活かした面からの若手のサポートを継続してできたし、彼らが先へ進む道のうちのいくつかの可能性が提示できたように思う。

環境面では画像解析関連では初めて学会へ参加し(聴講のみだが)、最先端であったり、トレンドであったり、というところを学ぶ機会を与えてもらえたことも良かった。

ワークショップおじさんとしてのキャリアパス

毎年恒例となってきた新入社員研修を今年も担当。

今年は研修のかなり序盤にて、チームビルディングや学習のしかた(経験学習モデル)、ユーザ要求からのニーズの発掘という、より中暑的なテーマでお話とワークをさせていただいた。人前で話すスキルセットは「エバンジェリスト養成講座」の西脇さんの考え方に多く触れて、だいぶ自分の中で体系化されてきた部分もある。(と、同時に、まだまだと気付かされる部分も多い)

こちらは 東京大学のフィーチャーファカルティプログラム「アクティブラーニングの手法」から様々なヒントを得ることができ、新たなワークショップの方法を知ることができた。

ワークショップファシリテータとしての活動は、向こう3年の間にもう少し体系的な学習を進めたいと思う。

techlife.cookpad.com

こちらのブログに書かれているようなことも、自身のキャリアの一つの可能性として考えていきたい。

これとか。

wsd.irc.aoyama.ac.jp


プライベート

「妻の手術」が案外インパクトがあった。あとは「実家の家の契約における連帯保証人」とか。どちらも、ある意味年齢的な面で人生折り返したなという感覚。健康大事・・・。


野球

観戦の回数はちょっと減ってしまったかなと思う。来年はひいきのチームがまた新しい可能性を見せてくれる感じがするので、もう少し見に行きたい。

プレイヤーとしての野球の方は、参加しているリーグのレベルがあがってきてしまったので、真剣に引退を考えている。
野球をすることそのものは好きなので、地域で別の(もう少し年齢層の近い)コミュニティなどを探すなどして、別途運動の機会として活用できればと思う。

謎解き・リアル脱出ゲーム

「倫敦大法廷殺人事件」では脱出成功するなど、だいぶ腕があがった感はある。こちらは来年ももう少しいろいろな講演に参加してみたりしたい。常設型の「エスケープ博士からの挑戦状」などは歯が立たなかったので、参加者間コミュニケーションとかとかも課題かな・・・。

2016年は

いろいろな面で自分の「存在意義」が見えてきたところがあるので、そこに必要なことを意識して吸収していけるようにしたい。
ひとつは、「身近な人を不幸にしない」ということかなと思っている。

実践的には、

  • プロジェクトマネジメントや学習するという行為に対しての具体的な支援

というのが目下。運良く自身が他社や学校などで学べたことを知らない人が多いので、そういう部分はできるだけ伝承しつつ、そのコミュニティにあった方法として根付かせられれば良いなと思う。

2015東大数学問題をPHPで解く(しかし、どはまる)

2015年東京大学(理科)数学 問5

mを2015以下の正の整数とする
2015 C m が偶数となる最小のmを求めよ
http://www.yomiuri.co.jp/nyushi/15/sokuho/1222243_2080.html

というわけで、Cをまずつくろう。

nCk = n!/k!(n-k)! なので、階乗を求める関数factorialを

function factorial($n) {
    if ($n === 0) {
        return 1;
    }

    return $n * factorial($n - 1);
}

と定義して、

function combination($n, $k) {
    return factorial($n) / (factorial($k) * factorial($n - $k));
} 

combination(4,2) -> 6 うん。OK.

これをループして、最初に偶数になるものだから
こんな感じかな?ターンッ

for ($i = 0; $i < 2015; $i++) {
    if (combination(2015, $i) % 2 === 0) {
        echo $i;
        break;
    }
}

ファッ?!

PHP Fatal error:  Maximum function nesting level of '1000' reached, aborting! in /home/vagrant/201504.php on line 9
PHP Stack trace:
PHP   1. {main}() /home/vagrant/201504.php:0
PHP   2. combination() /home/vagrant/201504.php:16
PHP   3. factorial() /home/vagrant/201504.php:12

最近では再帰の量に制限があるのか!初めて知ったわ!


xdebugがある場合は変更できるらしいよ。

ini_set('xdebug.max_nesting_level', 2000000);

どんくらいまで計算できるのかな?

var_dump(factorial(20));
var_dump(factorial(21));

int(2432902008176640000)
double(5.1090942171709E+19)

アウツ。
PHPの場合にはgmp_factを使いなさいってことですね・・・orz

Pythonで書いてみよう

同様に再帰の制限にかかってしまったので

import sys
sys.setrecursionlimit(1000000000)

def fact(n):
    if n == 0:
        return 1
    return n * fact(n - 1)

def comb(n,k):
    return fact(n) / (fact(k) * fact(n-k))

for i in range(0, 2015):
    if comb(2015, i) % 2 == 0:
        print i
        sys.exit()
$ python 201504.py 
32

よし。解けました。

2014年を振り返る

うわっ・・・今年ブログ書かなすぎ・・・

この会社に来てから会社員人生としては最悪だった一年だった気がする。
ん。会社員人生としてはいいのかもしれないけど、人生としては最悪、なのかもしれない。

友人のFacebookで「最近欲がない」という投稿を見たのだが、たいへん言い得て妙であり、自分もそういうところが増えてきている。承認欲求もしかり、「なんとなく美味しいものが食べたい」という気持ちがあっても「これが食べたい」がなかったり。

とにもかくにも不健康。

2013年末まで心身ともにやられるプロジェクトが終わって、それが癒えぬまま年明けに突入、1月からは消費税の増税に関するもろもろと並行して4月にリリースする比較的大きなプロジェクトに入って疲弊。同、7月にも似たような規模のプロジェクトに入った結果、10をmaxとしたら8からスタートしたのに4まで減って、で、6まで回復して3まで減って・・・みたいなことを繰り返した。

主なところでは年齢の影響もあると思われるが健康診断で今までひっかかっていない数値がひっかかった。というか再検査じゃなくて要治療の紹介状が来た。

また12月にはおよそ10年ぶりくらい(ちなみに当時新卒で入社した会社が(自身の環境も併せて)どうにも辛くて辞めようと思っていた時期ぶり)に喘息の発作も発生した。

その他

  • 腸閉塞の手前
  • 指への石灰沈着

など変な病気もかかった。

この年末で少しは心身ともに回復をしたいところではあるのだが、現時点ではその回復の良い方法も見つからず、ただ寝ては起きてと、むしろ自律神経をおかしな方向へと進行させている気がする。

もう、このへんに関しては美輪明宏さんのおっしゃる

「人生が上手く行かない時どうしたらいいですか?」という質問に対しての、美輪明宏さんの回答が素晴しいと話題に

品物を揃えなさい。美・知識・教養・技術、そういう自分の財産を増やしておきなさい、そういう時期

と捉えるしかないんじゃなかろうか。

あ、要するに不健康なのは忙しかったから体調を崩しましたとかそういう話じゃないってことです。ハイ。

仕事

楽しかった仕事の終わり

11月にローンチした新しいメディアが7月にクローズする。

エイプリルフール企画をはじめて会社でやったことや、ソーシャルアカウントの運用、メンバーとの関係性などが良好で、あまりここに力を入れられなかったことが残念だが楽しかったし、やってみたいと思っていたことを叶える機会があった仕事がなくなってしまった。

リーンUXはどこへ消えた?

年末くらいからリーンで開発をすることであったりとか、役割を超えた活動のやり方であったりというところをずっと考えてきて、部分的にはそれがうまくいっているところもある。しかしそうでない部分もあり、特に自分としても「もうあの人とは仕事をしたくないなあ」と思う人間を3人も作ってしまった。

また「個々の組織の総和が会社を良い方向に向けているとは思えない」印象をうける出来事があり、リアルにこの日吐き気がした。

データを解析するお仕事

データの指標を作っていこうとかそういうことは結構出来た気がするけど、1年を通してまともに解析してレポーティングして、というようなことは一回しかなかった気がする。年末から1つそのような仕事へのお誘いがあったので、2015年はまずこの仕事にどれだけ時間を割けるか、この仕事がちゃんとフィニッシュを迎えるのか、によっては会社とのつきあいかたを真剣に考えざるをえない。

解析とは直接の関係はないが、関連する知識が活かせる分野のお仕事をさせてもらえていることは、プラスに考えていきたいと思う。

エバンジェリスト

前から興味のあったこと。


エバンジェリスト養成講座(西脇資哲) | 翔泳社の本

今年はデータに関する勉強会や、リーンUXに関する勉強会、営業チームでの勉強会など、自分が良いと思ったことを他の人におすすめする、という機会が多かった。今後もこのような機会を作っていき、かつおすすめしていく中で相手の行動を変えていく方法、というのをもっと身につけていきたいと思っている。

来年ははじめのほうに、リアル脱出ゲームを活用してチームワークを高める方法、ということについて考えているので、お話をする予定でずっとどう伝えるか考えている。

プライベート

  • 妹が結婚した
  • 親戚のこどもたちとよく遊んだ
  • 6年半使ってたガラケーが死んだので本格的にスマートフォンへ変えた
    • HTML5ベースの俺得アプリをつくってみようとちょっとずつはじめた
  • 妻にとってははじめての海外旅行をした
  • 野球は監督業へのシフト。チームが初めてプレーオフに出場した

こんなかんじかな。

2015年をどういう年にするか

「やると決めてやる」、これ、割と自分の中の基本だったのだけど、ここ最近守れていない気がした。その結果外的な要因があるとはいえいろいろなことが継続できなかったので、周囲を巻き込んででも、そのことに集中してやり切る、ということで言い訳のできない状況というのを作っていかないといけないんだろうなと思う。

それとは別に趣味の話

ダンエボ DanceEvolution ARCADE
Ingress - Google Play の Android アプリ をはじめたよ。

両方共からだを動かす系に結果的になっているんだけど、これはそういう欲求なんだと思う。

はたまた別の話

四月は君の嘘


TVアニメ「四月は君の嘘」オフィシャルサイト

最近「あこがれ」が減ったんだなってことを思った。キャリアプラン的なこともそうだし、同世代の人だったり、場合によっては異性だったり、というのを、このアニメをみて感じた。
あこがれの対象に回れよ、ってハナシはもちろんそうなんだけど、そこらへん含めて「欲がなくなった」というところがあるのかもしれない。


同時に、こういう人たちのお陰でいろいろ助けられているな、というのを、直接的に助けられることとは違うやりかたで助けられているなあという意味で感じたというのもある。ひさびさに人間関係的な意味で良いアニメだった


というわけでバイオリズムの回復を待つか。

karma で テストしながらカバレッジを取る

karmaでカバレッジを取る

以前書いた記事からkarmaがバージョンアップしており、カバレッジを取得する方法が変わっていました。

カバレッジを取る方法は、preprocessorsとして定義して、その中でプラグインとしてcoverageを呼ぶ方法となっています。

このため、karmaのインストール時に、karma-coverage をインストールします。

karma-coverageのインストール

また、テストにはJasmine、ブラウザとして PhantomJSを使いたいので、以下のようにpackage.jsonを定義します。

{
  "devDependencies": {
    "karma": "~0.12.21",
    "karma-coverage": "~0.2.5",
    "karma-jasmine": "~0.1.5",
    "karma-phantomjs-launcher": "~0.1.4"
  }
}

$ npm install

いろいろなものがインストールされます。

とりあえず対象となるコードを準備

テキトウです。

src\math.js

// 絶対値取得。numが0以上ならそのまま、0以下ならマイナスをかけて返す
function abs(num) {
  if (num >= 0) {
    return num;
  } else {
    return -1 * num;
  }
}

spec\mathspec.js

describe("math suite", function() {
  it("math.abs spec when num is positive", function() {
    expect(abs(10)).toEqual(10);
  });
});

karmaを設定する

おなじみ初期化です。

$ karma init

Which testing framework do you want to use ?
Press tab to list possible options. Enter to move to the next question.
> jasmine

Do you want to use Require.js ?
This will add Require.js plugin.
Press tab to list possible options. Enter to move to the next question.
> no

Do you want to capture any browsers automatically ?
Press tab to list possible options. Enter empty string to move to the next quest
ion.
> PhantomJS
>

What is the location of your source and test files ?
You can use glob patterns, eg. "js/*.js" or "test/**/*Spec.js".
Enter empty string to move to the next question.
> src/*.js
> spec/*.js
>

Should any of the files included by the previous patterns be excluded ?
You can use glob patterns, eg. "**/*.swp".
Enter empty string to move to the next question.
>

Do you want Karma to watch all the files and run the tests on change ?
Press tab to list possible options.
> no

こんなかんじで設定。
PhantomJSの利用と、ソースファイル、テストファイルを読み込ませるだけです。



とりあえずテスト。

$ karma start

INFO [karma]: Karma v0.12.21 server started at http://localhost:9876/
INFO [launcher]: Starting browser PhantomJS
INFO [PhantomJS 1.9.7 (Windows 7)]: Connected on socket neyN1RfF24QpB3M5OJL3 with id 7600682
PhantomJS 1.9.7 (Windows 7): Executed 1 of 1 SUCCESS (0.005 secs / 0.004 secs)

OKですね。

カバレッジを取得する設定を行う

karma.conf.js を修正していきます。

カバレッジを取得するように
    reporters: ['progress', 'coverage'],
カバレッジ対象のコードを指定
    preprocessors: {
      'src/*.js' : 'coverage'
    },

再度

$ karma start

すると、coverageフォルダができます。

こんなかんじ。

└─PhantomJS 1.9.7 (Windows 7)
    │  index.html
    │  prettify.css
    │  prettify.js
    │
    └─src
            index.html
            math.js.html


中身はこんなかんじです。

f:id:kidd-number5:20140808151748p:plain
f:id:kidd-number5:20140808151755p:plain

ばっちりですね。

[python][pandas] pandasで移動平均

Rで移動平均 - tetsunosukeのnotebook を pandasで。

今回は結構簡単です。

>>> import numpy as np
>>> import pandas as pd
>>> data = np.array([1,2,3,4,5,4,3,2,1])
>>> pd.rolling_mean(data, 5)
array([ nan,  nan,  nan,  nan,  3. ,  3.6,  3.8,  3.6,  3. ])

[pandas] pandas で 回帰分析

Rで回帰分析 - tetsunosukeのnotebook を pandasでやってみた

特にファイルを読み込む部分がRっぽく書ける

import pandas as pd
>>> data = pd.read_csv("2-1.csv")
>>> data.describe()
          degree       amount
count  12.000000    12.000000
mean   16.391667  1310.833333
std     7.607587   414.355323
min     5.100000   772.000000
25%     9.725000  1127.500000
50%    16.700000  1231.000000
75%    22.750000  1355.000000
max    27.500000  2389.000000

[8 rows x 2 columns]

あとはRのnlsのように...

>>> model = pd.ols(y=data["amount"], x=data["degree"], intercept=True)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "c:\Python27\lib\site-packages\pandas\stats\interface.py", line 135, in o
ls
    return klass(**kwargs)
  File "c:\Python27\lib\site-packages\pandas\stats\ols.py", line 53, in __init__

    import scikits.statsmodels.api as sm
ImportError: No module named scikits.statsmodels.api


ols関数で回帰分析しようとしたら落ちた!

追ってみると、Patsy が入っていなかったのでインストールして再実行

>>> model

-------------------------Summary of Regression Analysis-------------------------


Formula: Y ~ <x> + <intercept>

Number of Observations:         12
Number of Degrees of Freedom:   2

R-squared:         0.6119
Adj R-squared:     0.5731

Rmse:            270.7228

F-stat (1, 10):    15.7685, p-value:     0.0026

Degrees of Freedom: model 1, resid 10

-----------------------Summary of Estimated Coefficients------------------------

      Variable       Coef    Std Err     t-stat    p-value    CI 2.5%   CI 97.5%

--------------------------------------------------------------------------------

             x    42.6066    10.7296       3.97     0.0026    21.5766    63.6365

     intercept   612.4407   192.4569       3.18     0.0098   235.2251   989.6562

---------------------------------End of Summary---------------------------------

x, interceptの値、42.6066と612.4407を得ることが出来ました。


>>> model.summary_as_matrix
                 x   intercept
beta     42.606567  612.440687
p-value   0.002639    0.009782
std err  10.729551  192.456913
t-stat    3.970955    3.182222

[4 rows x 2 columns]

beta値のところに求めたい値が出ています。

R-Style

Rっぽくモデルを書くことができるので、それを試してみます。

>>> import statsmodels.formua.api as sm
>>> res = sm.ols(formula="amount ~ degree", data=csv).fit()
>>> res.summary2()
<class 'statsmodels.iolib.summary2.Summary'>
"""
               Results: Ordinary least squares
============================================================
Model:                 OLS     AIC:                 170.2930
Dependent Variable:    amount  BIC:                 171.2628
No. Observations:      12      Log-Likelihood:      -83.146
Df Model:              1       F-statistic:         15.77
Df Residuals:          10      Prob (F-statistic):  0.00264
R-squared:             0.612   Scale:               73291.
Adj. R-squared:        0.573
------------------------------------------------------------
           Coef.   Std.Err.   t    P>|t|   [0.025    0.975]
------------------------------------------------------------
Intercept 612.4407 192.4569 3.1822 0.0098 183.6200 1041.2614
degree     42.6066  10.7296 3.9710 0.0026  18.6996   66.5135
------------------------------------------------------------
Omnibus:             4.269      Durbin-Watson:         2.667
Prob(Omnibus):       0.118      Jarque-Bera (JB):      1.424
Skew:                0.700      Prob(JB):              0.491
Kurtosis:            3.943      Condition No.:         44
============================================================