深度学习入门(二)之神经网络

文章目录

  • 从感知机到神经网络
    • 神经网络的例子
    • 复习感知机
    • 激活函数
  • 激活函数
    • sigmoid函数
    • 阶跃函数的实现
    • 阶跃函数的图形
    • sigmoid函数的图形
    • sigmoid函数与阶跃函数比较
    • 非线性函数
    • ReLU函数
  • 多维数组的运算
    • 多维数组
    • 矩阵乘法
    • 神经网络的内积
  • 三层神经网络的实现
    • 符号确认
    • 各层间信号传递的实现
    • 代码总结
  • 输出层的设计
    • 恒等函数和softmax函数
    • 实现softmax函数注意事项
    • softmax函数特征
    • 输出层的神经元数量

从感知机到神经网络

在感知机中,参数的值需要我们人工去设置,神经网络的出现就是解决这一问题,具体的讲,神经网络的一个重要性质就是它可以自动地从数据中学习到合适的权重参数

神经网络的例子

最左边称为输入层,最右边为输出层,中间称为中间层或者隐藏层。隐藏层的神经元肉眼看不到。

从输入层到输出层以此称为第0层,第1层……

在这里插入图片描述

图中由3层神经元组成,但是实际上只有两层神经元有权重,因此称为2层网络,神经网络的形状类似与感知机。

复习感知机

感知机接收x1和x2两个输入信号,输出y。

在这里插入图片描述

y = { 0 , ( b + w 1 x 1 + w 2 x 2 ) ≤ 0 1 , ( b + w 1 x 1 + w 2 x 2 ) > 0 y=\begin{cases} 0,(b+w1x1+w2x2)\leq0\\ 1, (b+w1x1+w2x2)\gt0\end{cases} y={0(b+w1x1+w2x2)01(b+w1x1+w2x2)>0
b称为偏置,用于控制神经元被激活的容易程度。

wi表示每个信号的权重的参数,用于控制各个信号的重要性。

将上面公式改写为更加简洁的形式。用一个新的函数来表示这种分情况的动作,引入h(x)
y = h ( b + w 1 x 1 + w 2 x 2 ) y=h(b+w1x1+w2x2) y=h(b+w1x1+w2x2)

h ( x ) = { 0 , x ≤ 0 1 , x > 0 h(x)=\begin{cases} 0,x\leq0\\ 1, x\gt0\end{cases} h(x)={0x01x>0
输入信号的综合会被函数h(x)转换,转化后的值就是y,其实改写之后的函数和之前的函数做的是相同的事情。

在这里插入图片描述

激活函数

h(x)函数会将输入信号的总和转化为输出信号,这种函数一般称为激活函数,**激活函数的作用在于如何激活输入信号的总和。**进一步改写公式
a = b + w 1 x 1 + w 2 x 2 a = b+w1x1+w2x2 a=b+w1x1+w2x2

y = h ( a ) y=h(a) y=h(a)

分两个阶段处理,先计算输入信号的加权总和,然后用激活函数转化这一总和输出y

在这里插入图片描述

  • a表示输入信号的总和
  • h()表示激活函数
  • y表示输出

激活函数就是连接感知机和神经网络的桥梁!!!

激活函数

h ( x ) = { 0 , x ≤ 0 1 , x > 0 h(x)=\begin{cases} 0,x\leq0\\ 1, x\gt0\end{cases} h(x)={0x01x>0

上式表示的激活函数以阈值为界,一旦输入超越阈值,就会切换输出,也可以叫做阶跃函数。因此感知机中使用了阶跃函数作为激活函数。在激活函数的众多候选函数中,感知机使用了阶跃函数。那么感知机使用其他函数作为激活函数的话,就可以进入神经网络的世界了。

sigmoid函数

h ( x ) = 1 1 + e x p ( − x ) h(x)= \frac{1}{1+exp(-x)} h(x)=1+exp(x)1

exp(-x)表示e-x的意思,神经网络中用sigmoid函数作为激活函数,进行信号的转化,转化后的信号被传送给下一个神经元,感知机和神经网络的主要区别就是在于这个激活函数

阶跃函数的实现

当输入超过0时,输出1,否则小于1

import numpy as np
def step_function1(x):if x>0:return 1else:return 0

但是这种写法x只能接收实数,不支持numpy数组,修改为支持numpy的格式

import numpy as np
def step_function(x):y = x>0return y.astype(np.int64) # 将布尔类型转化为int型
x=np.array([-1.0,2.0,1.0])
print(step_function(x))

上述代码对numpy数组使用了不等号运算

在这里插入图片描述

阶跃函数的图形

import numpy as np
import matplotlib.pylab as plb
def step_function(x):return np.array(x>0,dtype=np.int64)
x=np.arange(-5.0,5.0,0.1)
y=step_function(x)
plb.plot(x,y)
plb.ylim(-0.1,1.1) # 指定y轴的范围
plb.show()

**x=np.arange(-5.0,5.0,0.1)**表示在-5.0到5.0的范围内,以0.1为单位,生成numpy数组[-0.5,-4.9,……,4.9]。

在这里插入图片描述

sigmoid函数的图形

import numpy as np
import matplotlib.pylab as plb
def step_function(x):return 1/(1+np.exp(-x))
x=np.arange(-5.0,5.0,0.1)
y=step_function(x)
plb.plot(x,y)
plb.ylim(-0.1,1.1)
plb.show()

在sigmoid函数中之所以支持numpy函数,是因为numpy数组具有广播功能,标量和numpy数组进行运算时,标量会和numpy数组中的各个元素进行运算

在这里插入图片描述

sigmoid函数与阶跃函数比较

不同

  • 二者图形的平滑性不同,sigmoid函数是一条平滑的曲线,输出随着输入发生连续性的变化。而阶跃函数以0为界,输出发生急剧性的变化。sigmoid函数的平滑性对神经网络的学习具有重要意义

  • 阶跃函数只能返回0或1,sigmoid函数可以返回0.731……,0.880……等实数。也即是感知机中神经元之间流动的是0或者1,而神经网络中流动的是连续的实数值

共同

  • 虽然在平滑性上有差异,但是从宏观角度来说二者具有相似的形状,输入信号重要时,输出值较大,否则输出就越小
  • 二者都为非线性函数

非线性函数

神经网络的激活函数必须使用非线性函数

线性函数的问题在于不管加深层数,总是存在与之等效的“无隐藏层的神经网络

比如线性函数h(x)=cx作为激活函数,y=h(h(h(x)))的运算对应三层神经网络,这个运算就等于c * c * c * x的乘法运算,再次化简为a* x ,表示为没有隐藏层的神经网络。

ReLU函数

sigmoid函数在很早就开始使用了,而最近主要使用ReLU函数
h ( x ) = { 0 , x ≤ 0 x , x > 0 h(x)=\begin{cases} 0,x\leq0\\ x, x\gt0\end{cases} h(x)={0x0xx>0
在输入>0时,直接输出该值,在输入<=0时,输出0

import numpy as np
import matplotlib.pylab as  plb
def ReLU_function(x):return np.maximum(x,0)
x=np.arange(-5.0,5.0,0.1)
y=ReLU_function(x)
plb.plot(x,y)
plb.ylim(-0.1,5.0)
plb.show()

这里使用了numpy的maximum函数,maximum函数会从输入的数值中选择较大的值输出

在这里插入图片描述

多维数组的运算

多维数组

多维类似与线性代数里的矩阵,使用numpy数组生成多维数组。

import numpy as np
a = np.array([1,2,3,4])
b = np.array([[1,2],[3,4],[5,6]])
print("a的维度=",a.ndim)  # 维度
print("a的形状",a.shape) # 形状
print("b的维度=",b.ndim)  # 维度
print("b的形状",b.shape) # 形状a的维度= 1
a的形状 (4,)
b的维度= 2
b的形状 (3, 2)

数组的维数可以通过np.dim()函数获得。

数组的形状可以通过np.shape()函数获得。

在上面代码中,a是一维数组,由4个元素组成,a.shape的结果是个元组,这是因为一维数组的情况也要返回与多维数组一致的结果。

b数组为3 x 2的矩阵,表示第一维度有3个元素,第二维度有2个元素

二维数组也成为矩阵

矩阵乘法

import numpy as np
A = np.array([[1,2],[3,4],[5,6]])
"""
[[1 2][3 4][5 6]]"""
B = np.array([1,1])
"""[1 1]"""
print(np.dot(A,B))
"""[ 3  7 11]"""

这里数组B可以转化为1 x 2或者2 x 1的形式,为了计算的适应

在这里插入图片描述

import numpy as np
A = np.array([[1,2],[3,4],[5,6]])
print(A)
B = np.array([[1,1],[2,3],[1,2]])
print(B)
print(np.dot(A,B))Traceback (most recent call last):File "D:\pythonProject\pythonStudy\多维数组的运算\矩阵的乘法.py", line 6, in <module>print(np.dot(A,B))
ValueError: shapes (3,2) and (3,2) not aligned: 2 (dim 1) != 3 (dim 0)

对应维度不一致报错

神经网络的内积

在下图中是一个除去激活函数和偏置参数的神经网络

在这里插入图片描述

输出求和公式 y = x 1 ∗ w 1 + x 2 ∗ w 2 和矩阵内积类似, 将这种简单化为矩阵相乘的方式 输出求和公式y = x1*w1+x2*w2和矩阵内积类似,\\ 将这种简单化为矩阵相乘的方式 输出求和公式y=x1w1+x2w2和矩阵内积类似,将这种简单化为矩阵相乘的方式
X W = y

(x1,x2) 在这里插入图片描述
(x1 * 1 + x22,x1 * 3 + x24,x1 * 5 + x2*6)

import numpy as np
X = np.array([4,5])
W = np.array([[1,3,5],[2,4,6]])
print(np.dot(X,W))

三层神经网络的实现

三层神经网络:输入层有两个神经元,第1个隐藏层有3个神经元,第2个隐藏层有2个神经元,输出层有两个神经元

在这里插入图片描述

符号确认

在这里插入图片描述

图中突出显示了从输入层神经元X2到第一隐藏层a1的权重。

权重和隐藏层的神经元右上角有一个(1),表示第一层的权重和第一层神经元。此外右下角有两个数字,是后一层的神经元和前一层的神经元的索引号

各层间信号传递的实现

在这里插入图片描述

在这里插入图片描述

使用矩阵的运算,改写为另一种形式。

在这里插入图片描述

在这里插入图片描述

import numpy as np
X=np.array([0.12,0.24])
W1=np.array([[1,2,3],[2,3,4]
])
B1=np.array([0.1,0.2,0.3])
A1=np.dot(X,W1)+B1
Z1=sigmoid(A1)
print(Z1) #[0.66818777 0.76133271 0.83479513]

隐藏层的加权和用a来表示,被激活函数sigmoid函数转换后的信号用z来表示。

在这里插入图片描述

上图为输入层到第1层的信号传递,接下来实现第1层到第2层

B2=np.array([0.1,0.2,0.3])
W2=np.array([[1,2],[2,3],[1,2]
])
A2=np.dot(Z1,W2)+B2
Z2 = sigmoid(A2)

在这里插入图片描述

最后是第2层到输出层的函数

B3=np.array([0.1,0.2])
W3 =  np.array([[1,2],[2,3],
])A3=np.dot(Z2,W3)+B3
Y = identity_function(A3)

最后输出层使用了identity_function恒等函数,恒等函数会将输入按照原样输出

代码总结

import os, syssys.path.append(os.pardir)
import numpy as np
from common.functions import sigmoid, identity_function# 权重和偏置的初始化
def init_network():network = {}network['W1'] = np.array([[0.1, 0.3, 0.5], [0.2, 0.4, 0.6]])network['B1'] = np.array([0.1, 0.2, 0.3])network['W2'] = np.array([[0.1, 0.4], [0.2, 0.5], [0.3, 0.6]])network['B2'] = np.array([0.1, 0.2])network['W3'] = np.array([[0.1, 0.3], [0.2, 0.4]])network['B3'] = np.array([0.1, 0.2])return network#从输入层到输出层信号的转化
def forward(network, x):W1, W2, W3 = network['W1'], network['W2'], network['W3']B1, B2, B3 = network['B1'], network['B2'], network['B3']# 输入层到第一层A1 = np.dot(x, W1) + B1Z1 = sigmoid(A1)# 第一层到第二层A2 = np.dot(Z1, W2) + B2Z2 = sigmoid(A2)# 第二层到输出层A3 = np.dot(Z2, W3) + B3Y = identity_function(A3)return Ynetwork = init_network()
x = np.array([1.0, 0.5])
y = forward(network, x)
print(y)

输出层的设计

神经网络可以用在分类问题和回归问题上,需要根据实际情况改变输出层的函数,一般回归问题用恒等函数,分类问题使用softmax函数

机器学习的问题大致分为回归问题和分类问题

回归问题:比如根据一个人的图像能够预测这个人的体重的问题

分类问题:区分图像中的人是男性还是女性

恒等函数和softmax函数

恒等函数

会将输入按原样输出,对输入的信息不加任何改动直接输出

def identity_function(x):return x

softmax函数

计算第K个神经元的输出yk ,分子是输入信号ak的指数,分母是所有输入信号的指数和
y = e a k ∑ i = 1 n e a i y=\frac {e^{a_k}}{\sum_{i=1}^{n}{e^{a_i}}} y=i=1neaieak

def softmax(x):exp_a = np.exp(x)exp_sum = np.sum(np.exp(x))y = exp_a / exp_sumreturn y

实现softmax函数注意事项

缺陷就是溢出问题,再函数中要进行指数运算,在超大值进行除法运算时会出现指数运算,结果会出现不确定情况

因为在计算机处理数时,数值必须在4字节或者8字节的有限数据宽度内,意味着存在有效位数,数值范围时有效的,因此会出现超大值无法表示的问题

softmax函数可以进行改进

在这里插入图片描述

这里的C/一般会使用输入信号的最大值

def softmax(x):C=np.max(x)exp_a = np.exp(x-C)exp_sum = np.sum(np.exp(x-C))y = exp_a / exp_sumreturn y
x = np.array([0.3,2.9,4.0])
print(softmax(x)) #[0.01821127 0.24519181 0.73659691]

softmax函数特征

输出是0.0到1.0之间的实数,并且函数的输出值总和为1,因此把softmax函数的输出解释为概率。并且x的各元素大小关系和y的各元素大小关系并没有改变,比如x的最大值为第2个元素,y的最大值也为第2个元素。神经网络只把输出值最大的神经元所对应的类别作为识别结果,即便使用softmax函数,输出值最大的神经元位置也不会改变,在实际问题中,输出层的softmax函数一般会省略

输出层的神经元数量

输出神经元数量需要根据待解决问题来决定,比如某个输入图像,预测是图中数字0~9的哪一个问题,可以将神经元设定为10个

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

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

相关文章

10kb的WordPress外链页面安全跳转插件

老白博客我参照csdn和腾讯云的外链跳转页面&#xff0c;写了一个WordPress外链安全跳转插件&#xff1a;给网站所有第三方链接添加nofollow标签和重定向功能&#xff0c;提高网站安全性。插件包括两个样式&#xff0c;由于涉及到的css不太一样&#xff0c;所以分别写了两个版本…

高效处理异常值的算法:One-class SVM模型的自动化方案

一、引言 数据清洗和异常值处理在数据分析和机器学习任务中扮演着关键的角色。清洗数据可以提高数据质量&#xff0c;消除噪声和错误&#xff0c;从而确保后续分析和建模的准确性和可靠性。而异常值则可能对数据分析结果产生严重影响&#xff0c;导致误导性的结论和决策。因此&…

纪念基于JavaScript 实现的后台桌面 UI 设计

目录 前言 C/S 到 B/S ASP Builder 的诞生 关于 Craneoffice.net 开发环境配置 后台界面的 UI 区域要素 桌面系统的想法和设计 搜索引擎 导航面板 快捷访问 二级导航 小组件及其它 设置桌面壁纸 小时钟 附件小程序 计算器界面设计 日历与任务 系统设置 天气小…

【HeidiSql_01】python在heidisql当中创建新表的注意事项

python在heidisql当中创建新表的注意事项 假设你已经在python当中弄好了所有的结果&#xff0c;并且保存在df_all这个dataframe当中&#xff0c;然后要将其导入数据库当中并创建一张新的表进行保存。 # 构建数据库连接,将merged_df写回数据库 from sqlalchemy import create_e…

进口跨境商城源码:高效、安全、可扩展的电商平台解决方案

电子商务的兴起为跨境贸易提供了前所未有的机会和挑战。在这个全球化的时代&#xff0c;跨境电商平台成为许多企业进军国际市场的首选。然而&#xff0c;搭建一个高效、安全、可扩展的进口跨境商城并非易事。 1. 解决方案概述 我们推出的 "进口跨境商城源码" 提供了一…

小程序商城免费搭建之java商城 电子商务Spring Cloud+Spring Boot+二次开发+mybatis+MQ+VR全景+b2b2c

1. 涉及平台 平台管理、商家端&#xff08;PC端、手机端&#xff09;、买家平台&#xff08;H5/公众号、小程序、APP端&#xff08;IOS/Android&#xff09;、微服务平台&#xff08;业务服务&#xff09; 2. 核心架构 Spring Cloud、Spring Boot、Mybatis、Redis 3. 前端框架…

uniapp @click点击事件在新版chrome浏览器点击没反应

问题描述 做项目时&#xff0c;有一个弹出选择的组件&#xff0c;怎么点都不出来&#xff0c;最开始还以为是业务逻辑限制了不能点击。后来才发现别人的电脑可以点出来&#xff0c;老版本的浏览器也可以点出来&#xff0c;最后定位到是新版的chrome就不行了 这是我的浏览器版本…

【C++的OpenCV】第十四课-OpenCV基础强化(三):单通道Mat元素的访问之data和step属性

&#x1f389;&#x1f389;&#x1f389; 欢迎来到小白 p i a o 的学习空间&#xff01; \color{red}{欢迎来到小白piao的学习空间&#xff01;} 欢迎来到小白piao的学习空间&#xff01;&#x1f389;&#x1f389;&#x1f389; &#x1f496; C\Python所有的入门技术皆在 我…

STM32F407的系统定时器

文章目录 系统定时器SysTick滴答定时器寄存器STK_CTRL 控制寄存器STK_LOAD 重载寄存器STK_VAL 当前值寄存器STK_CALRB 校准值寄存器 初始化 Systick 定时器SysTick_InitSysTick_CLKSourceConfig delay_us寄存器delay_us库函数delay_xms短时delay_ms长时SysTick_Config 系统定时…

HTML和CSS的基础-前端扫盲

想要写出一个网页&#xff0c;就需要学习前端开发&#xff08;写网页代码&#xff09;和后端开发&#xff08;服务器代码&#xff09;。 对于前端的要求&#xff0c;我们不需要了解很深&#xff0c;仅仅需要做到扫盲的程度就可以了。 写前端&#xff0c;主要用到的有&#xf…

〔001〕虚幻 UE5 发送 get、post 请求、读取 json 文件

✨ 目录 🎈 安装 varest 扩展🎈 开启 varest 扩展🎈 发送 get 请求🎈 发送 post 请求🎈 读取 json 文件🎈 安装 varest 扩展 打开 虚幻商城,搜索 varest 关键字进行检索, varest 是一个 api 调用插件,支持 http/https 请求,也支持 json 文件的读取,最关键是该…

JavaScript

一. JavaScript概述 1. ECMAScript和JavaScript的关系 1996年11月&#xff0c;JavaScript的创造者--Netscape公司&#xff0c;决定将JavaScript提交给国际标准化组织ECMA&#xff0c;希望这门语言能够成为国际标准。次年&#xff0c;ECMA发布262号标准文件&#xff08;ECMA-26…

水库大坝可视化智能远程监管方案,助力安全监测智能巡检

一、背景需求 水库大坝作为防洪度汛的重要设施&#xff0c;其安全问题直接关系到人民群众的生命财产安全。因此&#xff0c;必须加强对大坝水库的安全管理&#xff0c;对水库除险加固和运行管护要消除存量隐患&#xff0c;实现常态化管理&#xff0c;同时要配套完善重点小型水…

在Linux上编译gdal3.1.2指南

作者:朱金灿 来源:clever101的专栏 为什么大多数人学不会人工智能编程?>>> 以Ubuntu 18编译gdal3.1.2为例,编译gdal3.1.2需要先编译proj库和geos库(可选)。我选择的proj库版本为proj-7.1.0,编译proj-7.1.0需要先编译tiff库和sqlite3。我选择的sqlite3的版本为…

高性能消息中间件 - Kafka3.x(三)

文章目录 高性能消息中间件 - Kafka3.x&#xff08;三&#xff09;Kafka Broker ⭐Kafka Broker概念Zookeeper&#xff08;新版本可以不使用zk了&#xff09;⭐Zookeeper的作用 Kafka的选举1&#xff1a;Broker选举Leader⭐Broker核心参数⭐案例&#xff1a;服役新节点和退役旧…

SaaS可配置性设计要点

1 引言 考虑到系统SaaS需求&#xff0c;就成熟的SaaS应用而言&#xff0c;元数据服务是为用户提供定制和配置应用、满足其特定需求的主要手段。 可配置能力主要反映在这4个方面&#xff1a;1 程序外观&#xff1b;2 工作流程与业务规则&#xff1b;3 数据模型&#xff1b…

微信便利签怎么弄?微信中有便捷操作的便签小程序吗

微信在日常办公及生活中比较重要的作用就是&#xff1a;聊天、视频会议、语音会议等&#xff0c;这是大家认知中的微信。除了这些功能以外&#xff0c;微信中还有很多小程序&#xff0c;小程序也能够辅助大家日常的办公。 比如&#xff0c;工作中我们需要制定工作计划&#xf…

vscode开启emmet语法

需要在setting.json中添加配置 首先进入设置&#xff0c;然后点击右上角 Vue项目添加如下配置 "emmet.syntaxProfiles": { "vue-html": "html", "vue": "html" },React项目添加如下配置 "emmet.includeLanguages&quo…

一体化模型图像去雨+图像去噪+图像去模糊(图像处理-图像复原-代码+部署运行教程)

本文主要讲述了一体化模型进行去噪、去雨、去模糊&#xff0c;也就是说&#xff0c;一个模型就可以完成上述三个任务。实现了良好的图像复原功能&#xff01; 先来看一下美女复原.jpg 具体的&#xff1a; 在图像恢复任务中&#xff0c;需要在恢复图像的过程中保持空间细节…

transformers-Generation with LLMs

https://huggingface.co/docs/transformers/main/en/llm_tutorialhttps://huggingface.co/docs/transformers/main/en/llm_tutorial停止条件是由模型决定的&#xff0c;模型应该能够学习何时输出一个序列结束&#xff08;EOS&#xff09;标记。如果不是这种情况&#xff0c;则在…