35
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . TensorFlow の使い方 [email protected] 山上俊彦 IoT 事業本部, ACCESS 2017/01 山上俊彦 (ACCESS Confidential) TensorFlow の使い方 2017/01 1 / 35

TensorFlowの使い方(in Japanese)

Embed Size (px)

Citation preview

Page 1: TensorFlowの使い方(in Japanese)

...

.

...

.

...

.

...

.

...

.

...

.

...

.

...

.

...

.

...

.

TensorFlow の使い方[email protected]

山上俊彦

IoT 事業本部, ACCESS

2017/01

山上俊彦 (ACCESS Confidential) TensorFlow の使い方 2017/01 1 / 35

Page 2: TensorFlowの使い方(in Japanese)

...

.

...

.

...

.

...

.

...

.

...

.

...

.

...

.

...

.

...

.

TensorFlow

Google が Apache 2.0 ライセンスで公開した機械学習ライブラリC, Python の API を持つ現在のバージョンは 0.12 (20170123)利点

モデル設計が簡単でコード記述も簡潔に書ける商用フリーのライセンスであるため、機械学習システム導入のコストを抑えられる学習がし易い導入しやすい

欠点ほとんどの処理がブラックボックスである: 関数の処理フローが明確でない。エラーを動作原理まで遡って特定することができない(報告例: ReLU 関数を引数で渡すとエラーになるが等価な関数で書くと動く)。

山上俊彦 (ACCESS Confidential) TensorFlow の使い方 2017/01 2 / 35

Page 3: TensorFlowの使い方(in Japanese)

...

.

...

.

...

.

...

.

...

.

...

.

...

.

...

.

...

.

...

.

TensorFlow コード記述の 3 つの部分

部分 推論処理部 損失定義部 訓練部概要 予測のためのネットワ

ークを前方向に実行するために必要な推論グラフを構築。出力予測を含むテンソルを返す。

推論グラフに損失を生成するために必要な処理の定義を加える。損失を返す。

勾配を計算して適用するために必要な処理の定義を加える。

利用 損失定義部の入力として使われる

推論処理部で定義したテンソルを入力として損失を返し、この結果を訓練部が利用する

損失とハイパーパラメータ (学習率) を入力する

# loss (損失として別に定義 ) inference( 推論グラフとして別に定義 )with tf.Graph().as_default():

images_placeholder , labels_placeholder = placeholder_inputs(FLAGS.batch_size)

logits = mnist.inference(images_placeholder ,FLAGS.hidden1,FLAGS.hidden2)

loss = mnist.loss(logits, labels_placeholder)train_op = mnist.training(loss, FLAGS.learning_rate)

山上俊彦 (ACCESS Confidential) TensorFlow の使い方 2017/01 3 / 35

Page 4: TensorFlowの使い方(in Japanese)

...

.

...

.

...

.

...

.

...

.

...

.

...

.

...

.

...

.

...

.

推論部の例 I

def inference(images, hidden1_units , hidden2_units):"""Build the MNIST modelArgs:

images: Images placeholder , from inputs().hidden1_units: Size of the first hidden layer.hidden2_units: Size of the second hidden layer.

Returns:softmax_linear: Output tensor with the computed logits.

"""# Hidden 1with tf.name_scope('hidden1 '):

weights = tf.Variable(tf.truncated_normal([IMAGE_PIXELS , hidden1_units],

stddev=1.0 / math.sqrt(float(IMAGE_PIXELS))),name='weights ')

biases = tf.Variable(tf.zeros([hidden1_units]),name='biases ')

hidden1 = tf.nn.relu(tf.matmul(images, weights) + biases)# Hidden 2

山上俊彦 (ACCESS Confidential) TensorFlow の使い方 2017/01 4 / 35

Page 5: TensorFlowの使い方(in Japanese)

...

.

...

.

...

.

...

.

...

.

...

.

...

.

...

.

...

.

...

.

推論部の例 II

with tf.name_scope('hidden2 '):weights = tf.Variable(

tf.truncated_normal([hidden1_units , hidden2_units],stddev=1.0 / math.sqrt(float(hidden1_units))),

name='weights ')biases = tf.Variable(tf.zeros([hidden2_units]),

name='biases ')hidden2 = tf.nn.relu(tf.matmul(hidden1, weights) + biases)

