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

文章目录

  • 从感知机到神经网络
    • 神经网络的例子
    • 复习感知机
    • 激活函数
  • 激活函数
    • 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.mzph.cn/news/126668.shtml

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

相关文章

【51单片机】LED与独立按键(学习笔记)

一、点亮一个LED 1、LED介绍 LED&#xff1a;发光二极管 补&#xff1a;电阻读数 102 > 10 00 1k 473 > 47 000 2、Keil的使用 1、新建工程&#xff1a;Project > New Project Ctrl Shift N &#xff1a;新建文件夹 2、选型号&#xff1a;Atmel-AT89C52 3、xxx…

uniapp原生插件之视频图片选择安卓原生插件

插件介绍 本地相册图片和视频多选Android扩展原生插件 插件地址 视频图片选择安卓原生插件 - DCloud 插件市场 超级福利 uniapp 插件购买超级福利 插件申请权限 存储卡读写权限 manifest.json权限列表 /* android打包配置 */"android" : {"permission…

Mozilla Firefox 119 现已可供下载

Mozilla Firefox 119 开源网络浏览器现在可以下载了&#xff0c;是时候先看看它的新功能和改进了。 Firefox 119 改进了 Firefox View 功能&#xff0c;现在可以提供更多内容&#xff0c;如最近关闭的标签页和浏览历史&#xff0c;你可以按日期或网站排序&#xff0c;还支持查…

spring 和 idea 建议不要使用 @Autowired注解

spring 和 idea 建议不要使用 Autowired注解 一. 问题描述二. 警告原因和如何去除三. 个人的收获和解决方案3. 1 个人感受3.2 通过构造函数解决警告问题 四. 小知识4.1 使用Autowired还会出现循环依赖的问题么4.2 Autowired 和 Resource区别 前言 这是我在这个网站整理的笔记,有…

vivo 自研蓝河操作系统 BlueOS 发布:支持大模型、BlueXlink 协议实现万物互联

大家好&#xff0c;我是 Lorin , 2023 年 11 月 1 日&#xff0c;在今天的 2023 年 vivo 开发者大会上&#xff0c;vivo 自主研发的蓝河操作系统&#xff08;BlueOS&#xff09;正式亮相。这款操作系统被宣传为一款面向未来的智能操作系统&#xff0c;具备出色的支持能力&#…

PlantSimulation访问本地Excel文件的方法

PlantSimulation访问本地Excel文件的方法 PlantSimulation访问本地Excel文件的方法PlantSimulation访问本地Excel文件的方法 //Param StatusTable,T_DataTable:object var T_DataTable:object:=DataTable IF NOT isComputerAccessPermittedMESSageBox("计算机访问被阻止,…

maven:编译出现Process terminated解决方法(超全)

maven:编译出现Process terminated解决方法&#xff08;超全&#xff09; 一. 情况一&#xff1a;配置文件 settings. xml 出错&#xff08;解决方法1&#xff09;1.1 项目编译报错如下&#xff1a;1.2 点击【项目名】提示找到出错文件1.3 点击查看出错文件1.4 原因及解决办法 …

C++并发与多线程(11) | unique_lock Ⅱ

一、unique_lock的成员函数 1.1 lock() 一起验证defer_lock的效果,修改成员函数如下: // 收集数据的函数void inMsgRecvQueue(){for (int i = 0; i < 10000; ++i){std::unique_lock<std::mutex> sbguard1(my_mutex1, std::defer_lock);//没有加锁的my_mutex1sbgua…

大模型推理最新论文及源码合集,涵盖多模态推理、逻辑推理、数学推理

大模型推理技术的发展帮我们解决了许多的难题&#xff0c;但如今的大模型在复杂推理上的表现仍然欠佳&#xff0c;为了突破这一瓶颈&#xff0c;研究者们提出了许多创新性的方法。 我整理了其中一部分个人认为很值得学习的论文来和大家分享&#xff0c;涵盖多模态推理、逻辑推…

Agent 应用于提示工程

如果Agent模仿了人类在现实世界中的操作方式&#xff0c;那么&#xff0c;能否应用于提示工程即Prompt Engingeering 呢&#xff1f; 从LLM到Prompt Engineering 大型语言模型(LLM)是一种基于Transformer的模型&#xff0c;已经在一个巨大的语料库或文本数据集上进行了训练&…

品牌加盟商做信息展示预约小程序的效果如何

很多行业都有中部或头部品牌&#xff0c;对实体品牌企业来说想要快速高效发展&#xff0c;除了多地直营店外还需要招募加盟商进而提升生意营收。 因此线上渠道变得尤为重要&#xff0c;除了网站外&#xff0c;小程序是连接多平台生态很好的工具&#xff0c;随时打开、直接触达…

python hashlib模块及实例

hashlib 模块密码加密密码撞库密码加盐 一&#xff0c;hashlib模块 hashlib模块是用来为字符串进行加密的模块&#xff0c;通过该作用就可以为用户的密码进行加密。 通过模块中的hash算法可以为任意长度的字符串加密成长度相同的一串hash值。该hash算法得到的hash值有一下几个…

HNU-数据库系统-讨论课1

第一次小班讨论课安排如下: 主题: 大数据管理及前沿技术讨论 目的&#xff1a;让学生了解大数据管理的相关理论、技术和系统。 内容: &#xff08;1&#xff09;大数据概念、应用、技术的相关知识。 &#xff08;2&#xff09;AI4DB &#xff08;3&#xff09;DB4AI &…

vue中electron与vue通信(fs.existsSync is not a function解决方案)

electron向vue发送消息 dist/main.js (整个文件配置在另一条博客里) win new BrowserWindow({width:1920,height:1080,webPreferences: {// 是否启用Node integrationnodeIntegration: true, // Electron 5.0.0 版本之后它将被默认false// 是否在独立 JavaScript 环境中运行…

【强化学习】13 —— Actor-Critic 算法

文章目录 REINFORCE 存在的问题Actor-CriticA2C&#xff1a; Advantageous Actor-Critic代码实践结果 参考 REINFORCE 存在的问题 基于片段式数据的任务 通常情况下&#xff0c;任务需要有终止状态&#xff0c;REINFORCE才能直接计算累计折扣奖励 低数据利用效率 实际中&#…

react条件渲染

目录 前言 1. 使用if语句 2. 使用三元表达式 3. 使用逻辑与操作符 列表渲染 最佳实践和注意事项 1. 使用合适的条件判断 2. 提取重复的逻辑 3. 使用适当的key属性 总结 前言 在React中&#xff0c;条件渲染指的是根据某个条件来决定是否渲染特定的组件或元素。这在构…

KanTts最小安装-ubuntu

为什么选它&#xff1f; 克隆有很多&#xff0c;为什么选它&#xff0c;它是中国人做的&#xff0c;阿里达摩院&#xff0c;5分钟音频数据集就够了。 国内做的有什么好处&#xff0c;因为大家都是中国人&#xff0c;说的是中国话&#xff0c;技术最大的难题不是基础&#xff…

2023年【道路运输企业主要负责人】考试技巧及道路运输企业主要负责人复审模拟考试

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2023年【道路运输企业主要负责人】考试技巧及道路运输企业主要负责人复审模拟考试&#xff0c;包含道路运输企业主要负责人考试技巧答案和解析及道路运输企业主要负责人复审模拟考试练习。安全生产模拟考试一点通结合…

前端JavaScript

文章目录 一、JavaScript概述JS简介1.ECMAScript和JavaScript的关系2.ECMAScript的历史3.什么是javas&#xff1f;4.JavaScript的作用&#xff1f; 三者之间的作用JS基础1.注释语法2.引入js的多种方式3.结束符号 变量与常量变量1.JavaScript声明2.var与let的区别常量 基本数据类…

Vue进阶(幺陆肆)Apache的Access.log分析总结

文章目录 一、前言二、常用指令 一、前言 前端项目排错阶段&#xff0c;可借助apache的Access.log进行请求日志查看。 二、常用指令 #查看80端口的tcp连接 #netstat -tan | grep "ESTABLISHED" | grep ":80" | wc -l #当前WEB服务器中联接次数最多的ip地…