TensorFlow 2.0學習筆記(1):服飾影像分類

Yanwei Liu
7 min readApr 9, 2020

--

2021/03/03更新檢查dataset時可以使用的程式

train_images[0]          #查看training set中的第一張圖片
train_labels.max() #查看training set中最大的label (0~9則為9)
train_labels.min() #查看training set中最小的label (0~9則為0)
train_images[train_labels==2] #查看training set中,label是2的圖片
tf.keras.utils.plot_model(model) #將搭建好的TensorFlow可視化呈現model.layers[1].weights #第二層layer的weights
model.layers[1].output #第二層layer的output
#加入testing的資料,來查看val acc和val loss
model.fit(train_images, train_labels, epochs=10, validation_data=(test_images, test_labels))
#將對1張圖的prediction結果進行加總,如果使用softmax的話,加總值應該等於1
sum(predictions[0])

安裝套件

pip install -U tensorflow_datasets #用來下載、讀取dataset

載入套件

import tensorflow as tfimport tensorflow_datasets as tfdstfds.disable_progress_bar()import mathimport numpy as npimport matplotlib.pyplot as plt

本次的資料集選用Fashion MNIST dataset,該資料有70,000張灰階圖片,分成10個類別,28x28的圖片尺寸

載入資料

dataset, metadata = tfds.load('fashion_mnist', as_supervised=True, with_info=True)train_dataset, test_dataset = dataset['train'], dataset['test']#模型用train_dataset訓練;用test_dataset進行測試

建立標籤

class_names = ['T-shirt/top','Trouser','Pullover','Dress', 'Coat','Sandal','Shirt','Sneaker','Bag','Ankle boot']#該資料集有10種不同的標籤[0~9]

檢視資料

num_train_examples = metadata.splits['train'].num_examples
num_test_examples = metadata.splits['test'].num_examples
print("Number of training examples: {}".format(num_train_examples))
print("Number of test examples: {}".format(num_test_examples))
# Number of training examples: 60000
# Number of test examples: 10000

預處理資料

#正規化將pixel從[0~255]變成[0~1]之間的範圍def normalize(images, labels):    images = tf.cast(images, tf.float32)    images /= 255    return images, labels# map函數將normalize函式映射到train_dataset和test_datasettrain_dataset =  train_dataset.map(normalize)test_dataset  =  test_dataset.map(normalize)# 將圖片快取至記憶體當中,加快後續載入速度train_dataset =  train_dataset.cache()test_dataset  =  test_dataset.cache()

檢視圖片

# 將圖片移除顏色for image, label in test_dataset.take(1):    break    image = image.numpy().reshape((28,28))# 單一圖片plt.figure()plt.imshow(image, cmap=plt.cm.binary)plt.colorbar()plt.grid(False)plt.show()# 顯示前25張圖片
plt.figure(figsize=(10,10))
i = 0for (image, label) in test_dataset.take(25): image = image.numpy().reshape((28,28)) plt.subplot(5,5,i+1) plt.xticks([]) plt.yticks([]) plt.grid(False) plt.imshow(image, cmap=plt.cm.binary) plt.xlabel(class_names[label]) i += 1plt.show()

建立模型

model = tf.keras.Sequential([    tf.keras.layers.Flatten(input_shape=(28, 28, 1)),  #輸入層    tf.keras.layers.Dense(128, activation=tf.nn.relu), #隱藏層    tf.keras.layers.Dense(10)                          #輸出層])#(input_shape=(28, 28, 1)),將圖片尺寸從28x28轉到1維陣列(784 pixels)
#(128, activation=tf.nn.relu),128個神經元、激活函數使用RELU
#(10),代表著輸出有10個類別

編譯模型

model.compile(optimizer='adam',loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),metrics=['accuracy'])# optimizer:使用adam來降低損失
# loss:測量損失
# metrics:使用accuracy來衡量

訓練模型

BATCH_SIZE = 32train_dataset = train_dataset.cache().repeat().shuffle(num_train_examples).batch(BATCH_SIZE)test_dataset = test_dataset.cache().batch(BATCH_SIZE)model.fit(train_dataset, epochs=5, steps_per_epoch=math.ceil(num_train_examples/BATCH_SIZE))# .repeat()重複執行;
# .shuffle()打散資料,讓電腦不跟著順序訓練;
# .batch(BATCH_SIZE)每次使用32張圖片進行訓練

評估準確度

test_loss, test_accuracy = model.evaluate(test_dataset, steps=math.ceil(num_test_examples/32))print('Accuracy on test dataset:', test_accuracy)

進行預測

for test_images, test_labels in test_dataset.take(1):    test_images = test_images.numpy()    test_labels = test_labels.numpy()    predictions = model.predict(test_images)predictions[0]              #預測第一張圖片,顯示10個類別的信心分數
np.argmax(predictions[0]) #用numpy找出信心分數最高的類別
test_labels[0] #用test集判斷是否與預測結果一樣

--

--