文章目录

  • 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.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相关推荐

  1. 基于BP神经网络进行手写体识别(Matlab代码实现)

    目录

  2. 并行化实现基于BP神经网络的手写体数字识别

    并行化实现基于BP神经网络的手写体数字识别 手写体数字识别可以堪称是神经网络学习的"Hello World" ,我今天要说的是如何实现BP神经网络算法的并行化,我们仍然是以手写体数 ...

  3. 基于三层BP神经网络的人脸识别

    实验四.基于三层BP神经网络的人脸识别 一. 实验要求 采用三层前馈BP神经网络实现标准人脸YALE数据库的识别,编程语言为C系列语言. 二.BP神经网络的结构和学习算法 实验中建议采用如下最简单的三 ...

  4. bp神经网络实现人脸识别,车牌识别深度神经网络

    1.您好,请问您有基于BP神经网络算法的车牌识别的程序代码吗?用matlab可以运行的那种. 1.对样本集进行归一化 2.创建BP神经网络 3.设置网络的训练参数 4.把样本输入BP网络进行训练 5. ...

  5. 【交通标志识别】BP神经网络交通标志识别【含GUI Matlab源码 718期】

    ⛄一.BP神经网络交通标志识别简介 道路交通标志用以禁止.警告.指示和限制道路使用者有秩序地使用道路, 保障出行安全.若能自动识别道路交通标志, 则将极大减少道路交通事故的发生.但是由于道路交通错综复 ...

  6. 【毕业设计/Matlab系列】基于PCA和BP神经网络的人脸识别系统(附matlab代码)

    Date: 2022.4.26 文章目录 前言 1.总体介绍 2.详细分析 2.1.训练程序 2.2.测试程序 3.测试效果图 4.测试部分matlab代码 前言 在毕业设计中实现了基于PCA和BP神 ...

  7. 【毕业设计/Matlab系列】基于PCA和BP神经网络的人脸识别系统(基于AR人脸库)

    Date: 2022.5.30 文章目录 前言 1.算法原理 2.实现效果 3.测试matlab代码 前言 在大学毕业设计的时候,在毕业设计中实现了基于PCA和BP神经网络的人脸识别系统,采用matl ...

  8. 【交通标志识别】基于matlab GUI BP神经网络交通标志识别系统(含语音报警)【含Matlab源码 2240期】

    ⛄一.BP神经网络交通标志识别简介 道路交通标志用以禁止.警告.指示和限制道路使用者有秩序地使用道路, 保障出行安全.若能自动识别道路交通标志, 则将极大减少道路交通事故的发生.但是由于道路交通错综复 ...

  9. 【情感识别】基于matlab BP神经网络语音情感识别【含Matlab源码 349期】

    一.BP神经网络语音情感识别简介 0 引言 随着科技的迅速发展, 人机交互显得尤为重要.语音是语言的载体, 是人与人之间交流的重要媒介.相较于其它交流方式而言, 语音交流更加直接.便捷.近年来, 随着 ...

最新文章

  1. jQuery表单校验jquery.validate.js的使用
  2. 前端学习(1659):前端系列实战课程之瀑布流实现思路
  3. 前端学习(1164):剩余参数02
  4. BlackBerry 应用程序开发者指南 第二卷:高级--第11章 管理通知(Notification)
  5. 【API进阶之路】无法想象!大龄码农的硬盘里有这么多宝藏
  6. remobject 簡介
  7. python生成词云_词云制作没那么难,Python 10 行代码就实现了!
  8. 英文的写作 —— 句子的积累
  9. 服务器硬盘容量为0,硬盘容量不一样 raid0 扩容也可以很自如?
  10. Structure-Revealing Low-Light Image Enhancement Via Robust Retinex Model TIP 2018阅读记录
  11. 有没有发现不会写简历,感觉什么都不会?其实写简历也是一种艺术。
  12. minimax算法及α-β剪枝算法
  13. ABAP 类方法获取长文本内容
  14. JVM (JAVA虚拟机)
  15. 那些年,我们一起写过的“单例模式”
  16. Python实现寻找完美数问题
  17. iPhone网页显示不全(被遮挡)怎么办?
  18. 关于今天的劳动仲裁说明
  19. Solved Visual studio Code make sure you configure your user.name and user.email in git
  20. RFID标签基本常识

热门文章

  1. 有界深度优先搜索算法解决八数码问题
  2. 自建虚拟机,ens33修改静态IP地址脚本
  3. 使用腾讯地图驾车规划路线
  4. [js进阶]原生js实现addClass,removeClass,hasClass方法
  5. Excel 交互式动态图表
  6. Verilog中的signed运算
  7. 阿里云ack如何查看绑定的nas存储
  8. java string 空间_Java中,String str = “Runoob”;这个语句中str和“Runoob”都占空间吗?分别占多大?...
  9. linux虚拟主机建站程序,bluehost中国Linux虚拟主机建站过程
  10. python中的goto语句_python开发中goto语句的使用