keras實現mnist數據集手寫數字識別


一. Tensorflow環境的安裝

這里我們只講CPU版本,使用 Anaconda 進行安裝

a.首先我們要安裝 Anaconda

鏈接:https://pan.baidu.com/s/1AxdGi93oN9kXCLdyxOMnRA 密碼:79ig

過程如下:

第一步:點擊next

第二步:I Agree

第三步:Just ME

第四步:自己選擇一個恰當位置放它就好

第五步:建議只選擇第二個

第六步:就直接install啦啦啦啦,然后你就可以上手萬能庫了

b.找到Anaconda prompt,然后

 

以管理員的身份打開終端

c.按照以下步驟在 Anaconda 環境中安裝 TensorFlow:

  1. 通過調用以下命令創建名為 tensorflow 的 conda 環境:

C:> conda create -n tensorflow pip python=3.5

  1. 通過發出以下命令激活 conda 環境:

C:> activate tensorflow (tensorflow)C:> # Your prompt should change

  1. 發出相應命令以在 conda 環境中安裝 TensorFlow。要安裝僅支持 CPU 的 TensorFlow 版本,請輸入以下命令:

(tensorflow)C:> pip install --ignore-installed --upgrade tensorflow

d.測試tensorflow的安裝

啟動Anaconda prompt(同樣是以管理員身份打開)終端。

如果您是通過 Anaconda 進行安裝,請激活您的 Anaconda 環境。

終端輸入 activate tensorflow即可

然后再輸入python

如:

在 Python 交互式 shell 中輸入以下幾行簡短的程序代碼:

>>> import tensorflow as tf

>>> hello = tf.constant('Hello, TensorFlow!')

>>> sess = tf.Session()

>>> print(sess.run(hello))

如果系統輸出以下內容,說明您可以開始編寫 TensorFlow 程序了:

Hello, TensorFlow!

完成以上步驟,你就把tensorflow搭建好了......

二.安裝keras

a.首先,擔心我們anaconda里面各個包未更新到最新,所以我們以管理員的身份打開Anaconda終端,輸入 conda update conda,執行完后,再輸入:conda update --all

b.然后我們激活我們的tensorflow環境:activate tensorflow

c.然后我們就可以輸入:pip install keras

三.完成上述步驟,我們就可以來試下加載keras里面的mnist數據集了

# Plot ad hoc mnist instances
from keras.datasets import mnist
import matplotlib.pyplot as plt
# load (downloaded if needed) the MNIST dataset
(X_train, y_train), (X_test, y_test) = mnist.load_data()
# plot 4 images as gray scale
plt.subplot(221)
plt.imshow(X_train[0], cmap=plt.get_cmap('gray'))
plt.subplot(222)
plt.imshow(X_train[1], cmap=plt.get_cmap('gray'))
plt.subplot(223)
plt.imshow(X_train[2], cmap=plt.get_cmap('gray'))
plt.subplot(224)
plt.imshow(X_train[3], cmap=plt.get_cmap('gray'))
# show the plot
plt.show()

 

 

好了接下來我們對上述代碼進行進一步的解釋:
 
