Python(基本的なこと008: mnist_ソフトマックス関数)

■Tensorflowのサンプルとしてmnistを実行してみるの続き
前回、動かすところまではできたので、内容についてもう少し見ていく。
結果として表示されたのは、cost(損失)、Validation Error(検出エラー)、Test Accuracy(精度)などだった。これらの意味を見ていこうと思ったけど、内容を見るにあたり、ソフトマックス関数や交差エントロピーなどよく分からない言葉が出てきた。これらの意味が分からないと結果に出てきたものも分からないので、今回はソフトマックス関数について検証してみた。

ソフトマックス関数は、下のような関数(e = 2.718...(自然対数)、 i = 1, 2, ..., n)。
ここで、y1 + y2 + ... + yn = 1 となる。

数式だけ見てもイメージしづらいので、実際に数字を入れてみる。tensorflowライブラリのtf.nn.softmax関数を使用して、下のコードで[1.0, 2.0, 3.0, 4.0]をソフトマックス関数に変換した。ちなみに、tensorflowは、Sessionのrunで初めて実行され、それまでは値ではなく値を求める手段(operation)が入るそう。そのため、1つ目のoutput1の結果は、Tensorのオブジェクトのようなものが出力されている。

import tensorflow as tf
import numpy as np
import math
import matplotlib.pyplot as mp

x1 = np.array([[1.0, 2.0, 3.0, 4.0], [5.0, 6.0, 7.0, 8.0]], dtype='float32')
x2 = np.array([[1.0, 2.0], [3.0, 4.0], [5.0, 6.0], [7.0, 8.0]], dtype='float32')

sess = tf.Session()
output1 = tf.nn.softmax(x1)
print("===1:================")
print(output1)

print("===2:================")
x_result = sess.run(output1)
print(x_result)

print("===3:================")
print(math.exp(1) / (math.exp(1) + math.exp(2) + math.exp(3) + math.exp(4)))
print(math.exp(2) / (math.exp(1) + math.exp(2) + math.exp(3) + math.exp(4)))
print(math.exp(3) / (math.exp(1) + math.exp(2) + math.exp(3) + math.exp(4)))
print(math.exp(4) / (math.exp(1) + math.exp(2) + math.exp(3) + math.exp(4)))
print(0.0320586 + 0.08714432 + 0.23688284 + 0.6439143)

print("===4:================")

x1 = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], dtype='float32')
output1 = tf.nn.softmax(x1)
x_result = sess.run(output1)
mp.plot(x1, x_result, color="red")
mp.grid()
mp.show()

x1 = np.array(
    [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,
     32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60,
     61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89,
     90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100], dtype='float32')
output1 = tf.nn.softmax(x1)
x_result = sess.run(output1)
mp.plot(x1, x_result, color="red")
mp.grid()
mp.show()

上のコードの実行結果が下のもの。 tf.nn.softmax の結果として、いくつか小数が出されたが、実際に上の数式の通り計算されてるかmathのライブラリを使って確かめた。

mathライブラリで計算した結果も同じような値になり、その合計もほぼ1となっている。tf.nn.softmaxで、上の数式の通りソフトマックス関数に変換されている。

もう少しイメージがつかめるかと思い、上のコードの後半で1~10, 1~100の数字をxiとしてソフトマックス関数(yi)に変換し、xiとyiのグラフを作成した。ソフトマックス関数は、最も大きい数値のときに値が最も大きくなるらしい。下のグラフではそれぞれ10と100が最大なので、そこが一番大きな値となっている。100のグラフを見ると、100付近以外はほぼ0となっている。
まだしっくりこない所はあるけど、こういう特性を持つ関数と認識しておこう。

次回は交差エントロピーについて調べる。