BP神经网络的手写体识别 Python3
文章目录
- 1 BP公式的推导
- 1.1 激活函数
- 1.1.1 `Sigmod`函数导数
- 1.2 损失函数
- 1.3 前向传播
- 1.3 计算误差反向传播
- 1.3.1 误差为方差时,输出层误差的计算
- 1.3.2 误差为方差时,隐层层误差的计算
- 1.4 调整参数
- 2 神经网络设计
- 3 使用OpenCV 分割图片
- 3.1 整张图片资源
- 3.2 Mnist数据集
- 4 进行训练
- 4.1 读取图片数据,并归一化
- 5.2 对神经网络进行训练,训练好的参数放入Excel文件中
- 6 进行预测
- 6.1 存取excel工具
- 6.2 读取参数后进行预测
- 6.3 误差
- 6.4 预测结果
1 BP公式的推导
- 神经网络的模型
1.1 激活函数
1.1.1 Sigmod
函数导数
- 注意:Sigmod函数与矩阵相乘的时候是对应位置相乘,对应于
numpy.mutiply()
1.2 损失函数
1.3 前向传播
- N为神经网络的输出
1.3 计算误差反向传播
- 矩阵求导时,系数矩阵为导数时,要对其进行求逆
1.3.1 误差为方差时,输出层误差的计算
1.3.2 误差为方差时,隐层层误差的计算
1.4 调整参数
- 其中误差的计算,E对输出Z的偏导即为误差
2 神经网络设计
- 根据BP公式设计神经网络
import numpy as npclass neuron():def __init__(self, input_len, output_len, is_output_layer, learning_rate): # 构造函数,随机生成网络中的权值与偏置self.RANDOM_INT = 10self.is_output_layer = is_output_layerself.w = np.random.randint(-self.RANDOM_INT, self.RANDOM_INT, (input_len, output_len)).astype(np.float64) / 10self.b = np.random.randint(-self.RANDOM_INT, self.RANDOM_INT, (1, output_len)).astype(np.float64) / 10self.output = 0self.error = 0self.learning_rate = learning_rateself.input_data = 0def active_function(self, input_z):return 1 / (1 + np.exp(-input_z))def forward_propagation(self, input_data):self.input_data = input_dataself.output = self.active_function(np.dot(self.input_data, self.w).astype(np.float64) - self.b)return self.outputdef get_output(self, input_data):return self.active_function(np.dot(input_data, self.w).astype(np.float64) - self.b)passdef back_propagation(self, error, next_w):if self.is_output_layer:# 是输出层, sigmod函数与矩阵点成, 采用方差形式的误差self.error = np.multiply((error - self.output), np.multiply(self.output, 1 - self.output))return self.errorelse:# 该层不是输出层,则从下一层的误差中,计算本层的误差self.error = np.multiply(np.multiply(self.output, 1 - self.output), np.dot(error, np.transpose(next_w)))return self.errorpassdef adjust_param(self, error):delta_w = np.dot(np.transpose(self.input_data), error)delta_b = errorself.w = self.w + self.learning_rate * delta_wself.b = self.b - self.learning_rate * delta_bpass
3 使用OpenCV 分割图片
3.1 整张图片资源
- 对图片进行分割
import cv2
import osdef cut_image(src_image, dst_src, row_size, col_size):img_1 = cv2.imread(src_image)img = cv2.cvtColor(img_1, cv2.COLOR_BGR2GRAY)row_num = img.shape[0] // row_sizecol_num = img.shape[1] // col_sizeprint(row_num, col_num)# 保存到不同的文件夹file_name = 0file_count = 0for i in range(row_num):offset_row = i * row_sizeif i % 5 == 0 and i != 0:file_name += 1file_count = 0path = dst_src + "\\" + str(file_name)if not os.path.exists(path):os.makedirs(path)for j in range(col_num):offset_col = j * col_sizefilepath = path + "\\" + str(file_count) + ".jpg"file_count += 1im = img[offset_row:offset_row + row_size - 1, offset_col:offset_col + col_size - 1]'''function: cv2.imwrite('F:/images',image,[int(cv2.IMWRITE_JPEG_QUALITY),5])- 三个参数分别对应保存的路径及文件名、图像矩阵、指定格式- (对于JPEG,其表示的是图像的质量,用0-100的整数表示,默认为95。 - 注意,cv2.IMWRITE_JPEG_QUALITY类型为Long,必须转换成int;对于PNG,第三个参数表示的是压缩级别。- cv2.IMWRITE_PNG_COMPRESSION,- 从0到9,压缩级别越高,图像尺寸越小。这个是可选参数)'''cv2.imwrite(filepath, im, [int(cv2.IMWRITE_JPEG_QUALITY), 95])if __name__ == '__main__':cut_image("test.png", "images_data", 20, 20) # 块大小为20 * images_test2pass
3.2 Mnist数据集
- Mnist图片数据集
import cv2
import osdef cut_image(image_src, row_size, column_size, output_src):image = cv2.imread(image_src)image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) # 转化为2值灰度图像row_num = image.shape[0] // row_size # 图像的行数 = 图像行像素 / 子图行像素col_num = image.shape[1] // column_size # 图像的列数 = 图像列像素 / 子图列像素print("图像的行数为: ", row_num, "图像的列数为: ", col_num)file_num = 0for i in range(row_num):offset_row = i * row_size # 图像的宽度path = output_srcif not os.path.exists(path):os.makedirs(path)for j in range(col_num):offset_col = j * column_sizefile_path = path + "\\" + str(file_num) + ".jpg"file_num += 1'''按照像素的位置取出图像'''im = image[offset_row: offset_row + row_size - 1, offset_col: offset_col + column_size - 1]# 转化为灰度值, 进行保存'''function: cv2.imwrite(F:/images',image,[int(cv2.IMWRITE_JPEG_QUALITY),5])- 三个参数分别对应保存的路径及文件名、图像矩阵、指定格式- (对于JPEG,其表示的是图像的质量,用0-100的整数表示,默认为95。 - 注意,cv2.IMWRITE_JPEG_QUALITY类型为Long,必须转换成int;对于PNG,第三个参数表示的是压缩级别。- cv2.IMWRITE_PNG_COMPRESSION,- 从0到9,压缩级别越高,图像尺寸越小。这个是可选参数)'''cv2.imwrite(file_path, im, [int(cv2.IMWRITE_JPEG_QUALITY), 95]) #if __name__ == '__main__':cut_image("mnist_test0.jpg", 28, 28, "images/images_test0")cut_image("mnist_test1.jpg", 28, 28, "images/images_test1")cut_image("mnist_test2.jpg", 28, 28, "images/images_test2")cut_image("mnist_test3.jpg", 28, 28, "images/images_test3")cut_image("mnist_test4.jpg", 28, 28, "images/images_test4")cut_image("mnist_test5.jpg", 28, 28, "images/images_test5")cut_image("mnist_test6.jpg", 28, 28, "images/images_test6")cut_image("mnist_test7.jpg", 28, 28, "images/images_test7")cut_image("mnist_test8.jpg", 28, 28, "images/images_test8")cut_image("mnist_test9.jpg", 28, 28, "images/images_test9")
4 进行训练
4.1 读取图片数据,并归一化
- 训练采用灰度图片,读取图片的数据,转化为灰度数据,放入到神经网络中
- 根据图片所在文件夹的顺序,对图片添加分类
def select_label(count):label = []for i in range(10):if i == count:label.append(1)else:label.append(0)return labelpass
- 返回一维的图像灰度矩阵与标签矩阵
import cv2def select_label(count):label = []for i in range(10):if i == count:label.append(1)else:label.append(0)return labelpassdef get_array_image(file, count, num):url = file + "/images_train" + str(count) + "/" + str(num) + ".jpg"# print("url: ", url)# images_test1. 读入图片数据src_image = cv2.imread(url)new_image = cv2.resize(src_image, (30, 30)) # 缺省,双线性插值# 3. 转化为灰度图gray_image = cv2.cvtColor(new_image, cv2.COLOR_BGR2GRAY)data_list = []for i in range(len(gray_image)):data_list.extend(gray_image[i] / 255)label_list = select_label(count)return data_list, label_listpassdef get_data_label(file_name, file_num, num_start, num_end):data_set = []label_set = []# 读取多个文件夹for i in range(file_num):for j in range(num_start, num_end):data_row, label_row = get_array_image(file_name, i, j)data_set.append(data_row)label_set.append(label_row)return data_set, label_setpassif __name__ == '__main__':# data, la = get_data_label("train_images", 10, images_test0, 10)data_row, label_row = get_array_image("train_set_images_cut/train_images/images", 0, 0)print(data_row)# print(data)pass
5.2 对神经网络进行训练,训练好的参数放入Excel文件中
import numpy as np
from neuron import neuron
import data_util
import excel_util
import data_util2# 激活函数
def sigmoid(value):return 1 / (1 + np.exp(-value))passdef get_e(data_test, label, neurons):data_set_len = len(data_test)tmp = 0for i in range(data_set_len):# images_test1. 前向传播的输出output = np.mat(data_test[i]).astype(np.float64)for neuron_item in neurons:output = neuron_item.get_output(output)# images_test2. 计算误差tmp += np.multiply((output - label[i]), (output - label[i]).T) # .T 为matrix的转置return tmp / data_set_lenpass# 进行预测
def predict_test(data_test, label_test, neurons):right_cnt = 0# 测试的个数test_set_len = len(data_test)# 对数据集的每一个输入进行测试for i in range(test_set_len):# # 传播output = np.mat(data_test[i]).astype(np.float64)for neuron_item in neurons:output = neuron_item.get_output(output)predict_class = 1000for row in range(output.shape[0]):for col in range(output.shape[1]):if output[row, col] >= 0.5:predict_class = colbreaklabel_class = 1000for index in range(len(label_test[i])):if label_test[i][index] == 1:label_class = indexbreakprint("第", i + 1, "次预测:predict: ", output, ", \n真实: ", label_test[i])print("第", i + 1, "次预测:predict: ", predict_class, ", \n真实: ", label_class)if predict_class == label_class != 1000:right_cnt += 1return right_cnt / test_set_lendef plot_e(a_list):import matplotlib.pyplot as pltx = np.arange(1, len(a_list) + 1)y = np.array(a_list) # 转化为向量print("最后误差:", y[-1])# 绘制plt.plot(x, y)plt.xlabel("practiseTime")plt.ylabel("variance")plt.show()passdef main():# 设置训练图片的范围file_num = 10train_num_start = 0train_num_end = 300data_set, label_set = data_util2.get_data_label("train_set_images_cut/train_images/images", file_num, train_num_start, train_num_end)# images_test1. 设置神经网络的参数input_len = len(data_set[0])hidden_one_len = 50output_len = len(label_set[0])# 构建三层神经网络hidden_one_layer = neuron(input_len, hidden_one_len, False, 0.01)output_layer = neuron(hidden_one_len, output_len, True, 0.01)# 进行一定次数的训练a_list = []for num in range(150):for j in range(len(data_set)):# 进行训练# images_test1. 前向传播hidden_one_output = hidden_one_layer.forward_propagation(np.mat(data_set[j]).astype(np.float64))output_one_later = output_layer.forward_propagation(hidden_one_output)# images_test2. 计算误差error_2 = output_layer.back_propagation(label_set[j], 1)error_1 = hidden_one_layer.back_propagation(error_2, output_layer.w)# 3. 反向传播output_layer.adjust_param(error_2)hidden_one_layer.adjust_param(error_1)# 计算方差误差,为数组中绝对值的和e = get_e(data_set, label_set, [hidden_one_layer, output_layer])e_value = 0for row in range(len(e)):for col in range(len(e[0])):e_value = e_value + e[row, col]a_list.append(abs(e_value))# 保存数据到txt文件excel_util.save_matrix2excel(hidden_one_layer.w, "excel_param/hidden_one_layer_w1.xlsx")excel_util.save_matrix2excel(hidden_one_layer.b, "excel_param/hidden_one_layer_b1.xlsx")excel_util.save_matrix2excel(output_layer.w, "excel_param/output_layer_w1.xlsx")excel_util.save_matrix2excel(output_layer.b, "excel_param/output_layer_b1.xlsx")# 绘制方差的图像plot_e(a_list)# 设置测试图片的范围test_num_start = 100test_num_end = 120data_set_test, label_set_test = data_util2.get_data_label("train_set_images_cut/train_images/images", file_num, test_num_start, test_num_end)rate = predict_test(data_set_test, label_set_test, [hidden_one_layer, output_layer])print("预测的正确率为: ", rate * 100, "%")passif __name__ == '__main__':main()
6 进行预测
- 读取Excel文件中网络的参数进行预测
6.1 存取excel工具
import pandas as pd
import numpy as npdef save_matrix2excel(mat, dst_path):data = pd.DataFrame(mat)data.to_excel(dst_path)passdef read_excel2matrix(url):sheet = pd.read_excel(url)return np.mat(sheet)[:, 1:] # 去掉第一列,为次序列passif __name__ == '__main__':# matrix = np.mat([[images_test1, images_test2], [3, 4]])# save_matrix2excel(matrix, "test.xlsx")data = read_excel2matrix("test.xlsx")print(data)pass
6.2 读取参数后进行预测
- 自定义文件结构
- 工具类
import cv2def select_label(count):label = []for i in range(10):if i == count:label.append(1)else:label.append(0)return labelpassdef get_array_image(file, count, num, row_size, col_size):url = file + "/images_test" + str(count) + "/" + str(num) + ".jpg"# print("url: ", url)src_image = cv2.imread(url)new_image = cv2.resize(src_image, (row_size, col_size)) # 缺省,双线性插值# 3. 转化为灰度图gray_image = cv2.cvtColor(new_image, cv2.COLOR_BGR2GRAY)data_list = []for i in range(len(gray_image)):data_list.extend(gray_image[i])label_list = select_label(count)return data_list, label_listpassdef get_data_label(file_name, file_num, num_start, num_end, row_size, col_size):data_set = []label_set = []# 读取多个文件夹for i in range(file_num):for j in range(num_start, num_end):data_row, label_row = get_array_image(file_name, i, j, row_size, col_size)data_set.append(data_row)label_set.append(label_row)return data_set, label_setpassif __name__ == '__main__':data_row, label_row = get_array_image("images", 0, 0)print(data_row)pass
- 测试函数
from neuron import neuron
import numpy as np
import excel_util
import data_util# 进行预测
def predict_test(data_test, label_test, neurons):right_cnt = 0# 测试的个数test_set_len = len(data_test)# 对数据集的每一个输入进行测试for i in range(test_set_len):# # 传播output = np.mat(data_test[i]).astype(np.float64)for neuron_item in neurons:output = neuron_item.get_output(output)predict_class = 1000for row in range(output.shape[0]):for col in range(output.shape[1]):if output[row, col] >= 0.5:predict_class = colbreaklabel_class = 1000for index in range(len(label_test[i])):if label_test[i][index] == 1:label_class = indexbreakprint("第", i + 1, "次预测:predict: ", output, ", \n真实: ", label_test[i])print("第", i + 1, "次预测:predict: ", predict_class, ", \n真实: ", label_class)if predict_class == label_class != 1000:right_cnt += 1return right_cnt / test_set_lendef main():# 读取excel中的数据hidden_one_layer_w = excel_util.read_excel2matrix("excel_param/hidden_one_layer_w.xlsx")hidden_one_layer_b = excel_util.read_excel2matrix("excel_param/hidden_one_layer_b.xlsx")output_layer_w = excel_util.read_excel2matrix("excel_param/output_layer_w.xlsx")output_layer_b = excel_util.read_excel2matrix("excel_param/output_layer_b.xlsx")# 输出矩阵的维数print(hidden_one_layer_w.shape)print(hidden_one_layer_b.shape)print(output_layer_w.shape)print(output_layer_b.shape)# 定义网络参数hidden_one_layer = neuron(hidden_one_layer_w.shape[0], hidden_one_layer_w.shape[1], False, 0.01)output_layer = neuron(hidden_one_layer_w.shape[1], output_layer_w.shape[1], True, 0.01)hidden_one_layer.w = hidden_one_layer_whidden_one_layer.b = hidden_one_layer_boutput_layer.w = output_layer_woutput_layer.b = output_layer_b# 设置测试图片的范围file_num = 10test_num_start = 0test_num_end = 200data_set_test, label_set_test = data_util.get_data_label("predict_images", file_num, test_num_start, test_num_end, 30, 30)rate = predict_test(data_set_test, label_set_test, [hidden_one_layer, output_layer])print("预测的正确率为: ", rate * 100, "%")passif __name__ == '__main__':main()pass
6.3 误差
6.4 预测结果
BP神经网络的手写体识别 Python3相关推荐
- 基于BP神经网络进行手写体识别(Matlab代码实现)
目录
- 并行化实现基于BP神经网络的手写体数字识别
并行化实现基于BP神经网络的手写体数字识别 手写体数字识别可以堪称是神经网络学习的"Hello World" ,我今天要说的是如何实现BP神经网络算法的并行化,我们仍然是以手写体数 ...
- 基于三层BP神经网络的人脸识别
实验四.基于三层BP神经网络的人脸识别 一. 实验要求 采用三层前馈BP神经网络实现标准人脸YALE数据库的识别,编程语言为C系列语言. 二.BP神经网络的结构和学习算法 实验中建议采用如下最简单的三 ...
- bp神经网络实现人脸识别,车牌识别深度神经网络
1.您好,请问您有基于BP神经网络算法的车牌识别的程序代码吗?用matlab可以运行的那种. 1.对样本集进行归一化 2.创建BP神经网络 3.设置网络的训练参数 4.把样本输入BP网络进行训练 5. ...
- 【交通标志识别】BP神经网络交通标志识别【含GUI Matlab源码 718期】
⛄一.BP神经网络交通标志识别简介 道路交通标志用以禁止.警告.指示和限制道路使用者有秩序地使用道路, 保障出行安全.若能自动识别道路交通标志, 则将极大减少道路交通事故的发生.但是由于道路交通错综复 ...
- 【毕业设计/Matlab系列】基于PCA和BP神经网络的人脸识别系统(附matlab代码)
Date: 2022.4.26 文章目录 前言 1.总体介绍 2.详细分析 2.1.训练程序 2.2.测试程序 3.测试效果图 4.测试部分matlab代码 前言 在毕业设计中实现了基于PCA和BP神 ...
- 【毕业设计/Matlab系列】基于PCA和BP神经网络的人脸识别系统(基于AR人脸库)
Date: 2022.5.30 文章目录 前言 1.算法原理 2.实现效果 3.测试matlab代码 前言 在大学毕业设计的时候,在毕业设计中实现了基于PCA和BP神经网络的人脸识别系统,采用matl ...
- 【交通标志识别】基于matlab GUI BP神经网络交通标志识别系统(含语音报警)【含Matlab源码 2240期】
⛄一.BP神经网络交通标志识别简介 道路交通标志用以禁止.警告.指示和限制道路使用者有秩序地使用道路, 保障出行安全.若能自动识别道路交通标志, 则将极大减少道路交通事故的发生.但是由于道路交通错综复 ...
- 【情感识别】基于matlab BP神经网络语音情感识别【含Matlab源码 349期】
一.BP神经网络语音情感识别简介 0 引言 随着科技的迅速发展, 人机交互显得尤为重要.语音是语言的载体, 是人与人之间交流的重要媒介.相较于其它交流方式而言, 语音交流更加直接.便捷.近年来, 随着 ...
最新文章
- jQuery表单校验jquery.validate.js的使用
- 前端学习(1659):前端系列实战课程之瀑布流实现思路
- 前端学习(1164):剩余参数02
- BlackBerry 应用程序开发者指南 第二卷:高级--第11章 管理通知(Notification)
- 【API进阶之路】无法想象!大龄码农的硬盘里有这么多宝藏
- remobject 簡介
- python生成词云_词云制作没那么难,Python 10 行代码就实现了!
- 英文的写作 —— 句子的积累
- 服务器硬盘容量为0,硬盘容量不一样 raid0 扩容也可以很自如?
- Structure-Revealing Low-Light Image Enhancement Via Robust Retinex Model TIP 2018阅读记录
- 有没有发现不会写简历,感觉什么都不会?其实写简历也是一种艺术。
- minimax算法及α-β剪枝算法
- ABAP 类方法获取长文本内容
- JVM (JAVA虚拟机)
- 那些年,我们一起写过的“单例模式”
- Python实现寻找完美数问题
- iPhone网页显示不全(被遮挡)怎么办?
- 关于今天的劳动仲裁说明
- Solved Visual studio Code make sure you configure your user.name and user.email in git
- RFID标签基本常识
热门文章
- 有界深度优先搜索算法解决八数码问题
- 自建虚拟机,ens33修改静态IP地址脚本
- 使用腾讯地图驾车规划路线
- [js进阶]原生js实现addClass,removeClass,hasClass方法
- Excel 交互式动态图表
- Verilog中的signed运算
- 阿里云ack如何查看绑定的nas存储
- java string 空间_Java中,String str = “Runoob”;这个语句中str和“Runoob”都占空间吗?分别占多大?...
- linux虚拟主机建站程序,bluehost中国Linux虚拟主机建站过程
- python中的goto语句_python开发中goto语句的使用