# Linearwith tf.name_scope('softmax_linear '):

weights = tf.Variable(tf.truncated_normal([hidden2_units , NUM_CLASSES],

stddev=1.0 / math.sqrt(float(hidden2_units))),name='weights ')

biases = tf.Variable(tf.zeros([NUM_CLASSES]),name='biases ')

logits = tf.matmul(hidden2, weights) + biasesreturn logits

山上俊彦 (ACCESS Confidential) TensorFlow の使い方 2017/01 5 / 35

Page 6: TensorFlowの使い方(in Japanese)

...

.

...

.

...

.

...

.

...

.

...

.

...

.

...

.

...

.

...

.

TensorFlow を書く時の注意

コードは Python だが、あくまでもループなどに見えてもリンク関係を定義しているだけ。実際の実行は TensforFlow の中で独自に行われる。途中に print をいれて内部状態を見るとかはできない。

記述だけをする理由: numpy などの外部数値計算ライブラリをいちいち呼ぶと遅いので、定義だけ書いてから全部外で実行させているため

グラフの書き方の基本は「入力値 x に重み W をかけバイアス bを足して活性化関数を通したあとに次の層に渡す」。これをつなげる。

実行は Python で書いた TensorFlow コードを Python で実行するだけ。

山上俊彦 (ACCESS Confidential) TensorFlow の使い方 2017/01 6 / 35

Page 7: TensorFlowの使い方(in Japanese)

...

.

...

.

...

.

...

.

...

.

...

.

...

.

...

.

...

.

...

.

TensorFlow playground

TensorFlow playground については別資料があるのでここでは説明しない

山上俊彦 (ACCESS Confidential) TensorFlow の使い方 2017/01 7 / 35

Page 8: TensorFlowの使い方(in Japanese)

...

.

...

.

...

.

...

.

...

.

...

.

...

.

...

.

...

.

...

.

用語

shape: TensorFlow が処理するテンソルの形状(次元)。通常固定だが reshape することもできるname_scope: 視覚化環境の TensorBoard で表示するものをまとめる

logit: ロジット。認識の対数オッズ。ロジット関数はロジスティック関数の逆関数であり、特に確率論と統計学で多く用いられる。

山上俊彦 (ACCESS Confidential) TensorFlow の使い方 2017/01 8 / 35

Page 9: TensorFlowの使い方(in Japanese)

...

.

...

.

...

.

...

.

...

.

...

.

...

.

...

.

...

.

...

.

初歩

山上俊彦 (ACCESS Confidential) TensorFlow の使い方 2017/01 9 / 35

Page 10: TensorFlowの使い方(in Japanese)

...

.

...

.

...

.

...

.

...

.

...

.

...

.

...

.

...

.

...

.

注意

そもそも重回帰分析や SVM で解けるならそのほうが高速TensorFlow は Google みたいに何千万個もデータもっている会社の大規模分散処理

普通は PC に GPU 積むくらいで十分変に GPU マシンを複数並べてもうまくやらないとかえって遅い

実際に master, worker  プロセスをつくって分散処理をさせるのはそれなりに面倒

山上俊彦 (ACCESS Confidential) TensorFlow の使い方 2017/01 10 / 35

Page 11: TensorFlowの使い方(in Japanese)

...

.

...

.

...

.

...

.

...

.

...

.

...

.

...

.

...

.

...

.

TensorFlow の利用準備TensorFlow をインストールする

Python の環境構築から TensorFlow インストールhttp://qiita.com/bohemian916/items/4f0736dcea932a162d9e (2016 年 6 月)

データを持ってくるのが課題 (末尾に TensorFlow の例を示す)MNIST: http://yann.lecun.com/exdb/mnist/自分のデータなら、学習用に前処理することが必要

from tensorflow.examples.tutorials.mnist import input_dataimport tensorflow as tf

flags = tf.app.flagsFLAGS = flags.FLAGflags.DEFINIE_string('data_dir', '/tmp/data',

'Directory for storing data')

mnist = input_data.read_data_sets(FLAGS.data_dir, one_hot=True)

sess = tf.InteractiveSessions()

山上俊彦 (ACCESS Confidential) TensorFlow の使い方 2017/01 11 / 35

Page 12: TensorFlowの使い方(in Japanese)

...

.

...

.

...

.

...

.

...

.

...

.

...

.

...

.

...

.

