書籍転載:TensorFlowはじめました ― 実践!最新Googleマシンラーニング(1)

書籍転載:TensorFlowはじめました ― 実践!最新Googleマシンラーニング(1)

TensorFlowとは? データフローグラフを構築・実行してみよう

2016年8月9日

技術書オンリー即売会「技術書典」で頒布された同名出版物をベースとして制作されたTensorFlowの入門書籍を転載開始。その1回目として、データフローグラフや定数といったTensorFlowの基礎を説明する。

有山 圭二
  • このエントリーをはてなブックマークに追加

 書籍『TensorFlowはじめました ― 実践!最新Googleマシンラーニング』から全7本の記事を転載します。本稿はその1回目です。

書籍転載について

 本コーナーは、インプレスR&D[Next Publishing]発行の書籍『TensorFlowはじめました ― 実践!最新Googleマシンラーニング』の中から、特にBuild Insiderの読者に有用だと考えられる項目を編集部が選び、同社の許可を得て転載したものです。

 『TensorFlowはじめました ― 実践!最新Googleマシンラーニング』(Kindle電子書籍もしくはオンデマンドペーパーバック)の詳細や購入はAmazon.co.jpのページをご覧ください。書籍全体の目次は連載INDEXページに掲載しています。プログラムのダウンロードは、「TensorFlowはじめました」のサポート用フォームから行えます。

ご注意

本記事は、書籍の内容を改変することなく、そのまま転載したものです。このため用字用語の統一ルールなどはBuild Insiderのそれとは一致しません。あらかじめご了承ください。

[準備]TensorFlowのインストールについて(Build Insider編集部による追記)

 TensorFlowを試すには、Mac OS XもしくはUbuntuにPython環境を構築したうえで、TensorFlowをダウンロードしてインストールする必要があります。その方法については、(英語になりますが)下記のサイトを参照してください。

