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

news2024/12/23 14:31:23

文章目录

  • 从感知机到神经网络
    • 神经网络的例子
    • 复习感知机
    • 激活函数
  • 激活函数
    • 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 1
    else:
        return 0

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

import numpy as np
def step_function(x):
    y = x>0
    return 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, sys

sys.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) + B1
    Z1 = sigmoid(A1)
    # 第一层到第二层
    A2 = np.dot(Z1, W2) + B2
    Z2 = sigmoid(A2)
    # 第二层到输出层
    A3 = np.dot(Z2, W3) + B3
    Y = identity_function(A3)
    return Y


network = 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_sum
    return 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_sum
    return 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.coloradmin.cn/o/1153201.html

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

相关文章

视频剪辑达人教您:如何运用嵌套合并技巧制作固定片尾

在视频剪辑的过程中&#xff0c;嵌套合并技巧是一种非常实用的技术&#xff0c;可以帮助您将多个素材叠加在一起&#xff0c;制作出更加丰富多彩的视频。本文将由视频剪辑达人为您详细介绍如何运用云炫AI智剪嵌套合并技巧制作固定片尾&#xff0c;让您的视频剪辑水平更上一层楼…

场景交易额超40亿,海尔智家三翼鸟开始收获

文 | 螳螂观察 作者 | 余一 随着双十一的到来&#xff0c;国内的消费情绪再次被点燃。在这类大促之下&#xff0c;品牌们就像一个个天体&#xff0c;不断引动着市场潮汐&#xff0c;期待自己能触发更大的“海潮效应”。 所谓“海潮效应”是指&#xff0c;海水因天体的引力而…

总结之数据分析工具cube.js通过Docker部署

cube.js介绍 官网地址&#xff1a;https://cube.dev/ Cube.js是一个开源的模块化框架&#xff0c;用于构建分析web应用程序。它主要用于构建内部业务智能工具或向现有应用程序添加面向客户的分析。 Cube.js设计用于无服务器查询引擎&#xff0c;如AWS Athena和谷歌BigQuery。…

一张动图告诉你,输入网址之后,发生了什么事情?

让我们一步一步地来看这个过程。 步骤1&#xff1a; 用户在浏览器中输入一个URL&#xff08;比如www.bytebytego.com&#xff09;&#xff0c;然后按下回车键。首先&#xff0c;我们需要将这个URL转换成一个IP地址。通常&#xff0c;这个映射关系会被存储在缓存中&#xff0…

【设计模式】第6节:创建型模式之“原型模式”

由于本人现在所使用的语言主要是golang&#xff0c;所以后面的代码主要使用golang编写。语言实现应该不是障碍&#xff0c;主要是理解每种设计模式它的思想。 如果对象的创建成本比较大&#xff0c;而同一个类的不同对象之间差别不大&#xff08;大部分字段都相同&#xff09;…

企业 Tomcat 运维 部署tomcat反向代理集群

一、Tomcat 简介 Tomcat服务器是一个免费的开放源代码的Web应用服务器&#xff0c;属于轻量级应用服务器&#xff0c; Tomcat和Nginx、Apache(httpd)、Web服务器一样&#xff0c;具有处理HTML页面的功能不过Tomcat处理静态HTML的能力不如Nginx/Apache服务器 一个tomcat默认并…

我的ChatGPT的几个使用场景

示例一&#xff0c;工作辅助、写函数代码&#xff1a; 这里展示了一个完整的代码&#xff0c;修正&#xff0c;然后最终输出的过程。GPT具备足够丰富的相关的小型代码生成能力&#xff0c;语法能力也足够好。这类应用场景&#xff0c;在我的GPT使用中&#xff0c;能占到65%以上…

快速入门:使用 Spring Boot 构建 Web 应用程序

前言 本文将讨论以下主题&#xff1a; 安装 Java JDK、Gradle 或 Maven 和 Eclipse 或 IntelliJ IDEA创建一个新的 Spring Boot 项目运行 Spring Boot 应用程序编写一个简单的 Web 应用程序打包应用程序以用于生产环境 通过这些主题&#xff0c;您将能够开始使用 Spring Boo…