...

.

Python から動くことを確認する例 (文字列表示と加算)

>>> import tensorflow as tf>>> hello = tf.constant('Hello, TensorFlow!')>>> sess = tf.Session()>>> print sess.run(hello)Hello, TensorFlow!>>> a = tf.constant(10)>>> b = tf.constant(32)>>> print sess.run(a+b)42

山上俊彦 (ACCESS Confidential) TensorFlow の使い方 2017/01 12 / 35

Page 13: TensorFlowの使い方(in Japanese)

...

.

...

.

...

.

...

.

...

.

...

.

...

.

...

.

...

.

...

.

モデルを記述するためのデータ構造

入力層: 入力データの配列 (28 ∗ 28 = 784 次元のデータならそれだけの配列)重み変数: 入力データ数次元の重みベクトル(隠れ層ノードの数)バイアス変数: 隠れ層ノードの数の配列出力層: 出力データの配列と出力用活性化関数の定義 (識別ならソフトマックス関数)

x = tf.placeholder(tf.float21, [None, 784])W = tf.Variable(tf.zeros([784, 10]b = tf.Variable(tf.zero([10])y = tf.nn.softmax(tf.matmul(x, W)+b)

山上俊彦 (ACCESS Confidential) TensorFlow の使い方 2017/01 13 / 35

Page 14: TensorFlowの使い方(in Japanese)

...

.

...

.

...

.

...

.

...

.

...

.

...

.

...

.

...

.

...

.

誤差関連処理

交差エントロピー、誤差伝搬型関数 (学習率も) の定義

y_ = tf.placeholder(tf.float32, [None, 10])

corss_entropy = tf.reduce_mean(-tf.reduce_sum(y_ * tf.log(y),reduction_indices=[1])

train_step =tf.train.GradientDescentOptimizer(0.5).minimize(cross_entropy)

山上俊彦 (ACCESS Confidential) TensorFlow の使い方 2017/01 14 / 35

Page 15: TensorFlowの使い方(in Japanese)

...

.

...

.

...

.

...

.

...

.

...

.

...

.

...

.

...

.

...

.

学習(訓練)を行う

# 初期化するtf.initialize_all_variables().run()# 1000回繰り返す

for i in range(1000):# 訓練データを 100個選択batch_xs, batch_ys = mnist.train.next_batch(100)train_step.run({x: batch_xs, y_: batch_ys})

山上俊彦 (ACCESS Confidential) TensorFlow の使い方 2017/01 15 / 35

Page 16: TensorFlowの使い方(in Japanese)

...

.

...

.

...

.

...

.

...

.

...

.

...

.

...

.

...

.

...

.

学習結果の検証

検証用データで試験

正答率を出す

correct_prediction=tf.equal(tf.argmax(y,1), tf.argmax(y_,1))

# True,Falseを0,1に変換し平均をとるaccuracy = tf.reduce_mean(tf.cast(correct_prediction ,

tf.float32))

# 精度を表示print(accuracy.eval({x:mnist.test.images,

y_:mnist.test.labels}))

山上俊彦 (ACCESS Confidential) TensorFlow の使い方 2017/01 16 / 35

Page 17: TensorFlowの使い方(in Japanese)

...

.

...

.

...

.

...

.

...

.

...

.

...

.

...

.

...

.

...

.

ハイパーパラメータの調整

山上俊彦 (ACCESS Confidential) TensorFlow の使い方 2017/01 17 / 35

Page 18: TensorFlowの使い方(in Japanese)

...

.

...

.

...

.

...

.

...

.

...

.

...

.

...

.

...

.

...

.

変数の初期化と重みの初期化関数の定義

# 変数の初期化sess.run(tf.initialize_all_variables())

# 重みを標準偏差 0.1の正規分布で初期化def weight_variable(shape):

initial = tf.truncated_normal(shape, stddev=0.1)return tf.Variable(initial)

# バイアスを標準偏差 0.1の正規分布で初期化def bias_variable(shape):

initial = tf.constant(0.1, shape=shape)return tf.Variable(initial)

山上俊彦 (ACCESS Confidential) TensorFlow の使い方 2017/01 18 / 35

Page 19: TensorFlowの使い方(in Japanese)

...

.

...

.

...

.

...

.

...

.

...

.

...

.

...

.

...

.

...

.

