神经网络算法---手写数字体识别

article/2025/10/7 23:12:58

文章目录

        • 神经网络的背景
        • 多层向前神经网络
        • 设计神经网络结构
          • 交叉验方法
        • Backpropagation 算法
        • 激活函数
        • 手写数字例子

神经网络的背景

1,1980年backpropagation是神经网络算法最著名的算法,以人脑中的神经网络为启发。

多层向前神经网络

  • backpropagation被使用在多层向前神经网络上
  • 多层向前神经网络由一下3个部分组成:输入层,隐藏层,输出层
  • 在这里插入图片描述
  • 每层由单元组成
  • 输入层由训练集的实例特征向量传入
  • 经过连接结点的权重传入下一层,一层的输出是下一层的输入
  • 每个单元可以被称为神经结点,
  • 隐藏层的个数可以是任意的,输入层由一层,输出层一层
  • 上图是两层的神经网络(输出层不算)
  • 一层中加权的求和,然后根据非线性方程转化成为输出
  • 理论上,如果有足够多的隐藏层和足够大的训练集,可以模拟任何方程。(功能强大)(设多少层,每层多少个)

设计神经网络结构

  • 使用神经网络训练数据之前,必须确定神经网络的层数,以及每层单元的个数
  • 特征向量在被传入输入层时常常被先标准化到0到1之间(目的是加速学习过程)
  • 离散型变量可以被编码成每一个输入单元对应特征值可能的赋值
  • 神经网络既可以解决分类问题,又能解决回归问题,没有明确的规则来设计最好有多少个隐藏层,根据实验测试和误差,以及准确度来实验并且改进
交叉验方法

将数据分成k份,每次取其中一份当作测试集,其余的当层训练集,循环k次,再将准确度取平均。

Backpropagation 算法

  • 通过迭代性来处理训练集中的实例
  • 对比经过神经网络后的输入层的预测值和真实值之间的差距
  • 反方向(从输出层-》隐藏层-》输入层)来最小化误差来更新每个连接的权重

激活函数

  • 非线性转化的过程用来做激活函数。
  • 双曲函数和逻辑函数都能做为激活函数。
  • sigmoid函数将y值在(0,1)之间变化的函数。

手写数字例子

首先构建神经网络

 import numpy as npdef tanh(x):return np.tanh(x)def tanh_deriv(x):return 1.0 - np.tanh(x) * np.tanh(x)def logistic(x):return 1 / (1 + np.exp(-x))def logistic_derivative(x):return logistic(x) * (1 - logistic(x))class NeuralNetwork:def __init__(self, layers, activation='tanh'):# 根据类实例化一个函数,_init_代表的是构造函数# self相当于java中的this""":param layers:一个列表,包含了每层神经网络中有几个神经元,至少有两层,输入层不算作[, , ,]中每个值代表了每层的神经元个数:param activation:激活函数可以使用tanh 和 logistics,不指明的情况下就是tanh函数"""if activation == 'logistic':self.activation = logisticself.activation_deriv = logistic_derivativeelif activation == 'tanh':self.activation = tanhself.activation_deriv = tanh_deriv# 初始化weights,self.weights = []# len(layers)layer是一个list[10,10,3],则len(layer)=3# 除了输出层都要赋予一个随机产生的权重for i in range(1, len(layers) - 1):# np.random.random为nunpy随机产生的数# 实际是以第二层开始,前后都连线赋予权重,权重位于[-0.25,0.25]之间self.weights.append((2 * np.random.random((layers[i - 1] + 1, layers[i] + 1)) - 1) * 0.25)self.weights.append((2 * np.random.random((layers[i] + 1, layers[i + 1])) - 1) * 0.25)# 定义一个方法,训练神经网络def fit(self, X, y, learning_rate=0.2, epochs=10000):# X:数据集,确认是二维,每行是一个实例,每个实例有一些特征值X = np.atleast_2d(X)# np.ones初始化一个矩阵,传入两个参数全是1# X.shape返回的是一个list[行数,列数]# X.shape[0]返回的是行,X.shape[1]+1:比X多1,对bias进行赋值为1temp = np.ones([X.shape[0], X.shape[1] + 1])# “ :”取所有的行# “0-1”从第一列到倒数第二列,-1代表的是最后一列temp[:, 0:-1] = XX = temp# y:classlabel,函数的分类标记y = np.array(y)# K代表的是第几轮循环for k in range(epochs):# 从0到X.shape[0]随机抽取一行做实例i = np.random.randint(X.shape[0])a = [X[i]]# 正向更新权重    ,len(self.weights)等于神经网络层数for l in range(len(self.weights)):# np.dot代表两参数的内积,x.dot(y) 等价于 np.dot(x,y)# 即a与weights内积,之后放入非线性转化function求下一层# a输入层,append不断增长,完成所有正向的更新a.append(self.activation(np.dot(a[l], self.weights[l])))# 计算错误率,y[i]真实标记   ,a[-1]预测的classlableerror = y[i] - a[-1]# 计算输出层的误差,根据最后一层当前神经元的值,反向更新deltas = [error * self.activation_deriv(a[-1])]# 反向更新# len(a)所有神经元的层数,不能算第一场和最后一层# 从最后一层到第0层,每次-1for l in range(len(a) - 2, 0, -1):#deltas.append(deltas[-1].dot(self.weights[l].T) * self.activation_deriv(a[l]))# reverse将deltas的层数跌倒过来deltas.reverse()for i in range(len(self.weights)):#layer = np.atleast_2d(a[i])# delta代表的是权重更新delta = np.atleast_2d(deltas[i])# layer.T.dot(delta)误差和单元格的内积self.weights[i] += learning_rate * layer.T.dot(delta)def predict(self, x):x = np.array(x)temp = np.ones(x.shape[0] + 1)# 从0行到倒数第一行temp[0:-1] = xa = tempfor l in range(0, len(self.weights)):a = self.activation(np.dot(a, self.weights[l]))return a

