# 1. 準備數據集
首先下載[Fashion MNIST](https://github.com/zalandoresearch/fashion-mnist)數據集。該數據集包含 10 個類別的 70,000 個灰度圖像。這些圖像以低分辨率(28x28 像素)展示了單件衣物,如下所示:

當然這里還是采用自帶的方式加載數據集:
```
# 導入數據集
fashion_mnist = tf.keras.datasets.fashion_mnist
(train_images, train_labels), (test_images, test_labels) = fashion_mnist.load_data()
```
然后程序會自動下載對應的數據集:

可以看下其維度:

從圖中可以知道這里和上個案例保持一致,還是每個圖片為28x28。類似的這里我們需要對每個圖片進行處理,當然可以先查看一下某個圖片的內容:
```
# 導入工具
import numpy as np
import matplotlib.pyplot as plt
plt.figure()
plt.imshow(train_images[100])
plt.colorbar() # 右邊的顏色值
plt.grid(False)
plt.show()
```
結果:

因此,還是縮小至0到1之間:
```
train_images = train_images / 255.0
test_images = test_images / 255.0
```
然后再次調用前面的繪圖代碼,觀察右邊豎直的顏色值:

很明顯,這里達到了目標。
# 2. 定義模型
這里還是定義和上一個案例一樣:
```
model = tf.keras.models.Sequential()
model.add( tf.keras.layers.Flatten(input_shape=(28, 28)))
model.add(tf.keras.layers.Dense(512, activation="relu"))
model.add(tf.keras.layers.Dropout(0.2))
model.add(tf.keras.layers.Dense(10, activation='softmax'))
```
也就是先拉平,然后裝入全連接層,Dropout層,然后更具目標個數來進行定義最終輸出層的維度10。
然后定義優化器/損失函數和評價指標:
```
model.compile(optimizer='adam',?
loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),? ?
metrics=['accuracy'])
```
訓練模型:
```
model.fit(train_images, train_labels, epochs=10)
```

# 3. 模型評估:
```
model.evaluate(test_images, test_labels, verbose=2)
```

結果表明,模型在測試數據集上的準確率略低于訓練數據集。訓練準確率和測試準確率之間的差距代表*過擬合*。過擬合是指機器學習模型在新的、以前未曾見過的輸入上的表現不如在訓練數據上的表現。**過擬合**的模型會“記住”訓練數據集中的噪聲和細節,從而對模型在新數據上的表現產生負面影響。
基本手段有:Early Stop、Dropout、L1L2等。
當然,這部分內容等后續再寫,這里以學習和復寫搭建模型為主。