Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
30
Help us understand the problem. What are the problem?

More than 3 years have passed since last update.

@MATS-Electric-Blue-Industries

TensorFlowを理解するための基礎情報共有(2)

前回はTensorFlowの最初の利用方法紹介である「GET STARTED」を題材にしてスカラー・ベクトル・テンソルの違いに言及しました。

 前回 http://qiita.com/MATS_ELB/items/dfc50149d52e47e5a07b

その「GET STARTED」ではスカラー量(ひとつの数字で表現できる)を使ってTensorFlowの挙動が説明されていますが、その後のチュートリアルでは急にテンソルを使った数字の画像認識が題材となっていて、テンソルの扱い方が理解しにくくなっているように思います。なので、「GET STARTED」で扱われたケースを少しだけ改造してテンソル版にしたものを掲載し、日本語でコメントを記載します。

2018/01/31 追記: TensorFlow ver 1.5のSyntaxに対応してコードをアップデートしました。

introduction_vector.py
# -*- coding: utf-8 -*-

# tfという名前で参照できるようにtensorflowを、npという名前で参照できるようにnumpyをインポート
import tensorflow as tf
import numpy as np

# y_data = W_data * x_data + b_data というx_dataとy_dataの関係になるようにあらかじめ
# W_dataとb_dataの値を定める。機械学習が適切に行われるとWはこのW_dataに、bはこのb_dataに近づく
# なお、W_dataは2行2列のテンソル、b_dataは2行1列のテンソル
W_data = np.array([[0.1, 0], [0, 0.1]])
b_data = np.array([0.3, 0.3])

# 乱数生成を利用して0から1の間の数値を持つ2行1列の行列「X_data」を浮動小数として100個生成
x_data = np.random.rand(100, 2, 1).astype("float32")

# その後で、生成した100個のxに対して、行列版でのy=0.1x+0.3となるようなyを100個生成
y_data = W_data * x_data + b_data

# 上記で生成したxとy(共に2行1列のテンソル)の組を学習データとして用いる

# 機械学習で最適化するWとbを設定する。Wは2行2列のテンソル。bは2行1列のテンソル。
W = tf.Variable(tf.random_uniform([2, 2], -1.0, 1.0))
b = tf.Variable(tf.zeros([2]))
y = W * x_data + b

# 学習において、その時点での学習のダメ程度を表すlossを、学習データのyとその時点でのyの差の2乗と定義
# Wとbの最適化のアルゴリズムを最急降下法(勾配法)とし、その1回の最適化処理にoptimizerと名前を付ける
# 上記の最適化処理の繰り返しによりlossを最小化する処理をtrainと呼ぶことにする
loss = tf.reduce_mean(tf.square(y_data - y))
optimizer = tf.train.GradientDescentOptimizer(0.5)
train = optimizer.minimize(loss)

# 学習を始める前にこのプログラムで使っている変数を全てリセットして空っぽにする
init = tf.global_variables_initializer()

# Optional: Macbook ProでCPU使用で実行すると出ることがあるメッセージを表示しないようにする
import os
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'

# Launch the graph.(おきまりの文句)
sess = tf.Session()
sess.run(init)

# 学習を1000回行い、100回目ごとに画面に学習回数とWとbのその時点の値を表示する
for step in xrange(1001):
    sess.run(train)
    if step % 100 == 0:
        print step, sess.run(W), sess.run(b)

# Learns best fit is W: [[0.1, 0], [0, 0.1]], b: [0.3, 0.3]

これを実行すると下記のような出力(学習の結果としてのWとb)が得られます。

0 [[ 0.06333046 0.27613732]
[ 0.27408534 0.65764177]] [ 0.12632947 0.0456607 ]
:
中略
:
1000 [[ 1.00000262e-01 2.38718428e-07]
[ 2.14710980e-07 1.00000240e-01]] [ 0.29999986 0.29999986]

読みやすいように改行を調整したりしますと

学習回数 1000
Wの値  [[ 1.00000262e-01 2.38718428e-07], [ 2.14710980e-07 1.00000240e-01]]
bの値  [ 0.29999986 0.29999986]

ということで、学習結果のWはW_dataの値(というかテンソル)に、近づいていっています。
というように、テンソルを使ってTensorFlowを使う場合、基本的には「GET STARTED」で扱われたスカラーのケースと同じです。ただ、行列の計算は行・列の数に整合性を求めるのでそこの帳尻が合っているかに気をつけたいです。

以上、どなたかのお役に立てればと思い記載致しましたが、私、このサイトの投稿が初心者なので上手くなくて申し訳ありません。今後も学習しながらお役に立てるように情報共有して参ります。アドバイスなどありましたら是非是非いただきたく。

 続編はこちらへ http://qiita.com/MATS_ELB/items/e5761be146a400586392

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
30
Help us understand the problem. What are the problem?