1. 程式人生 > >[tensorflow]tf.keras入門2-分類

[tensorflow]tf.keras入門2-分類

目錄

模型預測

總體程式碼

主要介紹基於tf.keras的Fashion MNIST資料庫分類,

首先是函式的呼叫,對於tensorflow只有在版本1.2以上的版本才有tf.keras庫。另外推薦使用python3,而不是python2。

# TensorFlow and tf.keras
import tensorflow as tf
from tensorflow import keras

# 其他庫
import numpy as np
import matplotlib.pyplot as plt
#檢視版本
print(tf.__version__)
#1.9.0

Fashion MNIST資料庫

fashion mnist資料庫是mnist資料庫的一個拓展。目的是取代mnist資料庫,類似MINST資料庫,fashion mnist資料庫為訓練集60000張,測試集10000張的28X28大小的服裝彩色圖片。具體分類如下:

標註編號 描述
0 T-shirt/top(T恤)
1 Trouser(褲子)
2 Pullover(套衫)
3 Dress(裙子)
4 Coat(外套)
5 Sandal(涼鞋)
6 Shirt(汗衫)
7 Sneaker(運動鞋)
8 Bag(包)
9 Ankle boot(踝靴)

樣本描述如下:

名稱 描述 樣本數量 檔案大小 連結
train-images-idx3-ubyte.gz 訓練集的影象 60,000 26 MBytes 下載
train-labels-idx1-ubyte.gz 訓練集的類別標籤 60,000 29 KBytes 下載
t10k-images-idx3-ubyte.gz 測試集的影象 10,000 4.3 MBytes 下載
t10k-labels-idx1-ubyte.gz 測試集的類別標籤 10,000 5.1 KBytes 下載

單張影象展示程式碼:

#分類標籤
class_names = ['T-shirt/top', 'Trouser', 'Pullover', 'Dress', 'Coat', 
               'Sandal', 'Shirt', 'Sneaker', 'Bag', 'Ankle boot']
#單張影象展示,推薦使用python3
plt.figure()
plt.imshow(train_images[0])
#新增顏色漸變條
plt.colorbar()
#不顯示網格線
plt.gca().grid(False)

效果圖:

樣本的展示程式碼:

#影象預處理
train_images = train_images / 255.0
test_images = test_images / 255.0

#樣本展示
plt.figure(figsize=(10,10))
for i in range(25):
    plt.subplot(5,5,i+1)
    plt.xticks([])
    plt.yticks([])
    plt.grid('off')
    plt.imshow(train_images[i], cmap=plt.cm.binary)
    plt.xlabel(class_names[train_labels[i]])

效果圖:

分類模型的建立

檢測模型輸入資料為28X28,1個隱藏層節點數為128,輸出類別10類,程式碼如下:

#檢測模型    
model = keras.Sequential([
    keras.layers.Flatten(input_shape=(28, 28)),
    keras.layers.Dense(128, activation=tf.nn.relu),
    keras.layers.Dense(10, activation=tf.nn.softmax)
])    

模型訓練引數設定:

model.compile(optimizer=tf.train.AdamOptimizer(), 
          loss='sparse_categorical_crossentropy', #多分類的對數損失函式
          metrics=['accuracy']) #準確度

模型的訓練:

model.fit(train_images, train_labels, epochs=5)

模型預測

預測函式:

predictions = model.predict(test_images)

分類器是softmax分類器,輸出的結果一個predictions是一個長度為10的陣列,陣列中每一個數字的值表示其所對應分類的概率值。如下所示:

predictions[0]
array([2.1840347e-07, 1.9169457e-09, 4.5915922e-08, 5.3185740e-08,
       6.6372898e-08, 2.6090498e-04, 6.5197796e-06, 4.7861701e-03,
       2.9425648e-06, 9.9494308e-01], dtype=float32)

對於predictions[0]其中第10個值最大,則該值對應的分類為class[9]ankle boot。

np.argmax(predictions[0]) #9
test_labels[0] #9

前25張圖的分類效果展示:

#前25張圖分類效果
plt.figure(figsize=(10,10))
for i in range(25):
    plt.subplot(5,5,i+1)
    plt.xticks([])
    plt.yticks([])
    plt.grid('off')
    plt.imshow(test_images[i], cmap=plt.cm.binary)
    predicted_label = np.argmax(predictions[i])
    true_label = test_labels[i]
    if predicted_label == true_label:
      color = 'green'
    else:
      color = 'red'
    plt.xlabel("{} ({})".format(class_names[predicted_label], 
                                  class_names[true_label]),
                                  color=color)

效果圖,綠色標籤表示分類正確,紅色標籤表示分類錯誤:

對於單個影象的預測,需要將影象28X28的輸入轉換為1X28X28的輸入,轉換函式為np.expand_dims。函式使用如下:https://www.zhihu.com/question/265545749

#格式轉換
img = (np.expand_dims(img,0))
print(img.shape) #1X28X28

predictions = model.predict(img)
prediction = predictions[0]
np.argmax(prediction) #9

總體程式碼

# TensorFlow and tf.keras
import tensorflow as tf
from tensorflow import keras

# 其他庫
import numpy as np
import matplotlib.pyplot as plt
#檢視版本
print(tf.__version__)
#1.9.0

fashion_mnist = keras.datasets.fashion_mnist
(train_images, train_labels), (test_images, test_labels) = fashion_mnist.load_data()

#分類標籤
class_names = ['T-shirt/top', 'Trouser', 'Pullover', 'Dress', 'Coat', 
               'Sandal', 'Shirt', 'Sneaker', 'Bag', 'Ankle boot']
#單張影象展示,推薦使用python3
plt.figure()
plt.imshow(train_images[0])
#新增顏色漸變條
plt.colorbar()
#不顯示網格線
plt.gca().grid(False)

#影象預處理
train_images = train_images / 255.0
test_images = test_images / 255.0

#樣本展示
plt.figure(figsize=(10,10))
for i in range(25):
    plt.subplot(5,5,i+1)
    plt.xticks([])
    plt.yticks([])
    plt.grid('off')
    plt.imshow(train_images[i], cmap=plt.cm.binary)
    plt.xlabel(class_names[train_labels[i]])

#檢測模型    
model = keras.Sequential([
    keras.layers.Flatten(input_shape=(28, 28)),
    keras.layers.Dense(128, activation=tf.nn.relu),
    keras.layers.Dense(10, activation=tf.nn.softmax)
])    

model.compile(optimizer=tf.train.AdamOptimizer(), 
          loss='sparse_categorical_crossentropy', #多分類的對數損失函式
          metrics=['accuracy']) #準確度

model.fit(train_images, train_labels, epochs=5)

predictions = model.predict(test_images)

#前25張圖分類效果
plt.figure(figsize=(10,10))
for i in range(25):
    plt.subplot(5,5,i+1)
    plt.xticks([])
    plt.yticks([])
    plt.grid('off')
    plt.imshow(test_images[i], cmap=plt.cm.binary)
    predicted_label = np.argmax(predictions[i])
    true_label = test_labels[i]
    if predicted_label == true_label:
      color = 'green'
    else:
      color = 'red'
    plt.xlabel("{} ({})".format(class_names[predicted_label], 
                                  class_names[true_label]),
                                  color=color)
    
#單個影象檢測
img = test_images[0]
print(img.shape) #28X28

#格式轉換
img = (np.expand_dims(img,0))
print(img.shape) #1X28X28

predictions = model.predict(img)
prediction = predictions[0]
np.argmax(prediction) #9