from keras.datasets import mnist 這里是從keras的datasets中導入mnist數據集
import matplotlib.pyplot as plt  這里是將matplotlib.pyplot重名為plt
(X_train, y_train), (X_test, y_test) = mnist.load_data()#
所以這里返回的是手寫圖片的兩個tuple,第一個tuple存儲的是我們已經人工分類好的圖片,也就是每一張圖片都有自己對應的標簽,然后可以拿來訓練,第二個tuple存儲的是我們還沒分類的圖片,在第一個tuple訓練完后,我們可以把第二個tuple利用神經網絡進行分類,根據實驗結果的真實值與我們的預測值進行對比得到相應的損失值,再利用反向傳播進行參數更新,再進行分類,然后重復前述步驟直至損失值最小
# plot 4 images as gray scale
plt.subplot(331)
這個subplot函數的作用是確定圖像的位置以及圖像的個數,前兩個3的意思是可以放9張圖片,如果變成221的話,就是可以放4張圖片,然后后面的1,是確定圖像的位置,處於第一個,以下的subplot同理
plt.imshow(X_test[0], cmap=plt.get_cmap('gray'))
這里個把圖片顯示出來
X_train存儲的是圖像的像素點組成的list數據類型,這里面又由一個二維的list(28 x 28的像素點值)和一個對應的標簽list組成,y_train存儲的是對應圖像的標簽,也就是該圖像代表什么數字
plt.subplot(332)
plt.imshow(X_train[1], cmap=plt.get_cmap('gray'))
plt.subplot(333)
plt.imshow(X_train[2], cmap=plt.get_cmap('gray'))
plt.subplot(334)
plt.imshow(X_train[3], cmap=plt.get_cmap('gray'))
plt.subplot(335)
plt.imshow(X_train[4], cmap=plt.get_cmap('gray'))
plt.subplot(336)
plt.imshow(X_train[5], cmap=plt.get_cmap('gray'))
plt.subplot(337)
plt.imshow(X_train[6], cmap=plt.get_cmap('gray'))
plt.subplot(338)
plt.imshow(X_train[7], cmap=plt.get_cmap('gray'))
plt.subplot(339)
plt.imshow(X_train[8], cmap=plt.get_cmap('gray'))
在這里imshow函數的官方文檔:https://matplotlib.org/api/_as_gen/matplotlib.pyplot.imshow.html#matplotlib.pyplot.imshow
我們這里第一個參數是圖片的像素點值組成的數組(列表),第二個參數是指明圖片的色彩
# show the plot
plt.show()最后這里官方文檔是這樣說的:Display a figure. When running in ipython with its pylab mode, display all figures and return to the ipython prompt.,所以我們可以知道show函數是把所有圖片都展示出來。

 

效果:

多層感知機的baseline模型

import numpy
from keras.datasets import mnist # 從keras的datasets中導入mnist數據集
from keras.models import Sequential # 導入Sequential模型
from keras.layers import Dense # 全連接層用Dense類
from keras.layers import Dropout # 為輸入數據施加Dropout。Dropout將在訓練過程中每次更新參數時按一定概率(rate)隨機斷開輸入神經元,Dropout層用於防止過擬合
from keras.utils import np_utils # 導入np_utils是為了用one hot encoding方法將輸出標簽的向量(vector)轉化為只在出現對應標簽的那一列為1,其余為0的布爾矩陣

seed = 7 #設置隨機種子
numpy.random.seed(seed)
(X_train,y_train),(X_test,y_test) = mnist.load_data() #加載數據
#print(X_train.shape[0])
#數據集是3維的向量(instance length,width,height).對於多層感知機,模型的輸入是二維的向量,因此這里需要將數據集reshape,即將28*28的向量轉成784長度的數組。可以用numpy的reshape函數輕松實現這個過程。
num_pixels = X_train.shape[1] * X_train.shape[2] 
X_train = X_train.reshape(X_train.shape[0],num_pixels).astype('float32')
X_test = X_test.reshape(X_test.shape[0],num_pixels).astype('float32')

#給定的像素的灰度值在0-255,為了使模型的訓練效果更好,通常將數值歸一化映射到0-1
X_train = X_train / 255
X_test = X_test / 255
# one hot encoding
y_train = np_utils.to_categorical(y_train)
y_test = np_utils.to_categorical(y_test)
num_classes = y_test.shape[1]
# 搭建神經網絡模型了,創建一個函數,建立含有一個隱層的神經網絡
def baseline_model():
    model = Sequential() # 建立一個Sequential模型,然后一層一層加入神經元
    # 第一步是確定輸入層的數目正確:在創建模型時用input_dim參數確定。例如,有784個個輸入變量,就設成num_pixels。
    #全連接層用Dense類定義:第一個參數是本層神經元個數,然后是初始化方式和激活函數。這里的初始化方法是0到0.05的連續型均勻分布(uniform),Keras的默認方法也是這個。也可以用高斯分布進行初始化(normal)。
    # 具體定義參考:https://cnbeining.github.io/deep-learning-with-python-cn/3-multi-layer-perceptrons/ch7-develop-your-first-neural-network-with-keras.html
    model.add(Dense(num_pixels,input_dim=num_pixels,kernel_initializer='normal',activation='relu'))
    model.add(Dense(num_classes,kernel_initializer='normal',activation='softmax'))
    model.compile(loss='categorical_crossentropy',optimizer='adam',metrics=['accuracy'])
    return model

model = baseline_model()
#model.fit() 函數每個參數的意義參考:https://blog.csdn.net/a1111h/article/details/82148497
model.fit(X_train,y_train,validation_data=(X_test,y_test),epochs=10,batch_size=200,verbose=2) 
# 1、模型概括打印
model.summary()

