メルマガ登録
※TensorFlowとは2015年11月9日にオープンソース化されたGoogleの機械学習ライブラリです。
本ブログでは、実際のTensorFlowの使い方を連載方式でご紹介しています。
皆様こんにちは。
テクノロジー&ソフトウェア開発本部の佐藤貴海です。今回のブログは、「TensorFlow Mechanics 101」をご紹介します。
https://www.tensorflow.org/versions/master/tutorials/mnist/tf/index.html#tensorflow-mechanics-101
ソースコードが以下のURLに掲載されています。
https://tensorflow.googlesource.com/tensorflow/+/master/tensorflow/examples/tutorials/mnist/
その中で、今回は以下の2つのファイルを見ていきます。
内容としては、これまでと同じMNISTの手書き文字の認識なので、重複する解説は省略し、今回はいままで出てこなかった以下の2つの機能について紹介します。
pipでTensorFlowをインストールした場合、tensorboardコマンドがパスに追加されるので、SummaryWrite(後述)に渡したログディレクトリを指定して実行すると、6006番ポートにWebアプリが起動します。
$ tensorboard --logdir=/path/to/log-directory
TensorFlowは、計算の実行計画をグラフと呼んでおり、これをまさにグラフとして出力することができます。Webアプリのナビゲートバーの「GRAPH」にアクセスすると、以下のような画面を見ることができます。
しかし、何もせずにグラフを表示すると非常に見にくいので、tf.name_scopeで名前をつけて見やすい状態にします。
ここでは、各層ごとに’hidden1′, ‘hidden2’, ‘softmax_linear’と名付けています。
# Hidden 1
with 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
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)
# Linear
with 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) + biases
‘hidden1’, ‘hidden2’, ‘softmax_linear’の単位で表示がまとまるので、非常に見通しがよくなります。
各ノードの詳細を見たい場合は、ノードの右上のアイコンを押すと展開することができます。
ニューラルネットワークでは学習誤差がどの程度落ちているか、収束しているかを判断するため、各反復において、学習(予測)誤差がどうなっているかを、把握したいことが多々あります。
TensorFlowではtensorboardで簡単に学習(予測)誤差を確認する機能がついています。
一番簡単な使用方法は、tf.merge_all_summaries()でサマリ用のオペレーションと、tf.train.SummaryWriterを用意し、
summary_op = tf.merge_all_summaries()
summary_writer = tf.train.SummaryWriter(FLAGS.train_dir,
graph_def=sess.graph_def)
記録したいステップごとに、tf.train.SummaryWriter.add_summaryで結果を追加していけばOKです。
for step in xrange(FLAGS.max_steps):
if step % 100 == 0:
summary_str = sess.run(summary_op, feed_dict=feed_dict)
summary_writer.add_summary(summary_str, step)
この後、Webアプリのナビゲートバーの「EVENTS」にアクセスすると、以下のような画面を見ることができます。
この場合、誤差が最後上昇しているので、早めに打ち切るか、学習率を落としてみると良いかと思われます。
今回も前回同様に、簡単な機能紹介とさせていただきました。次回からCNN(Convolutional Neural Networks)に入るので、より実践的な内容の紹介に移っていきます。お楽しみに。
こうした先進的な取り組みをぜひ自分でもやってみたいという方を、ブレインパッドでは募集しています。
興味・関心のある方は、ぜひご応募ください!
http://www.brainpad.co.jp/recruit/stylea.html
あなたにオススメの記事
2023.12.01
生成AI(ジェネレーティブAI)とは?ChatGPTとの違いや仕組み・種類・活用事例
2023.09.21
DX(デジタルトランスフォーメーション)とは?今さら聞けない意味・定義を分かりやすく解説【2024年最新】
2023.11.24
【現役社員が解説】データサイエンティストとは?仕事内容やAI・DX時代に必要なスキル
2023.09.08
DX事例26選:6つの業界別に紹介~有名企業はどんなDXをやっている?~【2024年最新版】
2023.08.23
LLM(大規模言語モデル)とは?生成AIとの違いや活用事例・課題
2024.03.22
生成AIの評価指標・ベンチマークとそれらに関連する問題点や限界を解説