什麼Softmax?
Softmax 是一種常用於多類別分類問題的激活函數,基本上會在神經網路的最後一層,將一組實數轉換為概率分佈。它的特點是將輸入的數值轉換為範圍在 0 和 1 之間的數字,並且這些數字的總和為 1。
對於一組實數 z = [z₁,z₂,...,zₙ],Softmax 函數定義如下:
手寫辨識實作,將其中一張影像的像素以矩陣的方式呈現,可以看到那些數值呈現的形狀即是手寫數字的形狀,便能利用這些數值來預測手寫數字。可以用 NumPy 來處理圖像數據:
import numpy as np
import matplotlib.pyplot as plt
from tensorflow.keras.datasets import mnist
先加載 MNIST 資料集
(x_train, y_train), (x_test, y_test) = mnist.load_data()
選擇圖像,並以矩陣方式呈現
index = 3
image = x_train[index]
matrix = np.array(image)
輸出圖像及其矩陣
plt.imshow(image, cmap='gray')
plt.title(f'Label: {y_train[index]}')
plt.axis('off')
plt.show()
print("array:")
print(matrix)
接著定義類神經網路模型,MNIST 的影像是 28×28=784,定義輸入層 x 為 784 個節點, 0~9 有 10 個類別,則定義輸出層 y為 10 個節點。Softmax 回歸是單層的類神經網路模型,只要定義 W 跟 b,以及類神經網路運算的流程 y。
保留空位,要求預先保留數值:
x = tf.placeholder(tf.float32, [None, 784])
y_ = tf.placeholder(tf.float32, shape=[None, 10])
給予 tf.Variable 初始值的方式來建立 Variable
W = tf.Variable(tf.zeros([784, 10])
b = tf.Variable(tf.zeros([10]))
要讓損失函數的數值最小化,TensorFlow 提供了結合 Softmax 與 Cross Entropy 的函式, .softmax_cross_entropy_with_logits 能給更穩定的數值。
loss = tf.reduce_mean(
tf.nn.softmax_cross_entropy_with_logits(labels=y_, logits=y))
實現模型:
y = tf.nn.softmax(tf.matmul(x, W) + b)