---
# System prepended metadata

title: Fashion-MNIST with Keras
tags: [TensorFlow, Computer Vision, Fashion-MNIST, keras, image classification]

---

###### tags: `Computer Vision` `keras` `Fashion-MNIST` `TensorFlow` `image classification`
# Fashion-MNIST with Keras
[Github: Fashion-MNIST with Keras code (Jupyter)](https://github.com/chauuyun/Computer-Vision-Project/blob/main/Fashion-MNIST%20with%20Keras/Fashion-MNIST%20with%20Keras.ipynb)
#### 主要的神經網路程式碼:
```python=1
##Step 4
  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)
        ])
```


```python=1
keras.layers.Flatten(input_shape=(28, 28))
```
* 代表input的圖片size

```python=1
keras.layers.Dense(128, activation=tf.nn.relu)
```
* 其中128代表神經元個數 (可為32/128/512)
```python=1
keras.layers.Dense(10, activation=tf.nn.softmax)
```
* 10為Output Layers的數量，也就是Fashion-MNIST的種類(10種)

```python=1
for epoch in [5, 10, 15, 20]:
      latest = checkpoint_path.format(epoch=epoch)
      model.load_weights(latest)
```
![](https://i.imgur.com/5ONRemq.png)
* Epoch為執行週期，越多不一定越準確，因為會導致Overfitting


* Batch size: 為訓練多少樣本更新一次權重
batch_size的大小會決定訓練時梯度的平滑程度，而較大的batch_size會有利於模型收斂，但是在訓練模型時跌代的隨機性會變小，所以會影響模型的泛化能力。
較小的batch_size因為訓練資料有較多的隨機性(batch_size越大相鄰batch的差異越小)，模型訓練出來的泛化能力較好。泛化能力就會進而影響到accuracy。
調整不同batch_size時，因為每次迭代所求出的loss平均(梯度)不同，這會影響到模型參數的更新造成最後的accuracy也不同。

```python=1
## Step 6
model.compile(optimizer='adam',
        loss='sparse_categorical_crossentropy', 
                metrics=['accuracy'])
```
其中loss為損失函數
有不同種損失函數，舉例:
```
loss='categorical_crossentropy'
loss='sparse_categorical_crossentropy'
```
1. categorical_crossentropy可用於多分類任務，label為one-hot形式。
Example:
    one-hot編碼：
    ``
　　[[0, 1, 0],
　　 [1, 0, 0],
　　 [0, 0, 1]]
   ``
　　 每條每一行是一個label的編碼，1所在的位置代表label

2. sparse_categorical_crossentropy跟categorical_crossentropy的區別是其標籤不是one-hot的形式，而是integer。
比如在上述categorical_crossentropy的Example中是
``
[1,0,0]
``
在sparse_categorical_crossentropy中是3。
Example:
    整數編碼：
    ``
    [2, 0, 1, 5, 19]
    ``
    每個整數都是label


#### Result:
![](https://i.imgur.com/85jpDpW.png)
翻轉後標籤依然預測正確:
![](https://i.imgur.com/TvrHRDl.png)