使用logback按天生成日志并按等级进行分类

先看效果---->>>> 按照&#xff1a;error、info、warn进行分类&#xff1a; 每个文件里面按日期进行分类&#xff1a; 其中对应的Maven如下&#xff1a; <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven…

微服务框架SpringcloudAlibaba+Nacos集成RabbiMQ

目前公司使用jeepluscloud版本&#xff0c;这个版本没有集成消息队列&#xff0c;这里记录一下&#xff0c;集成的过程&#xff1b;这个框架跟ruoyi的那个微服务版本结构一模一样&#xff0c;所以也可以快速上手。 1.项目结构图&#xff1a; 配置类的东西做成一个公共的模块 …

Java学习 8.方法习题

1.递归求 N 的阶乘的和 思路 循环递归先从1到N相乘&#xff0c;求出每一项的阶乘&#xff0c;在定义变量将它们相加 代码实现 public static int rec(int N){int i1;int sum0;int num1;for(i1;i<N;i){num*i;sumnum;}return sum;} 运行结果 2.递归求和 求12...10 思路 …

react项目入门,创建项目

react项目入门&#xff0c;创建项目 // react-ts项目入门&#xff0c;创建项目 // https://juejin.cn/post/6844904184597184519第零步&#xff0c;检查版本 node -v npm -v 1a69c3036bc3aea6d29d2b66fe46602f.jpg 第一步&#xff0c;新建个文件夹&#xff0c;不能中午命名&a…

AI时代:ChatGPT让程序员插上翅膀

程序员开发新模式&#xff1a;一本专注于帮助程序员在AI时代实现晋级、提高效率的图书。书中介绍了如何使用 ChatGPT 来完成高质量代码编写、文档编写、软件设计等各个环节&#xff0c;并通过实战案例展示了 ChatGPT在实际项目开发中的应用方法。 1.开发新模式&#xff1a;让程…

Linux安装pinpoint监控保姆级安装攻略没有之一

Linux安装pinpoint监控&#xff0c;保姆级安装攻略&#xff0c;没有之一 pinpoint介绍 Pinpoint是一个开源的 APM (Application Performance Management/应用性能管理)工具&#xff0c;用于基于java的大规模分布式系统&#xff0c;基于Google Dapper论文。 架构组成 Pinpoin…

Flask Shell 操作 SQLite

一、前言 这段时间在玩Flask Web&#xff0c;发现用Flask Shell去操作SQLite还是比较方便的。今天简单地介绍一下。 二、SQLite SQLite是一种嵌入式数据库&#xff0c;它的数据库就是一个文件&#xff0c;处理速度快&#xff0c;经常被集成在各种应用程序中&#xff0c;在IO…

5分钟搞定深度学习中间特征可视化

精华置顶 墙裂推荐&#xff01;小白如何1个月系统学习CV核心知识&#xff1a;链接 今天跟大家分享一个可视化CNN/ViT中间特征的库&#xff1a;pytorch-grad-cam 下载地址&#xff1a;https://github.com/jacobgil/pytorch-grad-cam pytorch-grad-cam支持多种可视化方法&#…

接口测试之jmeter基本归结

一、接口测试 二、jmeter脚本开发 三、Jmeter参数化技术

云帆培训考试系统更新说明:v6.9.0

1、增加群组功能 -- 增加群组功能&#xff0c;一个用户可以存在于多个小组中&#xff1b; -- 在线考试、课程学习、活动报名、题库训练、知识竞赛增加群组权限设置&#xff1b; 2、增加线下考试功能 -- 增加线下考试功能&#xff0c;可批量导入线下成绩&#xff0c;管理线下…

Spring Web MVC练习

一&#xff1a;开发程序常见问题 (1)学会定位前后端问题 &#x1f497;通过看日志&#xff0c;查看到底是前端问题还是后端问题 ①前端&#xff1a;F12查看网页的控制台 ②后端&#xff1a;测试后端接口参数&#xff1b;查看IDEA的控制台 (测试后端接口参数&#xff0c;即去访…