補足:ランダムやゼロで初期化する例

# 正規分布で初期化w_h = tf.Variable(tf.random_normal([784, 625], mean=0.0,

stddev=0.05))w_o = tf.Variable(tf.random_normal([625, 10], mean=0.0,

stddev=0.05))

# ゼロで初期化b_h = tf.Variable(tf.zeros([625]))b_o = tf.Variable(tf.zeros([10]))

山上俊彦 (ACCESS Confidential) TensorFlow の使い方 2017/01 19 / 35

Page 20: TensorFlowの使い方(in Japanese)

...

.

...

.

...

.

...

.

...

.

...

.

...

.

...

.

...

.

...

.

畳み込みのストライドとプーリングの設定

# 畳み込み層の作成def conv2d(x, W):

return tf.nn.conv2d(x, W, strides=[1, 1, 1, 1], padding='SAME')

# プーリング層の作成def max_pool_2x2(x):

return tf.nn.max_pool(x, ksize=[1, 2, 2, 1],strides=[1, 2, 2, 1], padding='SAME')

山上俊彦 (ACCESS Confidential) TensorFlow の使い方 2017/01 20 / 35

Page 21: TensorFlowの使い方(in Japanese)

...

.

...

.

...

.

...

.

...

.

...

.

...

.

...

.

...

.

...

.

活性化関数 (例では ReLU 関数) とプーリング実施 (定義済)

W_conv1 = weight_variable([5, 5, 1, 32])b_conv1 = bias_variable([32])

# 入力を 28x28x1に変形x_image = tf.reshape(x, [-1,28,28,1])

# 畳み込み層 1を ReLU関数で設定h_conv1 = tf.nn.relu(conv2d(x_image, W_conv1) + b_conv1)# Maxプーリングを設定

h_pool1 = max_pool_2x2(h_conv1)

山上俊彦 (ACCESS Confidential) TensorFlow の使い方 2017/01 21 / 35

Page 22: TensorFlowの使い方(in Japanese)

...

.

...

.

...

.

...

.

...

.

...

.

...

.

...

.

...

.

...

.

2 つの畳み込み層の高密度結合層の実現

W_fc1 = weight_variable([7 * 7 * 64, 1024])b_fc1 = bias_variable([1024])

h_pool2_flat = tf.reshape(h_pool2, [-1, 7*7*64])h_fc1 = tf.nn.relu(tf.matmul(h_pool2_flat , W_fc1) + b_fc1)

山上俊彦 (ACCESS Confidential) TensorFlow の使い方 2017/01 22 / 35

Page 23: TensorFlowの使い方(in Japanese)

...

.

...

.

...

.

...

.

...

.

...

.

...

.

...

.

...

.

...

.

オンオフできるドロップアウト

keep_prob = tf.placeholder(tf.float32)# ドロップアウト

h_fc1_drop = tf.nn.dropout(h_fc1, keep_prob)

山上俊彦 (ACCESS Confidential) TensorFlow の使い方 2017/01 23 / 35

Page 24: TensorFlowの使い方(in Japanese)

...

.

...

.

...

.

...

.

...

.

...

.

...

.

...

.

...

.

...

.

ソフトマックスは既出だが 2 隠れ層の例

W_fc2 = weight_variable([1024, 10])b_fc2 = bias_variable([10])

y_conv=tf.nn.softmax(tf.matmul(h_fc1_drop , W_fc2) + b_fc2)

山上俊彦 (ACCESS Confidential) TensorFlow の使い方 2017/01 24 / 35

Page 25: TensorFlowの使い方(in Japanese)

...

.

...

.

...

.

...

.

...

.

...

.

...

.

...

.

...

.

...

.

セッションを走らせる前にオプティマイザ (例は Adam)

cross_entropy = tf.reduce_mean(-tf.reduce_sum(y_ * tf.log(y_conv), reduction_indices=[1]))train_step = tf.train.AdamOptimizer(1e-4).minimize(cross_entropy)correct_prediction = tf.equal(tf.argmax(y_hypo ,1),

tf.argmax(y_,1))accuracy = tf.reduce_mean(tf.cast(correct_prediction , "float"))

山上俊彦 (ACCESS Confidential) TensorFlow の使い方 2017/01 25 / 35

Page 26: TensorFlowの使い方(in Japanese)

...

.

...

.

...

.

...

.

...

