本文主要介紹神經網路訓練辨識的過程,利用fashion_mnist
及簡單的神經網路來進行分類。
使用只有兩層的神經網路來訓練辨識fashion_mnist
資料。
import tensorflow as tf
from tensorflow.keras.datasets import fashion_mnist
import matplotlib.pyplot as plt
# 類別名稱
class_names = ["T-shirt/top", "Trouser", "Pullover", "Dress", "Coat",
"Sandal", "Shirt", "Sneaker", "Bag", "Ankle boot"]
# 載入資料集
(train_images, train_labels), (test_images, test_labels) = fashion_mnist.load_data()
# 定義顯示圖片和標籤的函數
def plot_class_images(images, labels, class_names):
plt.figure(figsize=(10, 10))
for i in range(10):
ax = plt.subplot(5, 2, i + 1)
idx = labels.tolist().index(i)
plt.imshow(images[idx], cmap=plt.cm.gray)
plt.title(f"Class {i}: {class_names[i]}")
plt.axis("off")
plt.show()
# 印出每個類別的編號和對應的名稱
for i, class_name in enumerate(class_names):
print(f"Class {i}: {class_name}")
# 顯示每個類別的圖片
plot_class_images(train_images, train_labels, class_names)
建議用Colab或者是VSCode 在開啟 .ipynb 檔案去跑,可以分段的測試
需安裝套件tensorflow
scikit-learn
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
# Data 載入資料
from tensorflow.keras.datasets import fashion_mnist
# 內建的資料集 fashion_mnist
# 切割 訓練檔案 與測試檔案
(x_train_set, y_train_set), (x_test, y_test) = fashion_mnist.load_data()
# Split data 切割資料
from sklearn.model_selection import train_test_split
# 利用sklearn模組來切割資料 將原先訓練資料 在分割出 訓練資料 與驗證資料
x_train, x_valid, y_train, y_valid = train_test_split(x_train_set,
y_train_set,
random_state=1)
# Preprocessing 資料縮放 (0~1)
x_train = x_train / 255.0
x_valid =x_valid / 255.0
x_test = x_test / 255.0
# Build Model 建立模組
import tensorflow as tf
from tensorflow import keras
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Flatten, Dense
model = Sequential([
#輸入層:將 28*28攤平成一維度
Flatten(input_shape=x_train.shape[1:]),
#輸出層:10類別,10個神經元
Dense (units=10, activation='softmax')
])
print(model.summary())
# Compile model.compile 方法用來配置模型的學習過程
model.compile(loss='sparse_categorical_crossentropy',
optimizer='sgd',
metrics= ['accuracy'])
# Train 分批訓練 預設每批32筆分一批次
train = model.fit(x_train, y_train,
epochs=20,
validation_data=(x_valid, y_valid))
#呈現訓練曲線
pd.DataFrame(train.history).plot()
plt.grid(True)
plt.show()
# Evaluate #顯示結果 誤差值與準確性
model.evaluate(x_test, y_test)
# Predict
y_proba = model.predict(x_test) #實際去算y
#實際上預測結果 會是 一個串列裡面包含對10種類別預測的機率值
#所以 要用argmax挑出最大的數值
y_pred = np.argmax(y_proba, axis=1)
print(f'預測類別是: {y_pred[1]}')
plt.imshow(x_test[1], cmap=plt.cm.gray)
# Confusion matrix 利用混淆矩陣來看 驗證結果
from sklearn.metrics import confusion_matrix
print(confusion_matrix(y_test, y_pred))
預測的類別是2,秀出檢測的圖片剛好也是類別2,還好沒漏氣
紅色斜線代表預測正確的,對照圖,預測標籤0但真實標籤是1的有3個,真實標籤2有誤判13個。
由混淆矩陣可以快速發現,哪裡誤判比較多,讓我們看預測標籤6 誤判 真實標籤0,2,4特別多,往回看一下圖檔,也難怪外輪廓都長得很像,特徵太接近,圖檔又小才28*28,用的神經網路太簡單,難怪學得不好。
model = Sequential([
#第一層:將 28*28攤平成一維度
Flatten(input_shape=x_train.shape[1:]), #x_train.shape[1:] 28,28
#第二層
Dense (units=300, activation='relu'), #
Dense (units=200, activation='relu'),
Dense (units=100, activation='relu'),
#輸出層:10類別,10個神經元
Dense (units=10, activation='softmax')
])
對照一下2層與5層結果,預測6,誤判0 次數從136降到108了,也與理論實際符合在一定情況下,神經網路層越多預測結果越好。