首页 > 其他分享 >手写识别 b友

手写识别 b友

时间:2024-05-31 17:01:41浏览次数:19  
标签:self corrected test beta2 beta1 np 手写 识别

  1 import numpy as np
  2 import pandas as pd
  3 
  4 
  5 def load_csv(path):
  6     csv_df = pd.read_csv(path)
  7     labels = csv_df['label'].values
  8     images = csv_df.drop('label', axis=1).values / 255.0  # 归一化像素值
  9     v = int(labels.size * 0.8)
 10     train_images = images[:v]
 11     test_images = images[v:]
 12     #
 13     train_labels = labels[:v]
 14     t_s = train_labels.size
 15     train_zero = np.zeros((t_s, 10))
 16     train_zero[np.arange(t_s), train_labels] = 1
 17     test_labels = labels[v:]
 18     t_s = test_labels.size
 19     test_zero = np.zeros((t_s, 10))
 20     test_zero[np.arange(t_s), test_labels] = 1
 21 
 22     return train_images, train_zero, test_images, test_zero
 23 
 24 
 25 # 加载数据
 26 train_images, train_labels, test_images, test_labels = load_csv('train.csv')
 27 
 28 # import torch.nn as nn
 29 # nn.Sequential(nn.Linear(784, 256), nn.ReLU(), nn.Linear(256, 128), nn.ReLU(), nn.Linear(128, 10))
 30 class Model:
 31     def __init__(self, input_size, hidden1_size, hidden2_size, output_size):
 32         self.W1 = np.random.randn(input_size, hidden1_size) * 0.01
 33         self.b1 = np.zeros((1, hidden1_size))
 34         self.W2 = np.random.randn(hidden1_size, hidden2_size) * 0.01
 35         self.b2 = np.zeros((1, hidden2_size))
 36         self.W3 = np.random.randn(hidden2_size, output_size) * 0.01
 37         self.b3 = np.zeros((1, output_size))
 38 
 39         # adam
 40         self.mW1, self.mb1 = np.zeros_like(self.W1), np.zeros_like(self.b1)
 41         self.vW1, self.vb1 = np.zeros_like(self.W1), np.zeros_like(self.b1)
 42         self.mW2, self.mb2 = np.zeros_like(self.W2), np.zeros_like(self.b2)
 43         self.vW2, self.vb2 = np.zeros_like(self.W2), np.zeros_like(self.b2)
 44         self.mW3, self.mb3 = np.zeros_like(self.W3), np.zeros_like(self.b3)
 45         self.vW3, self.vb3 = np.zeros_like(self.W3), np.zeros_like(self.b3)
 46 
 47     def relu(self, z):
 48         return np.maximum(0, z)
 49 
 50     def relu_derivative(self, z):
 51         return np.where(z > 0, 1, 0)
 52 
 53     def softmax(self, z):
 54         exp_scores = np.exp(z - np.max(z, axis=1, keepdims=True))
 55         return exp_scores / np.sum(exp_scores, axis=1, keepdims=True)
 56 
 57     def forward(self, X):
 58         self.Z1 = np.dot(X, self.W1) + self.b1
 59         self.A1 = self.relu(self.Z1)
 60         self.Z2 = np.dot(self.A1, self.W2) + self.b2
 61         self.A2 = self.relu(self.Z2)
 62         self.Z3 = np.dot(self.A2, self.W3) + self.b3
 63         self.A3 = self.softmax(self.Z3)
 64         return self.A3
 65 
 66     def backward(self, X, y, output):
 67         m = y.shape[0]
 68         dZ3 = output - y
 69         dW3 = np.dot(self.A2.T, dZ3) / m
 70         db3 = np.sum(dZ3, axis=0, keepdims=True) / m
 71         dZ2 = np.dot(dZ3, self.W3.T) * self.relu_derivative(self.Z2)
 72         dW2 = np.dot(self.A1.T, dZ2) / m
 73         db2 = np.sum(dZ2, axis=0, keepdims=True) / m
 74         dZ1 = np.dot(dZ2, self.W2.T) * self.relu_derivative(self.Z1)
 75         dW1 = np.dot(X.T, dZ1) / m
 76         db1 = np.sum(dZ1, axis=0, keepdims=True) / m
 77 
 78         return dW1, db1, dW2, db2, dW3, db3
 79 
 80     def update_parameters_with_adam(self, grads, t, learning_rate, beta1, beta2, epsilon):
 81         dW1, db1, dW2, db2, dW3, db3 = grads
 82 
 83         # one
 84         self.mW1 = beta1 * self.mW1 + (1 - beta1) * dW1
 85         self.mb1 = beta1 * self.mb1 + (1 - beta1) * db1
 86         self.mW2 = beta1 * self.mW2 + (1 - beta1) * dW2
 87         self.mb2 = beta1 * self.mb2 + (1 - beta1) * db2
 88         self.mW3 = beta1 * self.mW3 + (1 - beta1) * dW3
 89         self.mb3 = beta1 * self.mb3 + (1 - beta1) * db3
 90 
 91         # two
 92         self.vW1 = beta2 * self.vW1 + (1 - beta2) * (dW1 ** 2)
 93         self.vb1 = beta2 * self.vb1 + (1 - beta2) * (db1 ** 2)
 94         self.vW2 = beta2 * self.vW2 + (1 - beta2) * (dW2 ** 2)
 95         self.vb2 = beta2 * self.vb2 + (1 - beta2) * (db2 ** 2)
 96         self.vW3 = beta2 * self.vW3 + (1 - beta2) * (dW3 ** 2)
 97         self.vb3 = beta2 * self.vb3 + (1 - beta2) * (db3 ** 2)
 98 
 99         # 2层
