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 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/


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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Java | Leetcode Java题解之第202题快乐数

题目&#xff1a; 题解&#xff1a; class Solution {private static Set<Integer> cycleMembers new HashSet<>(Arrays.asList(4, 16, 37, 58, 89, 145, 42, 20));public int getNext(int n) {int totalSum 0;while (n > 0) {int d n % 10;n n / 10;totalS…

Windows下activemq开启jmx

1.activemq版本信息 activemq&#xff1a;apache-activemq-5.18.4 2.Windows下activemq开启jmx 1.进入activemq conf目录&#xff0c;备份activemq.xml文件 2.编辑activemq.xml文件&#xff0c;在broker节点增加useJmx"true" <broker xmlns"http://active…

Vuetify3:​快捷回到顶部

在Vuetify 3中&#xff0c;要实现回到顶部&#xff0c;我们需要创建悬浮按钮&#xff0c;如下&#xff1a; <template><v-list><div class"position-fixed right-0 bottom-0" style"top:50%;"><v-list-item ><v-btn icon"…

黑马点评项目总结1-使用Session发送验证码和登录login和 使用Redis存储验证码和Redis的token登录

黑马先是总结了从session实现登录&#xff0c;然后是因为如果使用了集群方式的服务器的话&#xff0c;存在集群共享session互相拷贝效率低下的问题&#xff0c;接着引出了速度更快的内存型的kv数据库Redis&#xff0c; 使用Session发送验证码和登录login 举个例子&#xff1a…

『Django』模型入门教程-操作MySQL

theme: smartblue 点赞 关注 收藏 学会了 本文简介 一个后台如果没有数据库可以说废了一半。日常开发中大多数时候都在与数据库打交道。Django 为我们提供了一种更简单的操作数据库的方式。 在 Django 中&#xff0c;模型(Model)是用来定义数据库结构的类。每个模型类通常对…

kali下安装使用蚁剑(AntSword)

目录 0x00 介绍0x01 安装0x02 使用1. 设置代理2. 请求头配置3. 编码器 0x00 介绍 蚁剑&#xff08;AntSword&#xff09;是一个webshell管理工具。 官方文档&#xff1a;https://www.yuque.com/antswordproject/antsword 0x01 安装 在kali中安装蚁剑&#xff0c;分为两部分&am…

matlab绘制二维曲线,如何设置线型、颜色、标记点类型、如何设置坐标轴、matlab 图表标注、在图中标记想要的点

matlab绘制二维曲线&#xff0c;如何设置线型、颜色、标记点类型、如何设置坐标轴、matlab 图表如何标注、如何在图中标记想要的点 matlab绘制二维曲线&#xff0c;如何在图中标记想要的点。。。如何设置线型、颜色、标记点类型。。。如何设置坐标轴。。。matlab 图表标注操作…

视频网站系统

摘 要 随着互联网的快速发展和人们对视频内容的需求增加&#xff0c;视频网站成为了人们获取信息和娱乐的重要平台。本论文基于SpringBoot框架&#xff0c;设计与实现了一个视频网站系统。首先&#xff0c;通过对国内外视频网站发展现状的调研&#xff0c;分析了视频网站的背景…

潮玩手办盲盒前端项目模版的技术探索与应用案例

一、引言 在数字化时代&#xff0c;随着消费者对个性化和艺术化产品的需求日益增长&#xff0c;潮玩手办和盲盒市场逐渐崭露头角。为了满足这一市场需求&#xff0c;前端技术团队需要构建一个功能丰富、用户友好的在线平台。本文旨在探讨潮玩手办盲盒前端项目模版的技术实现&a…

C++ | Leetcode C++题解之第201题数字范围按位与

题目&#xff1a; 题解&#xff1a; class Solution { public:int rangeBitwiseAnd(int m, int n) {while (m < n) {// 抹去最右边的 1n n & (n - 1);}return n;} };

序列检测器(Moore型)

目录 描述 输入描述&#xff1a; 输出描述&#xff1a; 参考代码 描述 请用Moore型状态机实现序列“1101”从左至右的不重叠检测。 电路的接口如下图所示。当检测到“1101”&#xff0c;Y输出一个时钟周期的高电平脉冲。 接口电路图如下&#xff1a; 输入描述&#xff1a…

携程任我行有什么用?

眼看一直到十月份都没啥假期了 五一出去玩买了几张携程的卡&#xff0c;想着买景点门票、酒店啥的能有优惠&#xff0c;但最后卡里的钱没用完不说&#xff0c;还有几张压根就没用出去 但是我又不想把卡一直闲置在手里&#xff0c;就怕过期了 最后在收卡云上99.1折出掉了&…

注意力机制在大语言模型中的应用

在大语言模型中&#xff0c;注意力机制&#xff08;Attention Mechanism&#xff09;用于捕获输入序列中不同标记&#xff08;token&#xff09;之间的关系和依赖性。这种机制可以动态地调整每个标记对当前处理任务的重要性&#xff0c;从而提高模型的性能。具体来说&#xff0…

Py之dashscope:dashscope的简介、安装和使用方法、案例应用之详细攻略

Py之dashscope&#xff1a;dashscope的简介、安装和使用方法、案例应用之详细攻略 目录 dashscope的简介 1、产品的主要特点和优势包括&#xff1a; dashscope的安装和使用方法 1、安装 2、使用方法 dashscope的案例应用 1、通义千问-Max&#xff1a;通义千问2.5系列 2…

Ubuntu Nvidia GPU驱动安装和故障排除

去官网 菜单列表下载&#xff0c;或者直接下载驱动 wget https://cn.download.nvidia.com/XFree86/Linux-x86_64/550.54.14/NVIDIA-Linux-x86_64-550.54.14.run 安装驱动 /data/install/NVIDIA-Linux-x86_64-550.54.14.run 执行命令&#xff0c;显示GPU情况 出错处理&…

lodash 中的 isObject 以及 isPlanObject

所以说 用isObject 检测返回true的类型 远不止Object 如果要判断一个值是否为普通对象&#xff0c;可以使用isPlainObject

技术速递|Visual Studio Code 的 .NET MAUI 扩展现已正式发布

作者&#xff1a;Maddy Montaquila 排版&#xff1a;Alan Wang 今天&#xff0c;我们非常高兴地宣布 .NET MAUI VS Code 扩展插件结束了预览阶段&#xff0c;并将包含一些期待已久的新功能 - 包括 XAML IntelliSense 和 Hot Reload&#xff01; 什么是 .NET MAUI 扩展插件&…

密码学及其应用 —— 对称加密技术

1. 对称加密、流加密和块加密 1.1 对称加密 对称加密&#xff08;也称为密钥加密&#xff09;是一种加密方式&#xff0c;其中加密和解密使用相同的密钥。这种加密方法基于二进制层面的操作&#xff0c;如XOR&#xff08;异或&#xff09;、SHIFT&#xff08;位移&#xff09;…

浅谈linux(1)

文章目录 一、linux1.1、使用终端xshell登陆到云服务器上1.2、linux一些常用命令1.2.1、一些快捷键1.2.2、关于目录的操作1.2.3、关于文件的命令1.2.4、关于目录的命令1.2.5、vim 针对文件进行编辑 一、linux linux 操作系统&#xff0c;我使用的是发行版&#xff0c;Centos7。…