.

...

.

...

.

...

.

...

.

...

.

L2 正則化の例

# Regularization terms (weight decay)L2_sqr = tf.nn.l2_loss(w_h) + tf.nn.l2_loss(w_o)lambda_2 = 0.01# 損失に L2正則化を適用

loss = cross_entropy + lambda_2 * L2_sqrtrain_step =

tf.train.GradientDescentOptimizer(0.001).minimize(loss)

山上俊彦 (ACCESS Confidential) TensorFlow の使い方 2017/01 26 / 35

Page 27: TensorFlowの使い方(in Japanese)

...

.

...

.

...

.

...

.

...

.

...

.

...

.

...

.

...

.

...

.

補足: 損失関数の中で疎なラベルを 0–1 の小数に変換の例

concated = tf.concat(1, [indices, labels])onehot_labels = tf.sparse_to_dense(

concated, tf.pack([batch_size , NUM_CLASSES]), 1.0, 0.0)

山上俊彦 (ACCESS Confidential) TensorFlow の使い方 2017/01 27 / 35

Page 28: TensorFlowの使い方(in Japanese)

...

.

...

.

...

.

...

.

...

.

...

.

...

.

...

.

...

.

...

.

モデルの記述

山上俊彦 (ACCESS Confidential) TensorFlow の使い方 2017/01 28 / 35

Page 29: TensorFlowの使い方(in Japanese)

...

.

...

.

...

.

...

.

...

.

...

.

...

.

...

.

...

.

...

.

モデルの記述例

隠れ層は,入力層の値から線形予測子を計算し,それをシグモイド関数に入れて算出

出力層は,隠れ層の値から線形予測子を求め,それをソフトマックス関数に入れて算出

コスト関数は自分のモデルの値 y_hypo を計算,さらに訓練データのラベル y_ と合わせて cross entropy 値を求める

# モデルを作成def model(X, w_h, b_h, w_o, b_o):

h = tf.sigmoid(tf.matmul(X, w_h) + b_h)pyx = tf.nn.softmax(tf.matmul(h, w_o) + b_o)

return pyx

y_hypo = model(x, w_h, b_h, w_o, b_o)

# コスト関数として交差エントロピーを設定cross_entropy = -tf.reduce_sum(y_*tf.log(y_hypo))

山上俊彦 (ACCESS Confidential) TensorFlow の使い方 2017/01 29 / 35

Page 30: TensorFlowの使い方(in Japanese)

...

.

...

.

...

.

...

.

...

.

...

.

...

.

...

.

...

.

...

.

ハイパーパラメータ以外の調整や操作

山上俊彦 (ACCESS Confidential) TensorFlow の使い方 2017/01 30 / 35

Page 31: TensorFlowの使い方(in Japanese)

...

.

...

.

...

.

...

.

...

.

...

.

...

.

...

.

...

.

...

.

デバイスの指定 (GPU)

with tf.Session() as sess:# デバイスの指定with tf.device("/gpu:1"):

matrix1 = tf.constant([[3., 3.]])matrix2 = tf.constant([[2.],[2.]])product = tf.matmul(matrix1, matrix2)

山上俊彦 (ACCESS Confidential) TensorFlow の使い方 2017/01 31 / 35

Page 32: TensorFlowの使い方(in Japanese)

...

.

...

.

...

.

...

.

...

.

...

.

...

.

...

.

...

.

...

.

学習パラメータの保存と回復

tf.train.Saver() はその時点で存在するパラメータに対する保存を定義。すべて終ってから呼ばないと想定通り保存されない

# 学習したパラメータの保存と読み込みには、tf.train.Saverを使用saver = tf.train.Saver()

なんらかの処理

# 保存 (あとで比較するため )saver.save(sess, "model.ckpt")

# 回復saver.restore(sess, "model.ckpt")

山上俊彦 (ACCESS Confidential) TensorFlow の使い方 2017/01 32 / 35

Page 33: TensorFlowの使い方(in Japanese)

...

.

...

.

...

.

...

.

...

.

...

.

...

.

...

.

...

.

...

.

学習後、手書き文字を書いて試験

saver = tf.train.Saver()

ckpt = tf.train.get_checkpoint_state('./')

if ckpt:last_model = ckpt.model_checkpoint_pathprint "load " + last_modelsaver.restore(sess, last_model)

