深度學習實戰筆記二:keras+cnn+mnist cnn模型的創建、保存、調用

google colab的使用、文件路徑設置參見上一篇博客:深度學習筆記一:google colab使用入門+mnist數據集入門+Dense層預測

本節筆記參考了Mike高的視頻

一個完整的cnn模型

#CNN mnist
import numpy as np
from keras.datasets import mnist
from keras.utils import np_utils
from keras.models import Sequential
from keras.layers import Convolution2D,Activation,MaxPool2D,Flatten,Dense
from keras.optimizers import Adam

np_class = 10

nb_epoch = 10
batchsize = 1024
#準備數據 mnist
(X_train,Y_train),(X_test,Y_test) = mnist.load_data()
print(X_train.shape)

#對數據格式進行整理
#setup data shape
#tensorflow channel last  (1,28,28)
#-1表示不知道有多少個樣本,可以寫成60000
X_train = X_train.reshape(-1,28,28,1)
X_test = X_test.reshape(-1,28,28,1)

#歸一化處理
X_train = X_train.astype('float32')
X_test = X_test.astype('float32')

X_train = X_train/255.0
X_test = X_test/255.0

#對數據進行歸類,即把label轉換成one-hot形式
Y_train = np_utils.to_categorical(Y_train,np_class)
Y_test = np_utils.to_categorical(Y_test,np_class)

model = Sequential()

#set convo layer
model.add(Convolution2D(
    filters = 32,#一張圖片有32個過濾器,走32次
    kernel_size=[5,5],#過濾器的尺寸
    #抓取圖片的特徵
    padding = 'same',
    #填充方法,總共28個像素,25後面只有3個,padding設定一種方式來填充
    #此處是sanme,則填充的元素和第25個元素相同
    input_shape = (28,28,1) #輸入規格
))
model.add(Activation('relu'))
model.add(MaxPool2D(
    pool_size=(2,2),#抓取一個2*2的區域
    strides=(2,2),#每隔多少抓取一個數據 ""跳兩格抓一個數據"
    padding  = 'same'
    #以上三個方式的結合,使得網絡可以沒跳兩格抓取一個2*2區域的圖像
))

#2nd Conv2D layer
model.add(Convolution2D(
    filters = 64,
    kernel_size = (5,5),
    padding='same',
))

model.add(Activation('relu'))
model.add(MaxPool2D(
    pool_size = (2,2),
    strides = (2,2),
    padding ="same",
))

#1st fully connected Dense
#Flatten將所有數據連接成一維向量
model.add(Flatten())
#設置輸出的維度爲1024
model.add(Dense(1024))
model.add(Activation('relu'))


#2nd Fully connected Dense
model.add(Dense(10))
model.add(Activation('softmax'))

#Define Optimizer

#lr越小,訓練速度越慢,但是比較大的話容易過擬合
adam = Adam(lr = 1e-4)#0.0001

#編譯
model.compile(
    optimizer = adam,#optimizer adam有默認的參數0.001
    loss='categorical_crossentropy',
    metrics = ['accuracy'],

)

#Run Network
model.fit(
    X_train,#對應原始數據
    Y_train,#對應標籤
    epochs = nb_epoch,
    batch_size = batchsize,
    verbose = 1,
    validation_data = (X_test,Y_test), 
    #每訓練一個epoch,就驗證一次
) 
#訓練結束後進行驗證
#model.evaluation(X_test,Y_test)
#print(evalution)
#print(validation_data)

model.save('/content/drive/My Drive/app/model_bane.h5')





加載模型進行預測

在這裏插入代碼片#加載保存好的模型來進行預測
#predict 
import numpy as np
from keras.models import load_model
import matplotlib.pyplot as plt
import matplotlib.image as processimage #處理圖片

#加載模型
model = load_model('/content/drive/My Drive/app/model_bane.h5')
class MainPredictImage(object):
  def __init__(object):
    pass

  def pred(self,filename):
    pred_img = processimage.imread(filename) #讀取數據
    pred_img = np.array(pred_img) #圖片把數據轉換成數組
    pred_img = pred_img.reshape(-1,28,28,1)# reshape
    pred_img = pred_img/255.0 
    prediction = model.predict(pred_img)#調用model的預測函數來預測數字
   
    #prediction是一個10維的數組,數組元素是一個科學計數法形式的浮點數
    #得到了prediction後,需要處理一下使之變成人可以讀懂的內容
    
    #[result.argmax() for result in prediction]輸出所有最大值
    #(可能不止一個最大值,如[1,2,3,4,5,6,6,6,])的下標,取第一個就可以
    Final_prediction = [result.argmax() for result in prediction][0] 
    print(Final_prediction)
    #[result.argmax() for result in prediction] 是prediction裏面的最大值的下標
    
    # 將科學計數法的數據轉化成百分數,更利於閱讀
    #print(prediction[0])
    #print(prediction)
    a=0
    #分別打印每個數字對應的百分比
    for i in prediction[0]: #不能是prediction 因爲prediction是一個二維數組,只有一個元素,是一個一維數組
      print(a)
      #輸出小數點後面10位
      print('percent:{:.10%}'.format(i))
      a = a+1
      

    return Final_prediction
def main():
    predict = MainPredictImage()
    res = predict.pred('/content/drive/My Drive/app/my_image/test5.jpg')
    print("your number is:-->",res)
  
if __name__ == '__main__':
  main()```

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