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()```