Engineer in Tokyo

PyCon JP 2016に参加してきました

今年のPyCon JP で Tensorflowについて発表させていただきました。私は台北の出張があって今年のPyCon JPで2日目しか参加できなくて残念でしたが、今年は過去最高のPyCon JPだと感じていました。PyCon JPのスタッフの皆さん、本当にお疲れ様でした! 私は数年間イベントの企画や準備にあまり関わらないようになってきていますが、コミュニティメンバーとして、PyCon JPの素晴らしさ、本当に誇りに思っています。

Monotaro and me

Tensorflowトーク

最近、機械学習が話題になっているから、Tensorflowについて発表させていただきました。英語で発表しましたし、30分で発表するのが非常に足りないと感じるし、ここで少しTensorflowについて追記しようかなと思います。

Tensorflowは2015年11月にリリースした機械学習用のPythonライブラリ。Googleが以前にリリースしたオープンソースだと、以前に使っていたけど、今は次世代のものを使っているっていうのが多かったが、TensorflowはGoogle社内でも現在使っているGoogle最新技術です。

私のトークでは、Deep Learningとその背景について話しましたので、発表の動画を見てみてください。

今年のEuropythonでもほぼ同じ内容の話を1時間で発表して、より詳しい話ができたので、もしよかったら、その動画もみてみてください

資料はこちら:

トークにつかったJupyterノートブックはGithubに公開されているので、使ってみてください。

MNIST

この発表でMNISTの数字認識サンプルを紹介した。MNISTはとても有名なデータセットです。Jyupyterノートブックで紹介したのは、Tensorflowの「MNIST for ML Beginners」とほとんど同じ内容です。このチュートリアルを流せばOKなので、ちょっと追記したフルコードをここに書いとく。

import tensorflow as tf

# MNISTのデータは手書きの数字の55,000枚の28x28ピクセルの画像です。Tensorflowに入力するために、このデータをテンサーに変換しないといけない。このテンサーは28*28=768の要素を持った配列にします。
# そのデータを読み込む。
from tensorflow.examples.tutorials.mnist import input_data
mnist = input_data.read_data_sets("MNIST_data/", one_hot=True)

# ニュアルネットワークの入力として「x」を定義する。
# データの入力数を「None」で指定しない、1つ1つのデータサイズが784
x = tf.placeholder(tf.float32, [None, 784])

# 784x10の重みの変数を定義する。重みは入力と結果の繋がりの強さを表す。学習することで、更新される
W = tf.Variable(tf.zeros([784, 10]))

# バイアスの変数を定義する。バイアスはデータの「偏り」を表す。これは重みに連れて更新される
b = tf.Variable(tf.zeros([10]))

# これで、ニュアルネットワークを定義する。この時点では、何も計算していなくて、計算グラフを定義しているだけ。
# ここでは「y」はグラフのオブジェクト
y = tf.nn.softmax(tf.matmul(x, W) + b)

# ======= 学習の準備をする =========

# 「y_」は損失関数で「y」と比較する変数
y_ = tf.placeholder(tf.float32, [None, 10])

# 損失関数を定義する。クロスエントロピーを損失関数として使います。
# これはニュアルネットワークの正しさを評価する関数
cross_entropy = tf.reduce_mean(-tf.reduce_sum(y_ * tf.log(y), reduction_indices=[1]))

# 傾斜降下を最適化する関数として使います。これは損失関数の結果を最小化する関数
train_step = tf.train.GradientDescentOptimizer(0.5).minimize(cross_entropy)

# ======= 学習をする =========

sess = tf.Session()
sess.run(tf.initialize_all_variables())

# 1000回のミニバッチ学習をする
for i in range(1000):
  # 確率的学習をする。トレーニングデータから100個をランダムで取得して、学習する方法
  # この場合は「確率的勾配降下法」
  # https://ja.wikipedia.org/wiki/%E7%A2%BA%E7%8E%87%E7%9A%84%E5%8B%BE%E9%85%8D%E9%99%8D%E4%B8%8B%E6%B3%95
  batch_xs, batch_ys = mnist.train.next_batch(100)

  # トレーニンググラフを実行する。入力として「batch_x」を使う。損失関数の入力として「batch_ys」を使う。
  sess.run(train_step, feed_dict={x: batch_xs, y_: batch_ys})

# ======== ニュアルネットワークの制度を確認する ========

# 「y」と「y_」を比較する。「y」は0-1の間の確率が出るので、「argmax」を使って、最大の値を1にして、残りを全部0にする。
# そうすると「y_」と正しく比較できる
correct_prediction = tf.equal(tf.argmax(y,1), tf.argmax(y_,1))
# 「equal」から1か0が出るので、「correct_prediction」から出た値の平均値を計算するだけ
accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))
print(sess.run(accuracy, feed_dict={x: mnist.test.images, y_: mnist.test.labels}))

私は機械学習の初心者だけど、Tensorflowは結構強力なPythonライブラリで、アカデミックで研究で使うだけではなくて、実用的に使えるように作られているから、サービス運用者、Pythonプログラマーの立場から見て、もっと触りたいなと思っています。これから、Tensorflowの実践的に面白いところのブログ記事を書きたいと思います。