深度学习实战笔记二: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()```

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