python3 23.keras使用交叉熵代價函數進行MNIST數據集簡單分類 學習筆記

前言

     計算機視覺系列之學習筆記主要是本人進行學習人工智能(計算機視覺方向)的代碼整理。本系列所有代碼是用python3編寫,在平臺Anaconda中運行實現,在使用代碼時,默認你已經安裝相關的python庫,這方面不做多餘的說明。本系列所涉及的所有代碼和資料可在我的github上下載到,gitbub地址:https://github.com/mcyJacky/DeepLearning-CV,如有問題,歡迎指出。

一、交叉熵代價函數簡介

     之前第22篇對MNIST數據集進行簡單分類使用代價函數是均方差代價函數mse(二次代價函數),這種代價函數更加適用於迴歸問題處理。本篇我們使用交叉熵(Cross Entropy)代價函數,它更加適用於分類問題,它的基本公式是:
E=(tlny+(1t)ln(1y))E = -(t \ln y + (1-t) \ln (1-y))
其中,yy是預測值,tt是正確值。當兩者越是接近時,EE會越小。

二、交叉熵代價函數使用

     與第22篇唯一不同的是這邊使用交叉熵代價函數,它的使用格式一般有兩種:loss = ‘categorical_crossentropy’, # 或者使用loss = keras.losses.categorical_crossentropy,具體用法如下:

import numpy as np
from keras.datasets import mnist
# keras提供的numpy工具包
from keras.utils import np_utils
from keras.models import Sequential
from keras.layers import Dense
from keras.optimizers import SGD
import keras

# 載入數據
(x_train,y_train), (x_test,y_test) = mnist.load_data()

# (6000,28,28)
print('x_shape:', x_train.shape)
# (6000)
print('y_shape:', y_train.shape)

# 進行數據轉換,並歸一化
# (60000,28,28) -> (60000, 784)
x_train = x_train.reshape(x_train.shape[0], -1)/255.0
x_test = x_test.reshape(x_test.shape[0], -1)/255.0
# 換one hot格式
y_train = np_utils.to_categorical(y_train, num_classes=10)
y_test = np_utils.to_categorical(y_test, num_classes=10)

# 創建模型:輸入784個神經元,輸出10個神經元 784-10
model = Sequential([
        Dense(units=10, input_dim=784, bias_initializer='one', activation='softmax')
    ])

# 定義優化器,loss function, 訓練過程中的準確率
model.compile(
    optimizer = sgd,
    loss = 'categorical_crossentropy', #  或者使用loss = keras.losses.categorical_crossentropy,
    metrics = ['accuracy']
)

# 進行模型訓練
model.fit(x_train, y_train, batch_size=32, epochs=10)

# 評估模型
loss, accuracy = model.evaluate(x_test, y_test)

print('\ntest loss:', loss)
print('accuracy:', accuracy)

# 輸出結果:
# x_shape: (60000, 28, 28)
# y_shape: (60000,)
# Epoch 1/10
# 60000/60000 [==============================] - 2s 41us/step - loss: 0.3778 - acc: 0.8930
# Epoch 2/10
# 60000/60000 [==============================] - 2s 37us/step - loss: 0.3033 - acc: 0.9148
# Epoch 3/10
# 60000/60000 [==============================] - 2s 38us/step - loss: 0.2895 - acc: 0.9184
# Epoch 4/10
# 60000/60000 [==============================] - 2s 39us/step - loss: 0.2830 - acc: 0.9209
# Epoch 5/10
# 60000/60000 [==============================] - 2s 37us/step - loss: 0.2783 - acc: 0.9218
# Epoch 6/10
# 60000/60000 [==============================] - 2s 39us/step - loss: 0.2744 - acc: 0.9234
# Epoch 7/10
# 60000/60000 [==============================] - 2s 41us/step - loss: 0.2713 - acc: 0.9243
# Epoch 8/10
# 60000/60000 [==============================] - 2s 38us/step - loss: 0.2691 - acc: 0.9256
# Epoch 9/10
# 60000/60000 [==============================] - 2s 39us/step - loss: 0.2665 - acc: 0.9254
# Epoch 10/10
# 60000/60000 [==============================] - 2s 38us/step - loss: 0.2652 - acc: 0.9253
# 10000/10000 [==============================] - 0s 19us/step

# test loss: 0.2759707436442375
# accuracy: 0.9201

     使用交叉熵代價函數後,通過訓練10個週期,得到測試集的準確率約92.01%,因這個訓練集比較簡單,所以和之前使用均方差代價函數的計算結果相差不大。在大型複雜的項目中,我們還會通常用到DropOut正則化、使用其他優化器的方法,這個我們在接下來的篇幅介紹。

     
     
     
     
【參考】:
     1. 城市數據團課程《AI工程師》計算機視覺方向
     2. deeplearning.ai 吳恩達《深度學習工程師》
     3. 《機器學習》作者:周志華
     4. 《深度學習》作者:Ian Goodfellow


轉載聲明:
版權聲明:非商用自由轉載-保持署名-註明出處
署名 :mcyJacky
文章出處:https://blog.csdn.net/mcyJacky

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