mnist数据集训练与模型加载

神经网络学习记录

	这两天开始学习神经网络,使用的是keras网络库,后端是tensorflow。已
经踩了一点坑,希望在这里记录下我的学习过程以及我的一些感想,如果出错
的地方,望大家指正。
	我的神经网络学习以手写体识别开始。采用mnist数据集,用自己拍的图片,
9个数错3个,下面贴上我的训练代码:
#coding=utf-8
#训练结构有待改善
# 加载库
import numpy as np
np.random.seed(123)  # for reproducibility

from keras.models import Sequential
from keras.layers import Dense, Dropout, Activation, Flatten
from keras.layers import Conv2D, MaxPool2D, MaxPooling2D
from keras.utils import np_utils
from keras.datasets import mnist

# 加载数据集
(X_train, y_train), (X_test, y_test) = mnist.load_data()

# 调整数据格式
X_train = X_train.reshape(X_train.shape[0], 28, 28, 1)
X_test = X_test.reshape(X_test.shape[0], 28, 28, 1)
X_train = X_train.astype('float32')
X_test = X_test.astype('float32')
X_train /= 255
X_test /= 255

# 生成类别矩阵(独热编码格式)
Y_train = np_utils.to_categorical(y_train, 10)
Y_test = np_utils.to_categorical(y_test, 10)

# 搭建训练结构
model = Sequential()

model.add(Conv2D(32, (3, 3), activation='relu', input_shape = (28, 28, 1)))
model.add(Conv2D(32, (3, 3), activation='relu'))
#model.add(MaxPool2D(pool_size=(2, 2)))
model.add(MaxPooling2D((2, 2)))
model.add(Dropout(0.25)) #防止过拟合

model.add(Flatten())
model.add(Dense(128, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(10, activation='softmax'))

# 预编译,为了能够tensorflow中运行
model.compile(loss='categorical_crossentropy',
              optimizer='adam',
              metrics=['accuracy'])

# 开始训练
model.fit(X_train, Y_train, batch_size=64, epochs=10, verbose=1)
# 计算准确率
score = model.evaluate(X_test, Y_test, verbose=0)
model_digit_json = model.to_json()
with open("model_digit.json", "w") as json_file:
    json_file.write(model_digit_json)
#在加载模型时,报错Cannot create group in read only ,就用save函数(非常重要)
#model.save_weights("model_digit.h5")
model.save("11_14_Model.h5")
print("Saved model to disk")
	上面的训练代码也是我参考别网上的,本文后面的加载模型代码是直接用的
load函数,所以在训练时需要用model.save函数,如果用
model.save_weights函数,		在加载训练好的模型时会报错
“Cannot create group in read only”,model.save_weights函数保存
的模型,需要在加载模型时有一些其他的操作,这里我就先不阐述了,因为我也还
没怎么懂。本文代码训练时间20分钟左右,如果想训练快一点则提高batch_size
的值(64的倍数,例如提高到128),或降低epochs(例如:5),batch_size:
步长,epochs:迭代次数。
下面贴上加载模型的代码:	
#coding=utf-8
import cv2
import numpy as np
from keras.models import load_model
#加载自己训练出的模型
model = load_model('11_14_Model.h5')  #选取自己的.h模型名称
def Predict_Test0(path):
	image = cv2.imread(path)
	img = cv2.cvtColor(image,cv2.COLOR_RGB2GRAY) # RGB图像转为gray
	ret, img_binary =  cv2.threshold(img, 159, 255, cv2.THRESH_BINARY)#二值化
	cv2.bitwise_not(img_binary, img_binary)#变成黑底(黑底识别率高)
	img_resize = cv2.resize(img_binary,(28, 28))#改尺寸
	img = (img_resize.reshape(1, 28, 28, 1)).astype('float32')/255 #改维数
	predict = model.predict_classes(img)
	print ('识别为:')
	print (predict)
	#cv2.imshow("Image1", img_resize)
#调用函数	
Predict_Test0("1_0.jpg")
Predict_Test0("2_0.jpg")
Predict_Test0("3_0.jpg")
Predict_Test0("4_0.jpg")
Predict_Test0("5_0.jpg")
Predict_Test0("6_0.jpg")
Predict_Test0("7_0.jpg")
Predict_Test0("8_0.jpg")
Predict_Test0("9_0.jpg")
cv2.waitKey(0)

下面贴上识别效果,自上而下 正确排序是1-9:

下面贴上我自己拍的测试图(大小不一没关系,代码会统一转成28*28):
在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述
在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值