TensorFlow(Keras) 一步步實現Fashion MNIST衣服鞋子圖片分類 (2) Coursera深度學習教程分享

@[TOC](Coursera TensorFlow(Keras) 一步步手寫體Fashion Mnist識別分類(2) Tensorflow和ML, DL 機器學習/深度學習Coursera教程分享 )

Fashion MNIST數據簡介

相信很多人,對於Mnist這個數據集都已經學膩了。現在出了個Fashion Mnist更加有趣,而且tensorflow/keras自帶這個數據集非常方便調用。這個數據集包含了很多衣服、鞋子的圖片,每張圖片恰好也是[28*28]的shape,很容易處理。

在這裏插入圖片描述

我們可以打印出一張看看,是一隻鞋子。

在這裏插入圖片描述

模型構建

我們按照coursera上的教程直接上手寫一個分類模型:

先下載數據

from tensorflow.examples.tutorials.mnist import input_data
data = input_data.read_data_sets('data/fashion', source_url='http://fashion-mnist.s3-website.eu-central-1.amazonaws.com/')
# 如果已經下載直接讀入
data = input_data.read_data_sets('data/fashion')
BATCH_SIZE = 64
# 可以檢查下數據,沒問題
data.train.next_batch(BATCH_SIZE)

當然,keras裏面已經有這個數據集了,直接load就行。下面開始寫模型:

from tensorflow import keras
fashion_mnist = keras.datasets.fashion_mnist
(X_train, Y_train), (X_test, Y_test) = fashion_mnist.load_data()
# 輸出看看X, Y的 shape
X_train.shape, X_test.shape, Y_train.shape, Y_test.shape
# ((60000, 28, 28), (10000, 28, 28), (60000,), (10000,))
#simply normlizing the data
X_train = X_train / 255.
X_test = X_test / 255.
import tensorflow as tf
from keras import Sequential
from keras.layers import Dense, Conv2D, MaxPool2D, Flatten
model = Sequential()
model.add(Flatten())
model.add(Dense(128, activation='relu'))
model.add(Dense(10, activation='softmax'))
model.compile(tf.train.AdamOptimizer(), loss='sparse_categorical_crossentropy', metrics=['acc'])
model.fit(X_train, Y_train, epochs=10, batch_size=32, validation_data=(X_test, Y_test))

Train on 60000 samples, validate on 10000 samples
Epoch 1/10
60000/60000 [] - 3s 48us/step - loss: 0.2165 - acc: 0.9197 - val_loss: 0.3426 - val_acc: 0.8861
Epoch 2/10
60000/60000 [
] - 3s 49us/step - loss: 0.2097 - acc: 0.9211 - val_loss: 0.3956 - val_acc: 0.8603
Epoch 3/10
60000/60000 [==============================] - 3s 47us/step - loss: 0.2074 - acc: 0.9215 - val_loss: 0.3464 - val_acc: 0.8814

模型效果

檢查模型預測結果:
預測20條
preds = model.predict(X_test[:20])
preds.argmax(axis=-1)
預測結果:
array([9, 2, 1, 1, 6, 1, 4, 6, 5, 7, 4, 5, 5, 3, 4, 1, 2, 2, 8, 0])
真是結果:
Y_test[:20]
array([9, 2, 1, 1, 6, 1, 4, 6, 5, 7, 4, 5, 7, 3, 4, 1, 2, 4, 8, 0])
發現大多數都預測正確了。
在全部數據集上測試模型結果:
model.evaluate(X_test, Y_test)
loss和準確率accuracy分別如下:
[0.3542726508885622, 0.8834]

我們也可以增加一個keras的callback函數,每個epoch結束時調用

class myCallback(tf.keras.callbacks.Callback):
      def on_epoch_end(self, epoch, logs={}):
            if(logs.get('acc')>0.9):
                print("\nReached 90% accuracy so cancelling training!")
#             if(logs.get('loss')<0.15):
#                 print("\nReached 0.15 loss so cancelling training!")
                self.model.stop_training = True

callbacks = myCallback()

這樣我們再次訓練的時候,一旦準確率超過90%,訓練就會停止。

model.fit(X_train, Y_train, epochs=10, batch_size=32, callbacks=[callbacks])

Epoch 1/10
60000/60000 [==============================] - 3s 45us/step - loss: 0.1320 - acc: 0.9498

Reached 90% accuracy so cancelling training!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章