python深度學習---手寫數字識別

#訓練神經網絡

#給出一張28*28像素手寫0-9數字圖片,判斷出數字

#準備:訓練庫[圖片訓練集,標籤訓練集,圖片測試集,標籤測試集]

#訓練集鏈接:https://pan.baidu.com/s/11sicY5zfXgUTThY74RAcyw 
提取碼:uxcg

#安裝keras庫,tensorflow[老式電腦,cpu可能不支持最新版tensorflow,指定版本==1.5可以]

#安裝庫路徑,使用國內源會快很多,類似下面格式

#pip install jieba -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com#安裝jieba示例

創建mnist.py

功能封裝圖片和標籤加載處理類和方法:

import  numpy  as  np
class  loader(object):#加載文件內容
    def __init__(self,path,count):
        self.path=path
        self.count=count
    def get_file_content(self):
        print(self.path)
        f=open(self.path,"rb")
        content=f.read()
        f.close()
        return  content
class  ImageLoade(loader):
    def get_picture(self,content,index):
        start=index*28*28+16
        picture=[]
        for i in range(28):
            picture.append([])
            for j in range(28):
                byte1=content[start+i*28+j]
                picture[i].append(byte1)#28*28的一幅圖片
        return  picture
    def get_one_sample(self,picture):
        sample=[]
        for i in range(28):
            for j in range(28):
                sample.append(picture[i][j])
        return  sample#轉換成784行向量
    def load(self,oneraw=False):
        content=self.get_file_content()#獲取文件字節數組
        data_set=[]
        for index in range(self.count):#count爲樣本個數
            onepic=self.get_picture(content,index)#得到一幅圖片,二維數組
            if oneraw:
                onepic=self.get_one_sample(onepic)
            data_set.append(onepic)
        return data_set
class   LabelLoad(loader):#標籤數據加載器
    def load(self):
        content=self.get_file_content()#得到文件字節數組
        labels=[]
        for index in range(self.count):
            onelabel=content[index+8]#文件頭八個字節
            onelabelvec=self.norm(onelabel)#編碼????
            labels.append(onelabelvec)
        return labels#返回一個數組[[],[],[].....]
    def norm(self,label):
        labelvec=[]
        label_value=label#字節轉int類型??
        for i in range(10):#one-hot編碼
            if i==label_value:
                labelvec.append(1)
            else:
                labelvec.append(0)
        return  labelvec
def get_train_data_set(num,oneraw=False):#獲得訓練數據集
    image_loader=ImageLoade("train-images.idx3-ubyte",num)

    label_loader=LabelLoad("t10k-labels.idx1-ubyte",num)

    return image_loader.load(oneraw),label_loader.load()#返回[[],[],[]......]#28個
def get_test_data_set(num,oneraw=False):
    image_loader=ImageLoade("t10k-images.idx3-ubyte",num)

    label_loader=LabelLoad("t10k-labels.idx1-ubyte",num)

    return image_loader.load(oneraw),label_loader.load()
def printimg(onepic):
    onepic=onepic.reshape(28,28)
    for i in range(28):
        for j in range(28):
            if onepic[i,j]==0:
                print("  ",end="")
            else:
                print("* ",end="")
        print("")

創建deep_learn.py

功能:創建模型,訓練數據,生成modul庫

import mnist
import numpy as np
from keras.models import Sequential#順序模型
from keras.layers import Dense,Dropout,Activation,Flatten
#dense fc(全連接層),Activation激活層
from keras.layers import Conv2D,MaxPooling2D,AveragePooling2D

nb_class=10
kernel_size=(5,5)#卷積核大小
pool_size=(2,2)
img_rows,img_cols=28,28
batch_size=128#批處理樣本數量
epochs=600 #迭代次數

input_shape=(img_rows,img_cols,1)#圖片維度
#X_train[[],[],[],[].......]
X_train,Y_train=mnist.get_train_data_set(1000,False)#加載訓練樣本數據集

X_test,Y_test=mnist.get_test_data_set(1000,False)#加載測試樣本數據集

X_train=np.array(X_train).astype(bool).astype(float)/255#?????????????????????
print("X_train_F:",X_train)
X_train=X_train[:,:,:,np.newaxis]#添加新維度
print("X_train_B:",X_train)
Y_train=np.array(Y_train)
X_test=np.array(X_test).astype(bool).astype(float)/255#?????????????????????
X_test=X_test[:,:,:,np.newaxis]#添加新維度轉換成[[[[0.],[0.],[],......]]]

Y_test=np.array(Y_test)
print("樣本數據集維度:",X_train.shape,Y_train.shape)#由外到內,包含元素
print("測試數據集維度:",X_test.shape,Y_test.shape)
#
# 構建模型
#
model=Sequential()#順序模型
model.add(Conv2D(6,kernel_size,input_shape=input_shape,strides=1))#卷積層,步進1

model.add(AveragePooling2D(pool_size=pool_size,strides=2))#池化層
#再次卷積不需要輸入圖像
model.add(Conv2D(12,kernel_size,strides=1))
model.add(AveragePooling2D(pool_size=pool_size,strides=2))

model.add(Flatten())#一維數據
model.add(Dense(nb_class))#全連接
model.add(Activation("sigmoid"))#激活函數

#編譯模型
#loss交叉熵,優化器,評估
model.compile(loss="categorical_crossentropy",optimizer="adadelta",
              metrics=["accuracy"])
print("X_test:",X_test.shape)
print("Y_test:",Y_test.shape)
#訓練模型
model.fit(X_train,Y_train,batch_size=batch_size,epochs=epochs,verbose=1,
          validation_data=(X_test,Y_test))
#評估模型
score=model.evaluate(X_test,Y_test,verbose=0)
print("Test score:",score[0])
print("Test accuracy:",score[1])

#保存模型
model.save("cnn_model.h5")#保存模型,HDF5文件

測試生成的模型

from keras.models import load_model
import  numpy  as np
import cv2
model=load_model("cnn_model.h5")
image=cv2.imread("test.png")
img=cv2.imread("test.png",0)
img=np.reshape(img,(1,28,28,1)).astype(bool).astype("float32")/255
my_proba=model.predict_proba(img)#輸出序列概率
my_predict=model.predict_classes(img)#輸出類別
print("圖片數字爲:")
print(my_proba)
print(my_predict)
cv2.imshow("image",image)#opencv 顯示圖片
cv2.waitKey(0)

 

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