深度学习入门——神经网络

news2024/11/25 19:31:14

神经网络

神经网络是一种受到人脑神经系统启发的机器学习模型。它由一系列相互连接的人工神经元组成,这些神经元以层次结构排列。每个神经元接收来自上一层神经元的输入,并根据权重和激活函数对输入进行加权处理,然后将输出传递给下一层神经元。

如下图是一个简单的神经网络,最左边的一列称为输入层,最右边的一列称为输出层,中间的一列称为中间层。

在这里插入图片描述

上述说到根据权重和激活函数对输入进行加权处理,这个过程可以描述成感知机实现的过程。
y = { 0 ( w 1 x 1 + w 2 x 2 + b ⩽ 0 ) 1 ( w 1 x 1 + w 2 x 2 + b > 0 ) y=\left\{\begin{array}{ll} 0 & \left(w_{1} x_{1}+w_{2} x_{2} + b \leqslant 0\right) \\ 1 & \left(w_{1} x_{1}+w_{2} x_{2} + b>0\right) \end{array}\right. y={01(w1x1+w2x2+b0)(w1x1+w2x2+b>0)
如上公式表示的感知机可以通过权重求和与一个函数h(x)实现。如下所示:
x = w 1 x 1 + w 2 x 2 + b x=w_{1}x_{1}+w_{2}x_{2}+b x=w1x1+w2x2+b
y = h ( x ) y=h(x) y=h(x)
h ( x ) = { 0 ( x ≤ 0 ) 1 ( x > 0 ) h(x)=\begin{cases}0(x\le 0) \\1(x> 0) \end{cases} h(x)={0(x0)1(x>0)
图示如下:
在这里插入图片描述

激活函数

阶跃函数

上述的激活函数以阈值为界,一旦输入超过阈值,就切换输出。这样的函数称为“阶跃函数”。

h ( x ) = { 0 ( x ≤ 0 ) 1 ( x > 0 ) h(x)=\begin{cases}0(x\le 0) \\1(x> 0) \end{cases} h(x)={0(x0)1(x>0)

对于阶跃函数的实现如下:

def step_function(x):
    if x>0:
        return 1
    else:
        return 0

上述实现只能接受实数,不允许参数为NumPy数组,支持NumPy数组的实现如下:

def step_function(x):
    y = x > 0
    return y.astype(np.int)

阶跃函数的图形如下

import numpy as np
import matplotlib.pylab as plt

def step_function(x):
    return np.array(x>0, dtype=np.int)

x = np.arange(-5.0, 5.0, 0.1)
y = step_function(x)
plt.plot(x, y)
plt.ylim(-0.1, 1.1)
plt.show()

在这里插入图片描述

sigmoid函数

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 e^{-x} ex的意思

python实现如下:

def sigmoid(x):
    return 1 / (1 + np.exp(-x))

sigmoid图形如下:

import numpy as np
import matplotlib.pylab as plt

def sigmoid(x):
    return 1 / (1 + np.exp(-x))

x = np.arange(-5.0, 5.0, 0.1)
y = sigmoid(x)
plt.plot(x, y)
plt.ylim(-0.1, 1.1)
plt.show()

在这里插入图片描述

两个激活函数的区别:

  • 平滑性不同:sigmoid函数是一条平滑的曲线,输出随着输入发生连续性的变化。而阶跃函数以0为界,输出发生急剧性的变化。sigmoid函数的平滑性对神经网络的学习具有重要意义。
  • 相对于阶跃函数只能返回0或1,sigmoid函数能够返回连续的实数,因此,相比起感知机中神经元之间流动的是0或1的二元信号,而神经网络中流动的是连续的实数值信号。

ReLU函数

ReLU函数在输入大于0时,直接输出该值;在输入小于等于0时,输出0,公式如下:
h ( x ) = { x ( x > 0 ) 0 ( x ≤ 0 ) h(x)=\begin{cases}x(x> 0) \\0(x\le 0) \end{cases} h(x)={x(x>0)0(x0)

python代码实现:

def relu(x):
    return np.maximum(0, x)

ReLU图形如下:

import numpy as np
import matplotlib.pylab as plt

def relu(x):
    return np.maximum(0, x)

x = np.arange(-5.0, 5.0, 0.1)
y = relu(x)
plt.plot(x, y)
plt.ylim(-1, 5.5)
plt.show()

在这里插入图片描述

非线性函数

阶跃函数和sigmoid函数还有其他共同点,就是两者均为非线性函数。sigmoid函数是一条曲线,阶跃函数是一条像阶梯一样的折线,两者都属于非线性的函数。

神经网络的激活函数必须使用非线性函数。因为,线性函数存在一个问题,不管如何加深层数,总是存在与之等效的“无隐藏层的神经网络”。

举一个例子,如果我们考虑把线性函数 h(x) = cx 作为激活函数,把y(x) = h(h(h(x)))的运算对应3层神经网络。这个运算等价于 g ( x ) = c 3 x g(x) = c^{3}x g(x)=c3x作为激活函数的1层神经网络。

3层神经网络前向传播的实现

3层神经网络:输入层(第0层)有2个神经元,第1个隐藏层(第1层)有3个神经元,第2个隐藏层(第2层)有2个神经元,输出层(第3层)有2个神经元。流程如下图:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RM19RQyH-1685372903974)(./3_3.png)]

定义符号 w j k ( i ) w^{(i)}_{jk} wjk(i)为前一层第k个神经元到第i层第j个神经元 a j i a^{i}_{j} aji的权重,如下图:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FFJVQf1d-1685372903975)(./3_4.png)]

代码实现如下:

def identity_function(x):
    return x

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) + b1
    z1 = sigmoid(a1)
    a2 = np.dot(z1, W2) + b2
    z2 = sigmoid(a2)
    a3 = np.dot(z2, W3) + b3
    z3 = identity_function(a3)
    
    return z3

network = init_network()
x = np.array([1.0, 0.5])
y = forward(network, x)
print(y) #[0.31682708 0.69627909]

输出层的设计

神经网络可以用在分类问题和回归问题上,不过需要根据情况改变输出层的激活函数。一般而言,回归问题用恒等函数,分类问题用softmax函数。分类问题是数据属于哪一个类别的问题。。而回归问题是根据某个输入预测一个(连续的)数值的问题。

恒等函数和softmax函数

  • 恒等函数会将输入按原样输出,对于输入的信息,不加以任何改动地直接输出。
  • softmax函数的输出是0.0到1.0之间的实数。并且,softmax函数的输出值的总和是1。所以我们可以把softmax函数的输出解释为“概率”。

分类问题使用的softmax函数可以用下面的公式表示:
y k = e x p ( a k ) ∑ i = 1 n e x p ( a i ) y_k=\frac{exp(a_k)}{\sum_{i=1}^{n}exp(a_i)} yk=i=1nexp(ai)exp(ak)

python实现softmax函数:

def softmax(a):
    exp_a = np.exp(a)
    sum_exp_a = np.sum(exp_a)
    y = exp_a / sum_exp_a
    
    return y

softmax函数注意事项:softmax函数的实现中要进行指数函数的运算,但是此时指数函数的值很容易变得非常大。解决方法:令c为输入参数中的最大值,所有输入参数减去C后再做指数运算,这样等价于分子分母同时除以exp©,所以计算结果不变。改进代码如下:

def softmax(a):
    c = np.max(a)
    exp_a = np.exp(a - c)
    sum_exp_a = np.sum(exp_a)
    y = exp_a / sum_exp_a
    
    return y

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

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

相关文章

【框架源码】Spring源码解析之Bean创建源码流程

问题:Spring中是如何初始化单例bean的? 我们都知道Spring解析xml文件描述成BeanDefinition,解析BeanDefinition最后创建Bean将Bean放入单例池中,那么Spring在创建Bean的这个过程都做了什么。 Spring核心方法refresh()中最最重要…

uniapp小程序订单页面UI

前言 之前用模板写了订单页面,由于需求改了导致这个页面做更新麻烦,弄了一下午,索性全部删除了自己写了,上面的tabs用的是b-ui框架写的,其他的都是原生写法。 🙏如果这篇文章对你有帮助还请收藏点赞关注&…

【计算机视觉】不仅能分割一切简单物体,而且还能高精度分割一切复杂物体的SAM升级版本HQ-SAM来了

文章目录 一、SAM 导读二、SAM 的应用场景2.1 SAM-RBox-生成旋转矩形框2.2 Prompt-Segment-Anything-生成矩形框和掩2.3 Grounded-Segment-Anything-开放数据集检测与分割2.4 segment-anything-video-视频分割2.5 Open-vocabulary-Segment-Anything-开放词典分割2.6 SegDrawer-…

快速入门 Lua 编程

以下是一个简单的 Lua 快速编程教程,帮助你快速入门 Lua 编程。 安装 Lua 首先,你需要安装 Lua。你可以从 Lua 官网(https://www.lua.org/download.html)下载适合你的操作系统的安装包。安装完成后,你可以在命令行中…

CTFHub | 命令注入

0x00 前言 CTFHub 专注网络安全、信息安全、白帽子技术的在线学习,实训平台。提供优质的赛事及学习服务,拥有完善的题目环境及配套 writeup ,降低 CTF 学习入门门槛,快速帮助选手成长,跟随主流比赛潮流。 0x01 题目描述…

记录一次scala项目导入编译失败的问题

文章目录 Scala项目环境问题记录小结 Scala项目环境 Java8 scala-2.11.12 MacBook Apple m2芯片 问题记录 1、scala版本安装 我的本地环境: ➜ ~ java --version openjdk 11.0.18 2023-01-17 OpenJDK Runtime Environment Homebrew (build 11.0.180) OpenJDK 64-…

【Flutter】Flutter 如何实现开屏广告

文章目录 一、前言二、实现开屏广告页面三、实现广告数据的加载四、开屏广告的完整代码五、总结 一、前言 开屏广告这个功能在商业应用中非常常见,它可以在应用启动时向用户展示广告,增加应用的商业价值。 如果你想深入学习 Flutter,掌握更…

BUUCTF 传统知识+古典密码 1

题目描述: 小明某一天收到一封密信,信中写了几个不同的年份 辛卯,癸巳,丙戌,辛未,庚辰,癸酉,己卯,癸巳。 信的背面还写有“甲子”,请解出这段密文。 key值&a…

大学生实习周记总结

大学生实习周记总结1 经过两个月的实习,我收获了很多,也懂得了许多,同时也成熟了不少。下面我将把我两个月的实习生活分成五个部分进行总结:教学经验、班主任工作、做事态度、学生友谊、感恩的心。 教学经验:如何上好一…

使用大型语言模(LLM)构建系统(六):构建端到端系统

今天我学习了DeepLearning.AI的 Building Systems with LLM 的在线课程,我想和大家一起分享一下该门课程的一些主要内容。之前我们已经学习了下面这些知识: 使用大型语言模(LLM)构建系统(一):分类使用大型语言模(LLM)构建系统(二):内容审核、…

如何系统的学习python中的numpy,pandas,matplotlib?太有用了!!!

前言 随着大数据、云计算和人工智能的发展,越来越多的企业需要以数据为基础做出决策。数据分析是处理大量数据的过程,分析数据以识别趋势和模式,并从数据中提取有用的信息来支持业务决策。数据分析可以应用于各种不同的领域,如营…

性能测试如何做?性能测试-稳定性场景设计详细,晋升之路...

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 我们谈到测试设计…

liunx服务器安装kafka

liunx服务器安装kafka 1. 初始化安装环境1.1 安装jdk1.1.1 找到对应的jdk版本1.1.2 下载并安装1.1.2.1 配置jdk环境变量 1.2 安装 zookeeper1.2.1 查找kafka对应zookeeper版本启动 2. 下载kafka 安装包 kafka 3.0.0 之前 (包括3.0.0版本)支持jdk 8 &…

浏览器唤醒本地应用

我们在使用一些应用的时候,需要通过本地浏览器来唤醒本地应用的需求。 就像我们以前使用QQ一样,在网页上点击了某个按钮,会唤醒本地安装的QQ应用。 这里来介绍一下怎么使用自定义协议来唤醒本地的Electron应用(其他框架写的应用同…

汽车电子Autosar之以太网SOME/IP(续)

前言 首先,请问大家几个小小问题,你清楚: 你知道什么是SOME/IP SD吗?SOME/IP-SD有何作用呢?SOME/IP-SD 包含哪些内容呢?SOME/IP-TP 为什么会存在? 今天,我们就来一起探索并回答这…

Mysql数据库表管理和用户管理与授权

一、表结构管理 1. 修改表名 ALTER TABLE 旧表名 RENAME 新表名 2.扩展表结构(增加字段) ALTER TABLE 表名 ADD 字段名 数据类型; 3.修改字段名,添加唯一健 change ALTER TABLE 表名 CHANGE 旧字段名 新字段名 [数据类型] [约束]; 4.删除字段…

Linux 多路转接 —— select

目录 传统艺能😎select😍fd_set 结构😒timeval 结构🤣 socket 就绪条件😁读条件🤣写就绪😍异常就绪😒 select 工作流程😘select 服务器实现😂socket 类&#…

极致呈现系列之:Echarts饼图的千变万化

目录 创建一个最简单的饼图美化饼图修改颜色修改饼图的边框线条样式修改饼图的标签样式添加饼图的阴影效果添加修改饼图的图例样式 添加交互饼图的变化环形图动画装饰仪表盘 创建一个最简单的饼图 这个没什么好说的,懂的都懂,直接上代码 //安装 Echart…

LlamaIndex 简介:LLM 应用程序的数据框架

LlamaIndex 是一个非凡的工具,创建为一个全面的“数据框架”,以促进 LLM(大型语言模型)应用程序的开发。该框架与 ChatGPT 集成,充当大型语言模型和用户私人数据之间的桥梁。 借助 LlamaIndex,用户可以轻松…

Apache Zeppelin系列教程第九篇——Zeppelin NoteBook数据缓存

背景 在使用Zeppelin JDBC Intercepter 对于Hive 数据进行查询过程中,如果遇到非常复杂的sql,查询效率是非常慢 比如: select dt,count(*) from table group by dt做过数据开发的同学都知道,在hive sql查询过程中,hive…