接着创建主函数

from main import NeuralNetwork
import numpy as np
#导入数据集的包
from sklearn.datasets import load_digits
#将数据分成数据集和训练集的包
from sklearn.model_selection import train_test_split
#二值化的函数
from sklearn.preprocessing import LabelBinarizer
from sklearn.metrics import confusion_matrix,classification_report
#下载包
digits = load_digits()
X = digits.data
y = digits.target
#简单的预处理,将x标准花为(01)之间
X -= X.min()
X /= X.max()#实例化神经网络 每个图都是64个像素点,有64个维度,每个都是神经元,隐藏层100,输出层10(输入层和特征向量像素一样,输出层和要分成多少类一样。)
nn = NeuralNetwork([64,100,10],"logistic")
#将数据分为测试集,训练集和
X_train,X_test,y_train,y_test = train_test_split(X,y)
#将包转换成二维的数字类型,
label_train = LabelBinarizer().fit_transform(y_train)
label_test =  LabelBinarizer().fit_transform(y_test)
print("start fitting")
# 放入神经网络
nn.fit(X_train,label_train,epochs=3000)
predictions = []
for i in range(X_test.shape[0]):o = nn.predict(X_test[i])predictions.append(np.argmax(o))#confusion_matrix绘图的正确性, 对角线是真实值和预测值相同。对角线上的位置都是预测对了
print(confusion_matrix(y_test,predictions))
# 准确度
print(classification_report(y_test,predictions))
#precision 预测对的概率,recall:真实值是零的时候,预测为正确的该路

最后结果展示:
在这里插入图片描述


http://chatgpt.dhexx.cn/article/6I1vRZ6n.shtml

相关文章

遗传算法和神经网络算法区别与联系

1、关于遗传算法,模糊数学,神经网络三种数学的区别和联系 遗传算法是一种智能计算方法,针对不同的实际问题可以设计不同的计算程序。它主要有复制,交叉,变异三部分完成,是仿照生物进化过程来进行计算方法的…

卷积神经网络算法三大类,卷积神经网络算法实现

卷积神经网络算法是什么? 一维构筑、二维构筑、全卷积构筑。 卷积神经网络(ConvolutionalNeuralNetworks,CNN)是一类包含卷积计算且具有深度结构的前馈神经网络(FeedforwardNeuralNetworks),是深度学习&a…

神经网络的基本原理,神经网络算法三大类

1、神经网络是什么? 生物神经网络主要是指人脑的神经网络,它是人工神经网络的技术原型。 人脑是人类思维的物质基础,思维的功能定位在大脑皮层,后者含有大约10^11个神经元,每个神经元又通过神经突触与大约103个其它神…

神经网络的算法有哪些,神经网络算法包括哪些

卷积神经网络算法是什么? 一维构筑、二维构筑、全卷积构筑。 卷积神经网络(ConvolutionalNeuralNetworks,CNN)是一类包含卷积计算且具有深度结构的前馈神经网络(FeedforwardNeuralNetworks),是深度学习&a…

反馈神经网络算法

典型的卷积神经网络,开始阶段都是卷积层以及池化层的相互交替使用,之后采用全连接层将卷积和池化后的结果特征全部提取进行概率计算处理。 在具体的误差反馈和权重更新的处理上,不论是全连接层的更新还是卷积层的更新,使用的都是经…

神经网络算法实例说明,简单神经网络算法原理

神经网络算法实例说明有哪些? 在网络模型与算法研究的基础上,利用人工神经网络组成实际的应用系统,例如,完成某种信号处理或模式识别的功能、构作专家系统、制成机器人、复杂系统控制等等。 纵观当代新兴科学技术的发展历史&…

算法评价与神经网络算法

前言 随着大数据和信息传输技术的兴起、人们的数据处理工作指数型增长,传统的编程方法和数学模型不再适用于这样大数据量、高噪音的工作,神经网络的使用就变得愈加广泛。作为传统机器学习的一个分支,神经网络实现了更高层次的自动化。对于多…

神经网络算法可以用来干什么

神经网络算法可以解决的问题有哪些 人工神经网络(Artificial Neural Networks,ANN)系统是 20 世纪 40 年代后出现的。它是由众多的神经元可调的连接权值连接而成,具有大规模并行处理、分布式信 息存储、良好的自组织自学习能力等特…

Matlab实现神经网络算法

线性关系可以说是最简单的关系,但在大多数实际问题求解中,线性关系往往不能体现事物之间的复杂关系。而神经网络算法具有非线性关系的逼近能力。在以往所学的算法中,往往是通过得到一个f(x)函数来描述y和x之间的关系的,但神经网络…

神经网络算法的基本原理,神经网络算法通俗解释

神经网络算法原理 4.2.1概述人工神经网络的研究与计算机的研究几乎是同步发展的。 1943年心理学家McCulloch和数学家Pitts合作提出了形式神经元的数学模型,20世纪50年代末,Rosenblatt提出了感知器模型,1982年,Hopfiled引入了能量…

神经网络算法的基本原理,神经网络算法都有哪些

神经网络算法的三大类分别是? 神经网络算法的三大类分别是:1、前馈神经网络:这是实际应用中最常见的神经网络类型。第一层是输入,最后一层是输出。如果有多个隐藏层,我们称之为“深度”神经网络。他们计算出一系列改变…

神经网络算法介绍

引言 人工神经网络(Artificial Neural Networks,ANN)最早起源于1943年,受“脑神经元学说”的启发,心理学家WMcculloch和数理逻辑学家WPitts首次提出基于神经元的数学模型,后来经过无数人的改进和完善&…

深度神经网络算法有哪些,最简单的神经网络算法

常见的深度学习算法主要有哪些? 深度学习常见的3种算法有:卷积神经网络、循环神经网络、生成对抗网络。 卷积神经网络(ConvolutionalNeuralNetworks,CNN)是一类包含卷积计算且具有深度结构的前馈神经网络(FeedforwardNeuralNetworks),是深度…

神经网络算法基本原理及其实现

目录 背景知识 人工神经元模型 激活函数 网络结构 工作状态 学习方式 BP算法原理 算法实现(MATLAB) 背景知识 在我们人体内的神经元的基本结构,相信大家并不陌生,看完下面这张图,相信大家都能懂 什么是人工神经…

神经网络算法介绍(Nerual NetWorks)

神经网络是所谓深度学习的一个基础,也是必备的知识点,他是以人脑中的神经网络作为启发,最著名的算法就是backpropagation算法,这里就简单的整理一下神经网络相关参数,和计算方法。 一、多层向前神经网络(M…

神经网络算法

参考 神经网络算法 - 云社区 - 腾讯云 目录 1、神经元模型 2、感知机与多层网络 3、误差逆传播算法 4、全局最小与局部最小 5、其他神经网络 1、RBF网络 2、ART网络 3、SOM网络 4、级联相关 5、Elman网络 6、Boltzmann机 6、深度学习 1、神经元模型 神经网络(neu…

人工智能学习——神经网络(matlab+python实现)

人工智能学习——神经网络 文章目录 人工智能学习——神经网络前言一、神经网络理论知识1.人工神经网络的概念2.神经元的概念3.MP神经元模型4.常见的激活函数5.人工神经网络模型种类6.人工神经网络学习方式、规则,分类 二、感知器的介绍1.单层感知器(单层…

神经网络——最易懂最清晰的一篇文章

神经网络是一门重要的机器学习技术。它是目前最为火热的研究方向--深度学习的基础。学习神经网络不仅可以让你掌握一门强大的机器学习方法,同时也可以更好地帮助你理解深度学习技术。 本文以一种简单的,循序的方式讲解神经网络。适合对神经网络了解不多的…

【水滴石穿】报错解决不了

地址:https://github.com/Farukaksungur/React-Native- 转载于:https://www.cnblogs.com/smart-girl/p/10875511.html

GREYONE Data Flow Sensitive Fuzzing

目录 Abstract Introduction 1.1questions to address 1.2 our solution 1.3 result 2 design of greyone 2.1 Fuzzer-driven Taint Inference 2.1.1 Taint inference 2.1.2 Comparison with Traditional Taint Analysis. 2.1.3 Identify Direct Copies of Inputs. …