100         mW1_corrected = self.mW1 / (1 - beta1 ** t)
101         mb1_corrected = self.mb1 / (1 - beta1 ** t)
102         mW2_corrected = self.mW2 / (1 - beta1 ** t)
103         mb2_corrected = self.mb2 / (1 - beta1 ** t)
104         mW3_corrected = self.mW3 / (1 - beta1 ** t)
105         mb3_corrected = self.mb3 / (1 - beta1 ** t)
106 
107         vW1_corrected = self.vW1 / (1 - beta2 ** t)
108         vb1_corrected = self.vb1 / (1 - beta2 ** t)
109         vW2_corrected = self.vW2 / (1 - beta2 ** t)
110         vb2_corrected = self.vb2 / (1 - beta2 ** t)
111         vW3_corrected = self.vW3 / (1 - beta2 ** t)
112         vb3_corrected = self.vb3 / (1 - beta2 ** t)
113 
114         # update
115         self.W1 -= learning_rate * mW1_corrected / (np.sqrt(vW1_corrected) + epsilon)
116         self.b1 -= learning_rate * mb1_corrected / (np.sqrt(vb1_corrected) + epsilon)
117         self.W2 -= learning_rate * mW2_corrected / (np.sqrt(vW2_corrected) + epsilon)
118         self.b2 -= learning_rate * mb2_corrected / (np.sqrt(vb2_corrected) + epsilon)
119         self.W3 -= learning_rate * mW3_corrected / (np.sqrt(vW3_corrected) + epsilon)
120         self.b3 -= learning_rate * mb3_corrected / (np.sqrt(vb3_corrected) + epsilon)
121 
122     def train(self, epochs, learning_rate, beta1=0.9, beta2=0.999, epsilon=1e-8):
123         for epoch in range(epochs):
124             # train
125             output = self.forward(train_images)
126             grads = self.backward(train_images, train_labels, output)
127             self.update_parameters_with_adam(grads, epoch + 1, learning_rate, beta1, beta2, epsilon)
128             if (epoch + 1) % 10 == 0:
129                 loss = -np.sum(train_labels * np.log(output + 1e-8)) / train_labels.shape[0]  # 交叉熵损失
130                 predictions = np.argmax(output, axis=1)
131                 accuracy = np.mean(np.argmax(train_labels, axis=1) == predictions)
132                 print(f'train_epoch {epoch + 1}, loss: {loss:.4f}, acc: {accuracy:.4f}')
133                 # test
134                 output = self.predict(test_images)
135                 accuracy = np.mean(np.argmax(test_labels, axis=1) == output)
136                 #loss可写可不写
137                 # loss = -np.sum(test_labels * np.log(output + 1e-8)) / test_labels.shape[0]
138                 print(f'test_epoch {epoch + 1},  acc: {accuracy:.4f}')
139 
140 
141 
142 
143     def predict(self, X):
144         output = self.forward(X)
145         return np.argmax(output, axis=1)
146 
147 
148 nn = Model(28*28, 256, 128, 10) # cls
149 nn.train(30, 0.01)  # 0.001即可
150 
151 # 测试
152 test_images = test_images * 255
153 import cv2
154 while True:
155     # 测试
156     idx = np.random.randint(0, test_images.shape[0])
157     image = test_images[idx].reshape(28,28)
158     image = cv2.resize(image, (128, 128))
159     cv2.imshow('test', image)
160     print('当前识别数字为: ',nn.predict(test_images[idx]))
161     cv2.waitKey(0)
162 cv2.destroyAllWindows()
View Code

 30轮可还行 数据集 