scores = model.evaluate(X_test,y_test,verbose=0) #model.evaluate 返回計算誤差和准確率
print(scores)
print("Base Error:%.2f%%"%(100-scores[1]*100))

效果:

簡單的卷積神經網絡

前面介紹了如何加載訓練數據並實現一個簡單的單隱層神經網絡,並在測試集上取得了不錯的效果。現在要實現一個卷積神經網絡,想要在MNIST問題上取得更好的效果。

卷積神經網絡(CNN)是一種深度神經網絡,與單隱層的神經網絡不同的是它還包含卷積層、池化層、Dropout層等,這使得它在圖像分類的問題上有更優的效果。

# 導入需要的函數庫
import numpy
from keras.datasets import mnist
from keras.models import Sequential
# 神經網絡各層作用參考:https://blog.csdn.net/zhuzuwei/article/details/78651601
# Keras 層layers總結:https://blog.csdn.net/u010159842/article/details/78983841
from keras.layers import Dense
from keras.layers import Dropout # Dropout將在訓練過程中每次更新參數時按一定概率(rate)隨機斷開輸入神經元,Dropout層用於防止過擬合。
from keras.layers import Flatten # Flatten層用來將輸入“壓平”,即把多維的輸入一維化,常用在從卷積層到全連接層的過渡。Flatten不影響batch的大小。
from keras.layers.convolutional import Conv2D # 二維卷積層,即對圖像的空域卷積。
from keras.layers.convolutional import MaxPooling2D # 空間池化(也叫亞采樣或下采樣)降低了每個特征映射的維度,但是保留了最重要的信息
from keras.utils import np_utils
from keras import backend as K
K.set_image_dim_ordering('th') # 設置圖像的維度順序(‘tf’或‘th’)# 當前的維度順序如果為'th',則輸入圖片數據時的順序為:channels,rows,cols,否則:rows,cols,channels

seed = 7
numpy.random.seed(seed)
#將數據reshape,CNN的輸入是4維的張量(可看做多維的向量),第一維是樣本規模,第二維是像素通道,第三維和第四維是長度和寬度。並將數值歸一化和類別標簽向量化。

# load data
(X_train, y_train), (X_test, y_test) = mnist.load_data()
# reshape to be [samples][pixels][width][height]
X_train = X_train.reshape(X_train.shape[0], 1, 28, 28).astype('float32')
X_test = X_test.reshape(X_test.shape[0], 1, 28, 28).astype('float32')
 
X_train = X_train / 255
X_test = X_test / 255
# one hot encode outputs
y_train = np_utils.to_categorical(y_train)
y_test = np_utils.to_categorical(y_test)
num_classes = y_test.shape[1]


# 接下來構造CNN。

# 第一層是卷積層。該層有32個feature map,或者叫濾波器,作為模型的輸入層,接受[pixels][width][height]大小的輸入數據。feature map的大小是5*5,其輸出接一個‘relu’激活函數。
# 下一層是pooling層,使用了MaxPooling,大小為2*2。
# 下一層是Dropout層,該層的作用相當於對參數進行正則化來防止模型過擬合。
# 接下來是全連接層,有128個神經元,激活函數采用‘relu’。
# 最后一層是輸出層,有10個神經元,每個神經元對應一個類別,輸出值表示樣本屬於該類別的概率大小。
def baseline_model():
    # create model
    model = Sequential()
    model.add(Conv2D(32, (5, 5), input_shape=(1, 28, 28), activation='relu'))
    model.add(MaxPooling2D(pool_size=(2, 2)))
    model.add(Dropout(0.2))
    model.add(Flatten())
    model.add(Dense(128, activation='relu'))
    model.add(Dense(num_classes, activation='softmax'))
    # Compile model
    model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
    return model

# 開始訓練
# build the model
model = baseline_model()
# Fit the model
model.fit(X_train, y_train, validation_data=(X_test, y_test), epochs=10, batch_size=200, verbose=2)
# 1、模型概括打印
model.summary()
# Final evaluation of the model
scores = model.evaluate(X_test, y_test, verbose=0)
print("Baseline Error: %.2f%%" % (100-scores[1]*100))

效果(時間較長):

作者:_kimcho 來源:CSDN 原文:https://blog.csdn.net/weixin_41055137/article/details/81071226?utm_source=copy 版權聲明:本文為博主原創文章,轉載請附上博文鏈接!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM