文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

神经网络理论基础及Python实现是怎么样的

2023-06-17 03:58

关注

本篇文章给大家分享的是有关神经网络理论基础及Python实现是怎么样的,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。

一、多层前向神经网络

多层前向神经网络由三部分组成:输出层、隐藏层、输出层,每层由单元组成;

输入层由训练集的实例特征向量传入,经过连接结点的权重传入下一层,前一层的输出是下一层的输入;隐藏层的个数是任意的,输入层只有一层,输出层也只有一层;

除去输入层之外,隐藏层和输出层的层数和为n,则该神经网络称为n层神经网络,如下图为2层的神经网络;

一层中加权求和,根据非线性方程进行转化输出;理论上,如果有足够多的隐藏层和足够大的训练集,可以模拟出任何方程;

神经网络理论基础及Python实现是怎么样的

二、设计神经网络结构

使用神经网络之前,必须要确定神经网络的层数,以及每层单元的个数;

为了加速学习过程,特征向量在传入输入层前,通常需要标准化到0和1之间;

离散型变量可以被编码成每一个输入单元对应一个特征值可能赋的值

比如:特征值A可能去三个值(a0,a1,a2),那么可以使用3个输入单元来代表A

神经网络理论基础及Python实现是怎么样的

神经网络既解决分类(classification)问题,也可以解决回归(regression)问题。对于分类问题,如果是两类,则可以用一个输出单元(0和1)分别表示两类;如果多余两类,则每一个类别用一个输出单元表示,所以输出层的单元数量通常等一类别的数量。

没有明确的规则来设计***个数的隐藏层,一般根据实验测试误差和准确率来改进实验。

三、交叉验证方法

如何计算准确率?最简单的方法是通过一组训练集和测试集,训练集通过训练得到模型,将测试集输入模型得到测试结果,将测试结果和测试集的真实标签进行比较,得到准确率。

在机器学习领域一个常用的方法是交叉验证方法。一组数据不分成2份,可能分为10份,

这样经过10次训练,得到10组准确率,将这10组数据求平均值得到平均准确率的结果。这里10是特例。一般意义上将数据分为k份,称该算法为K-fold  cross validation,即每一次选择k份中的一份作为测试集,剩余k-1份作为训练集,重复k次,最终得到平均准确率,是一种比较科学准确的方法。

神经网络理论基础及Python实现是怎么样的

四、BP算法

通过迭代来处理训练集中的实例;

对比经过神经网络后预测值与真实值之间的差;

反方向(从输出层=>隐藏层=>输入层)来最小化误差,来更新每个连接的权重;

4.1、算法详细介绍

输入:数据集、学习率、一个多层神经网络构架;

输出:一个训练好的神经网络;

初始化权重和偏向:随机初始化在-1到1之间(或者其他),每个单元有一个偏向;对于每一个训练实例X,执行以下步骤:

1、由输入层向前传送:

结合神经网络示意图进行分析:

神经网络理论基础及Python实现是怎么样的

由输入层到隐藏层:

神经网络理论基础及Python实现是怎么样的

由隐藏层到输出层:

神经网络理论基础及Python实现是怎么样的

两个公式进行总结,可以得到:

神经网络理论基础及Python实现是怎么样的

Ij为当前层单元值,Oi为上一层的单元值,wij为两层之间,连接两个单元值的权重值,sitaj为每一层的偏向值。我们要对每一层的输出进行非线性的转换,示意图如下:

神经网络理论基础及Python实现是怎么样的

当前层输出为Ij,f为非线性转化函数,又称为激活函数,定义如下:

神经网络理论基础及Python实现是怎么样的

即每一层的输出为:

神经网络理论基础及Python实现是怎么样的

这样就可以通过输入值正向得到每一层的输出值。

2、根据误差反向传送 对于输出层:其中Tk是真实值,Ok是预测值

神经网络理论基础及Python实现是怎么样的

对于隐藏层:

神经网络理论基础及Python实现是怎么样的

权重更新:其中l为学习率

神经网络理论基础及Python实现是怎么样的

偏向更新:

神经网络理论基础及Python实现是怎么样的

3、终止条件

偏重的更新低于某个阈值;

预测的错误率低于某个阈值;

达到预设一定的循环次数;

4、非线性转化函数

上面提到的非线性转化函数f,一般情况下可以用两种函数:

(1)tanh(x)函数:

(2)逻辑函数,本文上面用的就是逻辑函数

五、BP神经网络的python实现

需要先导入numpy模块

import numpy as np

定义非线性转化函数,由于还需要用到给函数的导数形式,因此一起定义

def 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))

设计BP神经网络的形式(几层,每层多少单元个数),用到了面向对象,主要是选择哪种非线性函数,以及初始化权重。layers是一个list,里面包含每一层的单元个数。

class NeuralNetwork:      def __init__(self, layers, activation='tanh'):          """          :param layers: A list containing the number of units in each layer.          Should be at least two values          :param activation: The activation function to be used. Can be          "logistic" or "tanh"          """          if activation == 'logistic':              self.activation = logistic              self.activation_deriv = logistic_derivative          elif activation == 'tanh':              self.activation = tanh              self.activation_deriv = tanh_deriv             self.weights = []          for i in range(1, len(layers) - 1):              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 = np.atleast_2d(X)          temp = np.ones([X.shape[0], X.shape[1]+1])          temp[:, 0:-1] = X          X = temp          y = np.array(y)             for k in range(epochs):              i = np.random.randint(X.shape[0])              a = [X[i]]                 for l in range(len(self.weights)):                  a.append(self.activation(np.dot(a[l], self.weights[l])))              error = y[i] - a[-1]              deltas = [error * self.activation_deriv(a[-1])]                 for l in range(len(a) - 2, 0, -1):                  deltas.append(deltas[-1].dot(self.weights[l].T)*self.activation_deriv(a[l]))              deltas.reverse()                 for i in range(len(self.weights)):                  layer = np.atleast_2d(a[i])                  delta = np.atleast_2d(deltas[i])                  self.weights[i] += learning_rate * layer.T.dot(delta)

实现预测

def predict(self, x):         x = np.array(x)         temp = np.ones(x.shape[0]+1)         temp[0:-1] = x         a = temp         for l in range(0, len(self.weights)):             a = self.activation(np.dot(a, self.weights[l]))         return a

我们给出一组数进行预测,我们上面的程序文件保存名称为BP

from BP import NeuralNetwork  import numpy as np     nn = NeuralNetwork([2,2,1], 'tanh')  x = np.array([[0,0], [0,1], [1,0], [1,1]])  y = np.array([1,0,0,1])  nn.fit(x,y,0.1,10000)  for i in [[0,0], [0,1], [1,0], [1,1]]:      print(i, nn.predict(i))

结果如下:

([0, 0], array([ 0.99738862])) ([0, 1], array([ 0.00091329]))  ([1, 0], array([ 0.00086846]))  ([1, 1], array([ 0.99751259]))

以上就是神经网络理论基础及Python实现是怎么样的,小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注编程网行业资讯频道。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