Python27 神经网络中的重要概念和可视化实现

1. 神经网络背后的直观知识

神经网络的工作方式非常相似:它接受多个输入,经过多个隐藏层中的多个神经元进行处理,并通过输出层返回结果,这个过程在技术上称为“前向传播”。

接下来,将神经网络的输出与实际输出进行比较。任务是使神经网络的输出尽可能接近实际(期望的)输出。在这个过程中,每个神经元都会产生一些误差,开发人员目标是最小化这些误差。

为了减少误差,尝试调整神经元的值和权重,特别是那些对错误“贡献”更多的神经元。这个过程称为“反向传播”。

为了有效地最小化误差并减少迭代次数,神经网络通常使用梯度下降等优化算法。

2. 多层感知器及其基础知识

就像原子是形成地球上任何物质的基础 - 神经网络的基本形成单位是感知器。那么,什么是感知器呢?感知器可以被理解为需要多个输入并产生一个输出的任何东西。例如,看下面的图片:

图片

上述结构需要三个输入并产生一个输出,下一个逻辑问题是输入和输出之间的关系是什么?从基本的方式着手,寻求更复杂的方法。

下面讨论三种创建输入输出关系的方法:

  1. 通过直接组合输入和计算基于阈值的输出。例如:取x1 = 0,x2 = 1,x3 = 1并设置阈值= 0。因此,如果x1 + x2 + x3> 0,则输出为1,否则为0。可以看出,在这种情况下,感知器会将输出计算为1。

  2. 接下来为输入添加权重。例如,分别为x1,x2和x3分配w1 = 2,w2 = 3和w3 = 4。为了计算输出,将输入与相应权重相乘,并将其与阈值进行比较,如w1 * x1 + w2 * x2 + w3 * x3>阈值。与x1和x2相比,这些权重对于x3显得更重要。

  3. 最后添加偏置量:每个感知器也有一个偏置量,可以被认为是感知器为什么灵活。它与某种线性函数y = ax + b的常数b类似,它允许上下移动线以适应数据更好的预测。假设没有b,线将始终通过原点(0,0),并且可能会得到较差的拟合。例如,感知器可以具有两个输入,在这种情况下,它需要三个权重。每个输入一个,偏置一个。现在输入的线性表示将如下所示:w1 * x1 + w2 * x2 + w3 * x3 + 1 * b。

但是,上面所讲的感知器之间的关系都是线性的,所以人们将感知器演化成现在所谓的人造神经元,对于输入和偏差,神经元将使用非线性变换(激活函数)。

3. 什么是激活函数?

激活函数将加权输入(w1 * x1 + w2 * x2 + w3 * x3 + 1 * b)的和作为参数,并返回神经元的输出。

图片

在上式中,用x0表示1,w0表示b。

激活函数主要用于进行非线性变换,它能够拟合非线性假设或估计复杂函数,有多种激活功能,如:“Sigmoid”“Tanh”ReLu等等。

4. 前向传播,反向传播和训练次数(epochs)

到目前为止,神经网络已经计算了输出,这个过程被称为“正向传播”。但是如果估计的输出远离实际输出(非常大的误差)怎么办?基于错误更新偏差和权重。这种权重和偏差更新过程被称为“反向传播”。

反向传播(BP)算法通过确定输出处的损耗(或误差),然后将其传播回网络来工作, 更新权重以最小化每个神经元产生的错误。最小化误差的第一步是确定每个节点w.r.t.的梯度(Derivatives),最终实现输出。

这一轮的前向和后向传播迭代被称为一个训练迭代也称为“Epoch”。

ps:e(一)poch(波)的意思;一个epoch是指把所有训练数据完整的过一遍

5. 多层感知器

关于多层感知器。到目前为止,已经看到只有一个由3个输入节点组成的单层,即x1,x2和x3,以及由单个神经元组成的输出层。但是,出于实际,单层网络只能做到这一点。如下所示,MLP由层叠在输入层和输出层之间的许多隐层组成。

图片

多层感知器

上面的图像只显示一个单一的隐藏层,但实际上可以包含多个隐藏层。在MLP的情况下要记住的另一点是,所有层都完全连接,即层中的每个节点(输入和输出层除外)连接到上一层和下一层中的每个节点。继续下一个主题,即神经网络的训练算法(最小化误差)。在这里,我们将看到最常见的训练算法称为梯度下降。

6. 全批量梯度下降和随机梯度下降

Gradient Descent的第二个变体通过使用相同的更新算法执行更新MLP的权重的相同工作,但差异在于用于更新权重和偏差的训练样本的数量。

全部批量梯度下降算法作为名称意味着使用所有的训练数据点来更新每个权重一次,而随机渐变使用1个或更多(样本),但从不使整个训练数据更新权重一次。

用一个简单的例子来理解这个10个数据点的数据集,它们有两个权重w1和w2。

  • 全批:可以使用10个数据点(整个训练数据),并计算w1(Δw1)的变化和w2(Δw2)的变化,并更新w1和w2。

  • SGD:使用第一个数据点并计算w1(Δw1)的变化,并改变w2(Δw2),同时更新w1和w2。接下来,当使用第二个数据点时,将处理更新的权重。

7. 神经网络方法的步骤

图片

多层感知器

接下来是一步一步地构建神经网络的方法(MLP与一个隐藏层,类似于上图所示的架构)。在输出层只有一个神经元,因为要解决二进制分类问题(预测0或1)。

一般步骤:

  1. 输入和输出

    • X作为输入矩阵

    • y作为输出矩阵

  2. 用随机值初始化权重和偏差(这是一次启动,在下一次迭代中,将使用更新的权重和偏差)。定义:

    • wh作为权重矩阵隐藏层

    • bh作为隐藏层的偏置矩阵

    • wout作为输出层的权重矩阵

    • bout作为偏置矩阵作为输出层

  3. 将输入和权重的矩阵点积分配给输入和隐藏层之间的边,然后将隐层神经元的偏差添加到相应的输入,这被称为线性变换:

    hidden_layer_input= matrix_dot_product(X,wh) + bh

  4. 使用激活函数(Sigmoid)执行非线性变换。Sigmoid将返回输出1/(1 + exp(-x)).hiddenlayer_activations = sigmoid(hidden_layer_input)

  5. 对隐藏层激活进行线性变换(取矩阵点积,并加上输出层神经元的偏差),然后应用激活函数(再次使用Sigmoid,但是根据您的任务可以使用任何其他激活函数 )来预测输出

    output_layer_input = matrix_dot_product (hiddenlayer_activations * wout ) + bout

    output = sigmoid(output_layer_input)

所有上述步骤被称为“前向传播”(Forward Propagation)

  1. 将预测与实际输出进行比较,并计算误差梯度(实际预测值)。误差是均方损失= ((Y-t)^2)/2E = y – output

  2. 计算隐藏和输出层神经元的斜率/斜率(为了计算斜率,我们计算每个神经元的每层的非线性激活x的导数)。S形梯度可以返回 x * (1 – x).

    slope_output_layer = derivatives_sigmoid(output)

    slope_hidden_layer = derivatives_sigmoid(hiddenlayer_activations)

  3. 计算输出层的变化因子(delta),取决于误差梯度乘以输出层激活的斜率d_output = E * slope_output_layer

  4. 在这一步,错误将传播回网络,这意味着隐藏层的错误。为此,我们将采用输出层三角形的点积与隐藏层和输出层之间的边缘的重量参数(wout.T)。Error_at_hidden_layer = matrix_dot_product(d_output, wout.Transpose)

  5. 计算隐层的变化因子(delta),将隐层的误差乘以隐藏层激活的斜率d_hiddenlayer = Error_at_hidden_layer * slope_hidden_layer

  6. 在输出和隐藏层更新权重:网络中的权重可以从为训练示例计算的错误中更新。wout = wout + matrix_dot_product(hiddenlayer_activations.Transpose, d_output)*learning_rate

    wh = wh + matrix_dot_product(X.Transpose,d_hiddenlayer)*learning_ratelearning_rate:权重更新的量由称为学习率的配置参数控制)

  7. 在输出和隐藏层更新偏差:网络中的偏差可以从该神经元的聚合错误中更新。

    bh = bh + sum(d_hiddenlayer, axis=0) * learning_rate

    bout = bout + sum(d_output, axis=0)*learning_rate

    • bias at output_layer =bias at output_layer + sum of delta of output_layer at row-wise * learning_rate

    • bias at hidden_layer =bias at hidden_layer + sum of delta of output_layer at row-wise * learning_rate

从6到12的步骤被称为“向后传播”(Backward Propagation)

一个正向和反向传播迭代被认为是一个训练周期。以上,我们更新了隐藏和输出层的权重和偏差,并使用了全批量梯度下降算法。

8. 神经网络方法的可视化步骤

重复上述步骤,可视化输入,权重,偏差,输出,误差矩阵,以了解神经网络(MLP)的工作方法。

  • 注意:

    • 对于良好的可视化图像,我有2或3个位置的十进制小数位。

    • 黄色填充的细胞代表当前活动细胞

    • 橙色单元格表示用于填充当前单元格值的输入

  • 步骤1:读取输入和输出

    图片

  • 步骤2:用随机值初始化权重和偏差(有初始化权重和偏差的方法,但是现在用随机值初始化)

    图片

  • 步骤3:计算隐层输入:
    hidden_layer_input= matrix_dot_product(X,wh) + bh

    图片

  • 步骤4:对隐藏的线性输入进行非线性变换
    hiddenlayer_activations = sigmoid(hidden_layer_input)

    图片

  • 步骤5:在输出层执行隐层激活的线性和非线性变换
    output_layer_input = matrix_dot_product (hiddenlayer_activations * wout ) + bout
    output = sigmoid(output_layer_input)

    图片

  • 步骤6:计算输出层的误差(E)梯度
    E = y-output

    图片

  • 步骤7:计算输出和隐藏层的斜率
    Slope_output_layer= derivatives_sigmoid(output)
    Slope_hidden_layer = derivatives_sigmoid(hiddenlayer_activations)

    图片

  • 步骤8:计算输出层的增量
    d_output = E * slope_output_layer*lr

    图片

  • 步骤9:计算隐藏层的误差
    Error_at_hidden_layer = matrix_dot_product(d_output, wout.Transpose)

    图片

  • 步骤10:计算隐藏层的增量
    d_hiddenlayer = Error_at_hidden_layer * slope_hidden_layer

    图片

  • 步骤11:更新输出和隐藏层的权重
    wout = wout + matrix_dot_product(hiddenlayer_activations.Transpose, d_output)*learning_rate
    wh = wh+ matrix_dot_product(X.Transpose,d_hiddenlayer)*learning_rate

    图片

  • 步骤12:更新输出和隐藏层的偏置量
    bh = bh + sum(d_hiddenlayer, axis=0) * learning_rate
    bout = bout + sum(d_output, axis=0)*learning_rate

    图片

以上,可以看到仍然有一个很好的误差而不接近于实际目标值,因为神经网络已经完成了一次训练迭代。如果多次训练模型,那么这将非常接近的实际结果。完成数千次迭代后的结果接近实际的目标值([[0.98032096] [0.96845624] [0.04532167]])。

9.使用Numpy(Python)实现NN

import numpy as np# Input array
X=np.array([[1,0,1,0],[1,0,1,1],[0,1,0,1]])# Output
y=np.array([[1],[1],[0]])# Sigmoid Function
def sigmoid (x):return 1/(1 + np.exp(-x))# Derivative of Sigmoid Function
def derivatives_sigmoid(x):return x * (1 - x)# Variable initialization
epoch=5000 #Setting training iterations
lr=0.1  # Setting learning rate
inputlayer_neurons = X.shape[1]  # number of features in data set
hiddenlayer_neurons = 3  # number of hidden layers neurons
output_neurons = 1  # number of neurons at output layer# weight and bias initialization
wh=np.random.uniform(size=(inputlayer_neurons,hiddenlayer_neurons))
bh=np.random.uniform(size=(1,hiddenlayer_neurons))
wout=np.random.uniform(size=(hiddenlayer_neurons,output_neurons))
bout=np.random.uniform(size=(1,output_neurons))for i in range(epoch):# Forward Propogationhidden_layer_input1=np.dot(X,wh)hidden_layer_input=hidden_layer_input1 + bhhiddenlayer_activations = sigmoid(hidden_layer_input)output_layer_input1=np.dot(hiddenlayer_activations,wout)output_layer_input= output_layer_input1+ boutoutput = sigmoid(output_layer_input)# BackpropagationE = y-outputslope_output_layer = derivatives_sigmoid(output)slope_hidden_layer = derivatives_sigmoid(hiddenlayer_activations)d_output = E * slope_output_layerError_at_hidden_layer = d_output.dot(wout.T)d_hiddenlayer = Error_at_hidden_layer * slope_hidden_layerwout += hiddenlayer_activations.T.dot(d_output) *lrbout += np.sum(d_output, axis=0,keepdims=True) *lrwh += X.T.dot(d_hiddenlayer) *lrbh += np.sum(d_hiddenlayer, axis=0,keepdims=True) *lrprint("output of Forward Propogation:\n{}".format(output))
print("wout,bout of Backpropagation:\n{},\n{}".format(wout,bout))# 输出:
'''
output of Forward Propogation:
[[0.98029862][0.97141123][0.03712863]]
wout,bout of Backpropagation:
[[-3.67752007][ 4.10817642]
 [ 0.70303165]],
[[-0.48310214]]
'''

原文参见:https://www.analyticsvidhya.com/blog/2020/07/neural-networks-from-scratch-in-python-and-r/


以上内容总结自网络,如有帮助欢迎转发,我们下次再见!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/36790.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

GIT-LFS使用

0.前言 目前git仓库有很多很大的文件需要管理,但是直接上传,每次clone的文件太大,所有准备使用git-lfs解决。 1、下载和安装 Git LFS 1.1、直接下载二进制包: Releases git-lfs/git-lfs GitHub 安装 Git LFS sudo rpm -ivh…

Spring Boot中获取请求参数的几种方式

前言 在构建现代 Web 应用时,处理来自客户端的请求参数是不可或缺的一部分。Spring Boot作为构建微服务应用的领先框架,提供了多种灵活高效的方式来获取请求参数,满足各种应用场景。 无论您是Spring Boot的初学者,还是希望更深入…

LabVIEW电涡流检测系统

开发了一种基于LabVIEW的软件与硬件结合的电涡流检测系统,通过同步采样技术和编码器的协同工作,显著提高了大型结构物的损伤检测精度和效率,具有良好的应用前景和实用价值。 项目背景 传统的手持式电涡流检测方法因其速度慢、灵敏度低、准确…

<sa8650>QCX 诊断模块和错误处理

<sa8650>QCX 诊断模块和错误处理 一、错误报告设计二、QCarCam API 的错误报告2.1 QCarCamRegisterEventCallback2.2 CarCamErrorInfo_t2.3 QCarCamErrorInfo_t2.4 Error ID2.4.1 QCARCAM_ERROR_WARNING2.4.2 QCARCAM_ERROR_SUBSYSTEM_FATAL2.4.3 QCARCAM_ERROR_FATAL2.4.4 Q…

Links: Challenging Puzzle Game Template(益智游戏模板)

链接:挑战益智游戏 《Links》是一款独特且具有挑战性的益智游戏,即将发布。 每个级别都会向玩家展示不同的棋盘。目标是通过移动和旋转所有棋子来连接它们。每个棋子都有自己的特点和功能-你可以移动它们,旋转它们,或者两者兼而有之。连接所有棋子,以解决难度和挑战不断增…

谷歌发布两款新Gemma 2大语言模型;阿里云开源Qwen2-72B模型荣登榜首

🦉 AI新闻 🚀 谷歌发布两款新Gemma 2大语言模型 摘要:谷歌发布Gemma 2大语言模型,包括90亿和270亿参数两种版本。Gemma 2在推理性能、效率和安全性上较第一代有显著提升。27B模型的性能媲美更大规模的主流模型,且部署…

收银系统开源源码-千呼新零售2.0【打折促销】

千呼新零售2.0系统是零售行业连锁店一体化收银系统,包括线下收银线上商城连锁店管理ERP管理商品管理供应商管理会员营销等功能为一体,线上线下数据全部打通。 适用于商超、便利店、水果、生鲜、母婴、服装、零食、百货、宠物等连锁店使用。 详细介绍请…

