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

news2024/11/26 9:32:56

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 Propogation
    hidden_layer_input1=np.dot(X,wh)
    hidden_layer_input=hidden_layer_input1 + bh
    hiddenlayer_activations = sigmoid(hidden_layer_input)
    output_layer_input1=np.dot(hiddenlayer_activations,wout)
    output_layer_input= output_layer_input1+ bout
    output = sigmoid(output_layer_input)
    # Backpropagation
    E = y-output
    slope_output_layer = derivatives_sigmoid(output)
    slope_hidden_layer = derivatives_sigmoid(hiddenlayer_activations)
    d_output = E * slope_output_layer
    Error_at_hidden_layer = d_output.dot(wout.T)
    d_hiddenlayer = Error_at_hidden_layer * slope_hidden_layer
    wout += hiddenlayer_activations.T.dot(d_output) *lr
    bout += np.sum(d_output, axis=0,keepdims=True) *lr
    wh += X.T.dot(d_hiddenlayer) *lr
    bh += np.sum(d_hiddenlayer, axis=0,keepdims=True) *lr

print("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.coloradmin.cn/o/1871888.html

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

相关文章

STM32_hal库学习(2)-按键(中断/非中断)控制LED

在这篇文章我将使用两种方法实现按键控制,分别使用非中断控制和中断控制LED 非中断按键控制LED: 对于非中断实现按键控制led,我将直接从上一个工程led闪烁进行修改 STM32F103—Hal库的学习(1)LED灯闪烁-CSDN博客 非…

<sa8650>QCX ISP Tuning 使用详解 — Tuning前置条件

<sa8650>QCX ISP Tuning 使用详解 — Tuning前置条件 一 如何安装 Qualcomm Chromatix™ 摄像头校准工具二 如何使用 Qualcomm Chromatix™ tuning工具创建tuning项目2.1 创建工程前提依赖2.2 创建工程2.3 添加场景2.4 编辑区域触发器三 如何创建Tuning 树一 如何安装 Qualco…

TypeScript(笔记版)

简介: nvm安装必须先把自己的node卸了,再去安装nvm TS就是js的超集 对js进行了扩展 浏览器不支持ts,要转换为js才可以。 ts是用来编程人员爽的 js的写法拿到ts也可以,ts代码量更大,但ts代码更加清晰 可以在playg…

C++精解【8】

文章目录 运算,- 加减法* / 乘除法逐元 乘法逐元 除法逐元综合运算矩阵乘法与加减法 转置、共轭、伴随矩阵点乘法,叉积 运算 ,- 加减法 逐元加减法 #include <iostream> #include "e:/eigen/Eigen/Dense" using namespace std;int main() {Eigen::Matrix2d …

并发编程工具集——Lock和Condition(上)(十二)

简述&#xff1a;Java SDK 并发包通过 Lock 和 Condition 两个接口来实现管程&#xff0c;其中 Lock 用于解决互斥问题&#xff0c;Condition 用于解决同步问题。 再造管程的理由和期望 理由&#xff1a;synchronized 没有办法解决“破坏不可抢占条件方案”。 原因是synchroniz…

可燃气体报警器计量校准:重要性与实践指南

在燃气机锅炉房、酒店厨房以及天然气管路等关键场所&#xff0c;可燃气体检测报警器的准确性和可靠性直接关系到人们的生命安全和财产安全。因此&#xff0c;对可燃气体报警器进行定期的计量校准至关重要。 在这篇文章中&#xff0c;佰德将从校准的必要性、方法与步骤、实际案…

【知识学习】阐述Unity3D中动画渲染的概念及使用方法示例

Unity3D中的卡通渲染&#xff08;Cartoon Rendering&#xff09;是一种渲染技术&#xff0c;它模仿传统手绘动画或漫画的视觉效果。这种渲染风格通常具有鲜明的颜色、清晰的轮廓线和简化的光影效果&#xff0c;常用于制作动画、游戏和其他视觉媒体。 卡通渲染的基本概念 轮廓…

Ansible-playbook的逻辑控制 ②

转载说明&#xff1a;如果您喜欢这篇文章并打算转载它&#xff0c;请私信作者取得授权。感谢您喜爱本文&#xff0c;请文明转载&#xff0c;谢谢。 在《Ansible-playbook的逻辑控制 ①》中&#xff0c;梳理了逻辑控制when的使用场景&#xff0c;本文则继续梳理学习loop与block块…

python调用nodeJs执行js代码

文章目录 安装环境二、python程序调用js代码示例 安装环境 需要安装nodejs、python python库安装 pip install PyExecJS2 二、python程序调用js代码 示例 js代码&#xff1a; function sum(a,b){return ab; }python代码 import execjsjs_codeopen(dejmo.js).read() js_…

springcloud第4季 分布式事务seata作用服务搭建1

一 seata作用 1.1 seata简介 1.seata是一款解决分布式事务的解决方案&#xff0c;致力于在微服务架构下提供高性能和简单易用的分布式事务服务。 1.2 seata的术语 一个中心&#xff1a;全局事务id&#xff0c;xid&#xff0c;在调用服务链路的上下文中进行传播。TC(Transa…

风机过滤机组介绍

一、定义 FFU英文全称为&#xff08;Fan Filter Unit&#xff09;&#xff0c;中文专业用语为风机过滤机组。FFU广泛应用于洁净室、洁净工作台、洁净生产线、组装式洁净室和局部百级等应用场合。 二、FFU的组成 FFU主要由四部分组成&#xff1a; 1.箱体 其材质常用镀锌铝合…

SpringBoot脚手架MySpringBootAPI(PgSQL+Druid+MyBatisPlus+Lombok)

MySpringBootAPI SpringBoot脚手架&#xff0c;基于SpringBootDruidPgSQLMyBatisPlusFastJSONLombok&#xff0c;其他的请自行添加和配置。 Author powered by Moshow郑锴(大狼狗) , https://zhengkai.blog.csdn.net 如何运行 1.首先确保你是JDK17&#xff0c;推荐微软的MSJDK…

[数据集][目标检测]游泳者溺水检测数据集VOC+YOLO格式8275张4类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;8275 标注数量(xml文件个数)&#xff1a;8275 标注数量(txt文件个数)&#xff1a;8275 标注…

5分钟,从购买域名到HTTPS访问

5分钟&#xff0c;从购买域名到HTTPS访问 架构师手把手教技术 大家好&#xff0c;最近很多小伙伴咨询关于在 安装nginx 和 部署SSL证书 方面的技术&#xff0c;因此我录制了这个视频&#xff0c;希望可以帮助大家更快速地掌握这些关键技能。 首先&#xff0c;让我们从购买域名…

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

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

「C系列」C 经典练习实例

文章目录 1. 基本输入输出2. 字符串操作3. 数组与循环4. 函数与递归5. 逻辑与条件6. 数学问题7. 数字与数学8. 数组与字符串9. 逻辑与条件10. 结构体和联合体11. 指针12. 文件操作13. 动态内存分配相关链接 C语言经典练习实例及详细代码可以涵盖多个方面&#xff0c;从基础输入…

深度学习实验第T1周:实现mnist手写数字识别

>- **&#x1f368; 本文为[&#x1f517;365天深度学习训练营](https://mp.weixin.qq.com/s/0dvHCaOoFnW8SCp3JpzKxg) 中的学习记录博客** >- **&#x1f356; 原作者&#xff1a;[K同学啊](https://mtyjkh.blog.csdn.net/)** 目录 目录 一、前言 二、我的环境 三、…

《梦醒蝶飞:释放Excel函数与公式的力量》6.3NOW函数

6.3NOW函数 1&#xff09;NOW函数概述 NOW函数是Excel中一个非常实用的内置函数&#xff0c;它返回当前的日期和时间。这个函数可以自动更新&#xff0c;以反映打开工作簿时的确切日期和时间。 2&#xff09;函数语法 NOW函数的语法非常简单&#xff0c;因为它不需要任何参…

轻量级仿 SpringBoot 程序

但凡 Java 程序&#xff0c;想必就是 Spring 程序&#xff1b;但凡 Spring 程序&#xff0c;想必就是 SpringBoot 程序——且慢&#xff0c;当今尚有不是 SpringBoot 即 SpringMVC 的程序不&#xff1f;有——老旧的遗留系统不就是嘛~——不&#xff0c;其实只要稍加“调教”&a…

测评:【AI办公】版本更迭与AI加持下的最新ONLYOFFICE桌面编辑器8.1

你是否还在为没有一款合适的在线桌面编辑器而苦恼&#xff1f;你是否还在因为办公软件的选择过少而只能使用WPS或者office&#xff1f;随着办公需求的不断变化和发展&#xff0c;办公软件也在不断更新和改进。ONLYOFFICE 作为一款全功能办公软件&#xff0c;一直致力于为用户提…