本書について

  • 本書は技術書オンリー即売会「技術書典(https://techbookfest.org/)」で頒布された同名出版物を底本として、修正等を行い制作されました。

 この本は、TensorFlowがオープンソースで公開されるまで「機械学習」に触れたことがなかった筆者が、TensorFlowに挑戦して、七転八倒した成果をまとめたものです。

本書の構成

 本書では、まず始めにTensorFlowの基本であるデータフローグラフについて解説します。

 次に、画像の多クラス分類問題「CIFAR-10」を題材に「畳み込みニューラルネットワーク」による推論と学習、評価を実装します。

 モデルとパラメーターの保存と読み込み方法。また、フィルターの可視化などを通じてパラメーターの変化を視覚的に捉えます。

 最後に、認識精度を上げるためにいくつかの取り組みをします。

前提知識

 本書は、読者にプログラミング言語「Python」に関する基本的な知識があることを前提にしています。

 また、計算ライブラリnumpyも使用しています。必要に応じてリファレンス(http://www.numpy.org/)を参照してください。

ソフトウェアのバージョン

 本書は次のバージョンでの動作を確認しています。

  • TensorFlow 0.8.0 および 0.9.0
  • Python 3.5 (Mac OS X El Capitan) / 3.4.3+ (Ubuntu 15.10)

 ソフトウェアはバージョンアップされる場合があり、本書での説明と機能内容などが異なってしまうこともあり得ます。本書ご購入の前に、必ずバージョンをご確認ください。

サンプルコード・サポート

 サンプルコードは次のURLで配布しています。また、本書に関してお気づきのことがあれば、同URLのフォームからご連絡ください。

表記関係について

 本文書に記載されている会社名、製品名などは、一般に各社の登録商標または商標、商品名です。会社名、製品名については、本文中では©、®、™マークなどは表示していません。

免責事項

 本書に記載された内容は、情報の提供のみを目的としています。したがって、本書を用いた開発、製作、運用は、必ずご自身の責任と判断によって行ってください。これらの情報による開発、製作、運用の結果について、著者はいかなる責任も負いません。

Creative Commons License

 The Android Studio icon is reproduced or modified from work created and shared by Google and used according to terms described in the Creative Commons 2.5 Attribution license.

第1章 TensorFlowの基礎

1.1 TensorFlowとは

TensorFlow Logo

 「TensorFlow」は、2015年11月にGoogle社がオープンソースで公開した機械学習用の計算フレームワークです。機械学習に必要となる膨大な計算を複数のGPUやマシンで分散・並列処理ができる他、AndroidやiOSなどのモバイル上で動作*1することも大きな特徴です。

  • *1 モバイル上での動作は訓練・学習済のモデルを使った認識(評価)を前提としています。

1.2 データフローグラフ

 TensorFlowによる処理は、データフローグラフの「構築」と「実行」の2つのフェーズで構成されます。

グラフの構築

 TensorFlowは、データの流れ(フロー)を定義した「グラフ」で処理を実行します。あらかじめグラフを構築することで、PythonとC/C++間のオーバーヘッドを低減し、さらに複数のGPUやマシンでの並列・分散処理を可能にしています。

図1.1: オーバーヘッドを抑え、並列・分散処理が可能になる

図1.1: オーバーヘッドを抑え、並列・分散処理が可能になる

 ためしに、次のプログラムを実行しましょう。

Python
# 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.1: 2 + 3の足し算

 定数const1const2を加算しています。実行すると、コンソールには「2 + 3」の演算の結果である「5」が表示されます。

 では、次のプログラムはどうでしょうか。

Python
const1 = tf.constant(2)
const2 = tf.constant(3)
add_op = tf.add(const1, const2)

print(add_op)
リスト1.2: add_opをprint文で表示
Tensor("Add:0", shape=(), dtype=int32)

 文字列が表示され、加算した結果は得られませんでした。定数const1const2についても同様です。

グラフとノード、オペレーション

 繰り返しになりますが、TensorFlowの処理は「データフローグラフ」として構築します。

 グラフはTensorオブジェクトの「ノード」で構成されます。TensorFlowでは、これらのノードを「オペレーション (Operation: op)」と呼びます。

図1.2: グラフを構成するオペレーション

 今回の場合、const1, const2, add_apは、Pythonプログラム上では変数ですが、TensorFlowではデータフローグラフを構成するノード、つまり「オペレーション」です*2。そのためprintで中身を見ようとしても「Tensor」としか表示されないのです。

  • *2 「オペレーション」というと何らかの操作に限定すると思われがちですが、TensorFlowでは、定数や変数も「値を出力するオペレーション」と考えられています。
グラフの実行

 構築したグラフの処理結果を得るには、セッション(tf.Session)の中で、結果を得たいオペレーションを実行(run)します。

 runは、オペレーションが指定されると、そのオペレーションに接続されているグラフを処理して、結果をnumpyのndarrayオブジェクトとして返します。

 リスト1.3は、オペレーションadd_opを実行しています。

Python
with tf.Session() as sess:
  result = sess.run(add_op)
  print(result)
リスト1.3: add_opを実行

 また、runの引数にオペレーションのリストを渡せば、複数のオペレーションを実行することもできます。

Python
const1 = tf.constant(2)
const2 = tf.constant(3)
add_op = tf.add(const1, const2)
mul_op = tf.mul(add_op, const2)

with tf.Session() as sess:
  result, result2 = sess.run([mul_op, add_op])
  print(result)
  print(result2)
リスト1.4: mul_opとadd_opを実行

 リスト1.4では、加算した結果にconst2を積算するオペレーションmul_opを実行しています。このオペレーションを図にすると図1.3のようになります。

図1.3: tf.mulにtf.addとconst2を入力

 実行結果は次の通りです。

15
5

 このように、セッションの中でグラフを構成するいずれかのオペレーションを実行して結果を取り出すことができます。

 今回はTensorFlowの基礎として、データフローグラフや定数について説明しました。次回は、変数とプレースホルダーを紹介します。

※以下では、本稿の前後を合わせて5回分(第1回~第5回)のみ表示しています。
 連載の全タイトルを参照するには、[この記事の連載 INDEX]を参照してください。

1. 【現在、表示中】≫ TensorFlowとは? データフローグラフを構築・実行してみよう

技術書オンリー即売会「技術書典」で頒布された同名出版物をベースとして制作されたTensorFlowの入門書籍を転載開始。その1回目として、データフローグラフや定数といったTensorFlowの基礎を説明する。

2. TensorFlow入門 ― 変数とプレースホルダー

転載2回目。TensorFlowの基礎の第2弾として、変数とプレースホルダーを実際のコードと実行結果で示しながら解説する。

3. TensorFlowの“テンソル(Tensor)”とは? TensorBoardの使い方

転載3回目。テンソル(Tensor)とTensorBoardによるグラフの可視化を解説する。「第1章 TensorFlowの基礎」は今回で完結。

4. TensorFlowでデータの読み込み ― 画像を分類するCIFAR-10の基礎

転載4回目。今回から「畳み込みニューラルネットワーク」のモデルを構築して、CIFAR-10のデータセットを使った学習と評価を行う。今回はデータの読み込みを説明。

5. TensorFlowによる推論 ― 画像を分類するCIFAR-10の基礎

転載5回目。CIFAR-10データセットを使った学習と評価を行う。画像データの読み込みが終わったので、今回は画像の種類(クラス)を判別、つまり「推論」について説明する。

GrapeCity Garage 記事内容の紹介

Azure Central の記事内容の紹介

Twitterでつぶやこう!


Build Insider賛同企業・団体

Build Insiderは、以下の企業・団体の支援を受けて活動しています(募集概要)。

ゴールドレベル

  • グレープシティ株式会社
  • 日本マイクロソフト株式会社