#訓練神經網絡
#給出一張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)