OpenAI穿着「皇帝的新衣」;扒了数万条帖子汇总100种AIGC玩法;北美出海的财务避坑指南;我创业「如」有CTO | ShowMeAI日报

👀日报&周刊合集 | 🎡生产力工具与行业应用大全 | 🧡 点赞关注评论拜托啦! 1. 我扒了 Reddit 论坛数万条帖子,汇总了 GenAI 的 100 种玩法 ChatGPT 已经问世一年半了。这期间诞生了很多大语言模型和生成式人工智能…

[数据集][目标检测]金属架螺栓螺丝有无检测数据集VOC+YOLO格式857张3类别

数据集格式:Pascal VOC格式YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):857 标注数量(xml文件个数):857 标注数量(txt文件个数):857 标注类别…

Vite: 关于Rollup打包

概述 Rollup 是一款基于 ES Module 模块规范实现的 JavaScript 打包工具,在前端社区中赫赫有名,同时也在 Vite 的架构体系中发挥着重要作用不仅是 Vite 生产环境下的打包工具,其插件机制也被 Vite 所兼容,可以说是 Vite 的构建基…

数据结构速成--树和二叉树

由于是速成专题,因此内容不会十分全面,只会涵盖考试重点,各学校课程要求不同 ,大家可以按照考纲复习,不全面的内容,可以看一下小编主页数据结构初阶的内容,找到对应专题详细学习一下。 气死了…

东京裸机云服务器怎么用

东京裸机云服务器是一种结合了物理服务器性能和云服务灵活性的高性能计算服务,它为用户提供了高效、安全的计算和存储能力。在了解如何使用东京裸机云服务器之前,需要了解其基本特性和优势。具体分析如下,rak部落小编为您整理发布。 1. **硬件…

代码随想录第36天|动态规划

62. 不同路径 补充: 对二维数组的操作 dp[j][i] 表示到 j,i 有多少种路径递推公式: dp[j][i] dp[j - 1][i] dp[j][i - 1]初始化: dp[0][i] 和 dp[j][0] 都只有1种情况遍历顺序: 由于dp[j][i] 由 上和左的元素推导, 所以采用从左到右、从上到下的遍历顺序 class Solution {…

怎么隐藏宝塔面板左上角绑定的手机号码?

宝塔面板后台的左上角会显示我们绑定的宝塔账号(手机号码),每次截图的时候都要去抹掉这个号码,那么能不能直接将这个手机号码隐藏掉呢? 如上图红色箭头所示的手机号码,其实就是我们绑定的宝塔账号&#xff…

Delphi-2M:基于病史预测未来健康的改进GPT架构

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…

CAN-bus总线在冷链运输中的应用

CAN-bus总线在冷链运输中的应用 如图1所示,疫苗冷链是指为保证疫苗从疫苗生产企业到接种单位运转过程中的质量而装备的存储、运输冷藏设施、设备。由于疫苗对温度敏感,从疫苗制造的部门到疫苗使用的现场之间的每一个环节,都可能因温度过高而失效。在储运过程中,一旦温度超…

R语言 | 带P值的相关性热图绘制教程

原文链接:带P值的相关性热图绘制教程 本期教程 往期教程部分内容 **注意:若是在MarkDown格式中无法运行成功,请新建有一个R script文件 ** 一、加载R包 if (!require(corrplot)) install.packages("corrplot") if (!require(Hmi…

【python】PyQt5对象类型的判定,对象删除操作详细解读

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,…

【离散数学·图论】(复习)

一、基本概念 1.一些基本术语: 2.点u,v邻接(或相邻): 边e称为关联顶点u和v,or e连接u和v; 3.G(V,E)中,顶点v所有邻居的集合:N(v), 成为v的邻域。 4.度 : deg(v) 5.悬挂点:度为1的…

鸿蒙智慧监控解决方案:由Al视觉盒、网络摄像头、管理后台、手机端、NVR等组成

方案架构 整体技术架构由Al视觉盒、网络摄像头、管理后台、手机端、NVR等组成,提供从前端智能监控到后端数据处理的完整闭环。 方案价值 01/节约人力成本 ①AI算法对监控内容进行实时的智能检测,准确率高,有效减少错漏,无需多个…