链接:https://pan.baidu.com/s/1inAI-tVnCLETZ_18Y8QV0w?pwd=6666

标签:self,corrected,test,beta2,beta1,np,手写,识别
From: https://www.cnblogs.com/inkser/p/18224874

相关文章

  • 如何将图片识别成文字版word文档?
    在现代社会中,图片和文字的结合已经成为了一种常见的表达方式。我们可以通过图片来传达各种信息,比如广告、宣传等等。但有时候我们需要把图片中的文字提取出来,进行编辑和处理,这时候就需要把图片中的文字转换成word文档。下面给大家介绍几种常见的方法,帮助你解决图片如何成为word文......
  • 【故障识别】基于CNN-SVM卷积神经网络结合支持向量机的数据分类预测研究(Matlab代码实
    ......
  • PHP发票真假API在线文档、票据ocr识别、医疗票据查验
    翔云人工智能开放平台提供详细的发票查验API在线开发文档,不仅包含了PHP语言,还包含Java、python、go、C#、C++等众多的主流开发语言,便于有需要的用户快速的将发票查验功能集成到自己的系统或者应用中,极大的缩短了企业的开发时间和开发成本。翔云发票识别接口,运用自主OCR技术......
  • 柬埔寨语翻译通App上架啦!支持高棉语翻译成中文,中柬互译,高棉语OCR文字识别提取,提高工作
    大家好!有个超级棒的消息要告诉大家——柬埔寨语翻译通小程序已经上架啦!不论你是安卓还是苹果用户,都可以轻松下载使用!只要微信搜一搜,翻译之路畅通无阻!这不仅仅是一个翻译工具,它还支持高棉语中文双语翻译,翻译结果支持语音朗读,翻译记录自动保存!跟着说跟着读,高棉语词汇轻松掌握......
  • 基于深度神经网络的人脸识别相关问题
    基于深度神经网络的人脸识别相关问题1、DNN与CNN的关系CNN可以看作是一种特殊的DNN,它们之间的关系是包含和被包含的关系。CNN的核心是卷积层,该层可以有效地识别图像中的局部模式,并使用池化层来减少特征映射的维度。此外,CNN还包括其他类型的层,例如全连接层和激活函数层,用于将卷......
  • 神经网络应用场景——语音识别
    神经网络在语音识别领域的应用场景非常广泛,以下是几个典型的应用场景,结合相关数字和信息进行阐述:智能助手:语音助手如苹果的Siri、亚马逊的Alexa和谷歌的GoogleAssistant等,都广泛使用了基于神经网络的语音识别技术。这些智能助手能够理解用户的语音命令,并提供相应的服务,如......
  • 基于深度学习的鸟类声音识别系统
    鸟叫声识别在鸟类保护中具有重要意义。通过适当的声音分类,研究可以自动预测该地区的生活质量。如今,深度学习模型被用于对鸟类声音数据进行高精度的分类。然而,现有的大多数鸟类声音识别模型的泛化能力较差,并且采用复杂的算法来提取鸟类声音特征。为了解决这些问题,本文构建了一个包......
  • 验证码识别,密码找回漏洞
    验证码识别,密码找回漏洞前言:本节来学习有关验证码识别以及密码找回相关的漏洞1.1基础思路用res前端判断​ 如果验证码输入后的验证结果是由后端发送res返回值给前端,然后前端根据返回值进行判​ 断,那么此时我们可以通过更改res来达到绕过验证的效果,不过如果判断是在后端,我......
  • OpenCv之简单的人脸识别项目(人脸识别页面以及人脸比对页面)
    人脸识别准备三、人脸识别页面1.导入所需的包2.设置窗口2.1定义窗口外观和大小2.2设置窗口背景2.2.1设置背景图片2.2.2创建label控件3.定义两个全局变量4.定义选择并显示图片的函数4.1声明全局变量4.2设置文件选择对话框4.3设置条件语句4.4创建一个标签显示图像5.定义......
  • 使用 Bootstrap 5 无法在 php 文件中实现智能识别
    我使用VisualStudioCode在php文件中使用Bootstrap5。Bootstrap会在我编写HTML代码时向我显示建议,如第一张图片。但当我编写HTML代码时,它什么也不显示,如第二张图片。我尝试使用了许多扩展,并在设置中将php的执行路径和"php":"html"设置为emmet语言。我......