神经网络学习记录
这两天开始学习神经网络,使用的是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):