深度学习笔记二: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入门实例