from PIL import Imageimport numpy as np

new_img = Image.open('./new_data_2.png').convert('L')new_img = 1.0 - np.asarray(new_img , dtype="float32") / 255new_img = new_img.reshape((1,784))

prediction = tf.argmax(y_conv ,1)print("result: %g"%prediction.eval(feed_dict={x: new_img ,

keep_prob: 1.0}, session=sess))

else:# 学習

saver.save(sess, "model.ckpt")

山上俊彦 (ACCESS Confidential) TensorFlow の使い方 2017/01 33 / 35

Page 34: TensorFlowの使い方(in Japanese)

...

.

...

.

...

.

...

.

...

.

...

.

...

.

...

.

...

.

...

.

参考資料 I

TensorFlow のチュートリアルを通して、人工知能の原理について学習する http://qiita.com/jintaka1989/items/3b70b5c5541620536fa2 (2016 年 12 月)TensorFlow を使った機械学習ことはじめ (GDG 京都機械学習勉強会)http://www.slideshare.net/ToruUenoyama/tensorflow-gdg (2016 年 2 月)R で L1 / L2 正則化を実践する http://tjo.hatenablog.com/entry/2015/03/03/190000(2015 年 3 月)深層学習と TensorFlow 入門 http://www.slideshare.net/tak9029/tensorflow-67483532(2016 年 10 月)TensorFlow : MNIST データ・ダウンロード (コード解説)http://tensorflow.classcat.com/2016/03/09/tensorflow-cc-mnist-data-download/中学生にも分かる TensorFlow 入門 その1 テンソルとはなにか http://qiita.com/EtsuroHONDA/items/02635dc3026e29f3cb41   (2016 年 5 月)中学生にも分かる TensorFlow 入門 その 4  プログラムの解説・フローチャートhttp://qiita.com/EtsuroHONDA/items/79844b78655ccb3a7ae6 (2016 年 5 月)Python の環境構築から TensorFlow インストール http://qiita.com/bohemian916/items/4f0736dcea932a162d9e (2016 年 6 月)TensorFlow チュートリアル - ML 初心者のための MNIST(翻訳)http://qiita.com/KojiOhki/items/ff6ae04d6cf02f1b6edf

山上俊彦 (ACCESS Confidential) TensorFlow の使い方 2017/01 34 / 35

Page 35: TensorFlowの使い方(in Japanese)

...

.

...

.

...

.

...

.

...

.

...

.

...

.

...

.

...

.

...

.

参考資料 IITensorFlow チュートリアル - 熟練者のためのディープ MNIST(翻訳)http://qiita.com/KojiOhki/items/64a2ee54214b01a411c7落ちこぼれないための TensorFlow Tutorial コードhttp://qiita.com/TomokIshii/items/92a266b805d7eee02b1d (2016 年 4 月)TensorFlow でアニメゆるゆりの制作会社を識別するhttp://kivantium.hateblo.jp/entry/2015/11/18/233834 (2015 年 11 月)[TF]Tensorflow の学習パラメータの保存と読み込み方法http://qiita.com/supersaiakujin/items/fc400fc6fa58b3809619 (2016 年 4 月)TensorFlow : How To : 変数: 作成、初期化、保存そしてロードhttp://tensorflow.classcat.com/2016/02/09/tensorflow-how-tos-variables/ (2016 年 2 月)TensorFlow で学習済みモデルを使用する (Deep MNIST for Experts の応用)http://walkingmask.hatenablog.com/entry/2016/08/27/032400 (2016 年 8 月)TensorBoard で処理を可視化する http://www.mwsoft.jp/programming/tensor/tutorial_tensorboad.html (2016 年 5 月)TensorFlow : 全結合モデル for MNIST (コード解説)http://tensorflow.classcat.com/2016/03/11/tensorflow-cc-mechanics-101/ (2016 年 3 月)Tensorflow_in_ROS のコードを解説するhttp://qiita.com/shunchan0677/items/60f8f567359fbbbf9321 (2016 年 11 月)TensorFlow : CNN – 畳み込みニューラルネットワーク for CIFAR-10 (コード解説) http://tensorflow.classcat.com/2016/03/12/tensorflow-cc-convolutional-neural-networks/(2016 年 3 月)

山上俊彦 (ACCESS Confidential) TensorFlow の使い方 2017/01 35 / 35