欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

深度学习笔记二:keras+cnn+mnist cnn模型的创建、保存、调用

程序员文章站 2022-07-13 13:10:48
...

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

上一篇: JavaScript

下一篇: tensorflow入门实例