01神经网络的理论及实现

感知机的缺点就是需要设置合适的权重,而权重的设置都是人工操作的。

1、从感知机到神经网络

重新画出感知机的模型,在图上加上偏置,由于偏置始终为1,所以颜色加深。

图1-1 感知机模型

  引入新函数(激活函数):

h(x)=\left\{\begin{matrix} 0 (x\leqslant 0)\\ 1(x>0) \end{matrix}\right.                                                        (1-1)

将感知机表达式改为:

y=h(b+w_{1}x_{1}+w_{2}x_{2})                                                (1-2)

也可以分开写为:

a=b+w_{1}x_{1}+w_{2}x_{2}                                                  (1-3)

y=h(a)                                                             (1-4)

根据公式(1-3)和(1-4)可以将图1-1更改为图1-2模型。

图1-2 加入激活函数的感知机图

2、激活函数

激活函数会将输入信号的总和转换为输出信号。

激活函数如果使用阶跃函数,就是感知机。

如果使用其它激活函数,就是神经网络。

2.1 阶跃函数

公式(1-1)就是阶跃函数。

实现代码:

import numpy as np
import matplotlib.pylab as pltdef step_function(x):return np.array(x>0,dtype=int)x=np.arange(-5,5,0.1)
y=step_function(x)
plt.plot(x,y)
plt.ylim(-0.1,1.1)
plt.show()

运行结果:

原来的程序运行出错:

AttributeError: module 'numpy' has no attribute 'int'

解决办法:是因为版本的问题,将dtype=np.int更改为dtype=int即可。

2.2 sigmoid函数

   Sigmoid型函数是一类S型曲线函数,为两端饱和函数,常见的有Logistic函数和Tanh函数。

饱和:

      对于函数f(x),若x \to -\infty时,导数\frac{\mathrm{d} f(x)}{\mathrm{d} x}n \to 0,称为左饱和,当x \to +\infty时,导数\frac{\mathrm{d} f(x)}{\mathrm{d} x} \to 0,称为右饱和。两个都满足的情况下称为两端饱和。

2.2.1 Logistic函数

表达式:

h(x)=\frac{1}{1+e^{-x}}                                                                   (1-5)

实现代码:

def sigmoid(x):return 1/(1+np.exp(-x))x=np.arange(-5,5,0.1)
y=sigmoid(x)
plt.plot(x,y)
plt.ylim(-0.1,1.1)
plt.show()

输出:

2.2.2 Tanh函数

表达式:

tanh(x)=\frac{e^{x}-e^{-x}}{e^{x}+e^{-x}}                                                       (1-6)

实现代码:

def tanh(x):return (np.exp(x)-np.exp(-x))/(np.exp(x)+np.exp(-x))x=np.arange(-5,5,0.1)
y1=tanh(x)
plt.plot(x,y1)
plt.ylim(-1.1,1.1)plt.show()

输出:

Tanh函数的输出是零中心化的,而Logistic函数的输出恒大于0。非中心化的输出会使得其后一层的神经元的输入发生偏置偏移,并进一步使得梯度下降的收敛速度变慢

2.3 ReLU函数

ReLU(Rectified Linear Unit)函数,表达式为:

h(x)=\left\{\begin{matrix} x (x>0)\\ 0 (x\leqslant 0) \end{matrix}\right.                                                       (1-7)

实现代码:

def relu(x):return np.maximum(0,x)x=np.arange(-6,6,0.1)
y=relu(x)
plt.plot(x,y)
plt.ylim(-1,5)
plt.show()

输出:

优点:

1、只需要进行加、乘和比较的操作,计算更高效。

2、具有很好的稀疏性,大约50%的神经元处于激活状态。

3、具有左饱和函数,在一定程度上缓解了梯度消失问题,加速梯度下降的收敛速度。

缺点:

1、非零中心化,影响梯度下降的效率;

2、死亡ReLU问题,即一次不恰当的更新后,ReLU神经元都不能被激活,永远可能都会是0.

2.3.1 带泄露的ReLU(Leaky ReLU)

在x<0时,可以保持一个很小的梯度\gamma,避免死亡ReLU的问题。

表达式:

\gamma一般选择为0.01.

LeakyReLU(x)=\left\{\begin{matrix} x &if x>0 \\ \\0.01 x & if x\leqslant 0 \end{matrix}\right.                                          (1-8)

代码实现:

import numpy as np
import matplotlib.pyplot as plt
def Leaky_relu(x):return np.maximum(0.01*x,x)x=np.arange(-5.0,5.0,0.1)
y=Leaky_relu(x)
plt.plot(x,y)
plt.show()

输出:

和ReLU相比,负方向有个很小的弧度。

2.3.2 带参数的ReLU

带参数的ReLU(parametric ReLU,PReLU),PReLU是一个参数可变的函数。

表达式:

PReLU_{i}(x)=\left\{\begin{matrix} x&if x>0 \\ \gamma _{i} x&if x\leq 0 \end{matrix}\right.                                        (1-9)

2.3.3 ELU函数

ELU(Exponential Linear Unit,指数线性单元)

定义:

ELU(x)=\left\{\begin{matrix} x & if x>0\\ \gamma (e^{x}-1) & if x\leq 0 \end{matrix}\right.                                       (1-10)

代码实现:

import numpy as np
import matplotlib.pyplot as plt
import math
def elu(x,alpha=1):a = x[x>0]b = alpha*(math.e**(x[x<0])-1)result=np.concatenate((b,a),axis=0)return resultx=np.arange(-5.0,5.0,0.1)
y=elu(x)
plt.plot(x,y)
plt.show()

输出:

3、3层神经网络的实现

代码实现:

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 networkdef 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.5])
y=forward(network,x)
y

输出:

array([0.31682708, 0.69627909])

4、softmax函数

表达式:

y_{k}=\frac{e^{a_{k}}}{\sum_{i=1}^{n}e^{a_{i}}}                                                          (1-11)

由于会出现溢出情况,所以将公式(1-11)变换。

y_{k}=\frac{e^{a_{k}}}{\sum_{i=1}^{n}e^{a_{i}}}=\frac{Ce^{a_{k}}}{C\sum_{i=1}^{n}e^{a_{i}}}=\frac{e^{(a_{k}+logC)}}{\sum_{n}^{i=1}e^{(a_{i}+logC)}}=\frac{e^{(a_{k}+C{}')}}{\sum_{n}^{i=1}e^{(a_{i}+C{}')}}                 (1-12)

为了防止溢出,增加C{}'为任何值,一般会使用输入信号中的最大值。

实现代码:

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_areturn y

softmax函数的输出是0~1.0之间的实数,总和为1。所以才把softmax函数的输出解释为“概率”。

举例:

a=np.array([0.3,2.9,4])
y=softmax(a)
y

输出:

array([0.01821127, 0.24519181, 0.73659691])

可以解释为y[0]概率0.018(1.8%),y[1]概率为0.245(24.5%),y[2]概率为0.737(73.7%)。

从概率结果可以看出,有74%概率是第2个类别。

由于指数函数的运算需要一定的计算机运算量,因此输出层的softmax函数一般会被省略。

5、手写数字识别实例

和机器学习步骤一样,分为学习和推理两个阶段。学习就是首先使用训练数据进行权重参数的学习;然后进行推理,使用刚才学习到的参数,对输入参数进行分类。

minist 显示代码

# coding: utf-8
import sys, os
sys.path.append(os.pardir)  # 为了导入父目录的文件而进行的设定
import numpy as np
from dataset.mnist import load_mnist
from PIL import Imagedef img_show(img):pil_img = Image.fromarray(np.uint8(img))pil_img.show()(x_train, t_train), (x_test, t_test) = load_mnist(flatten=True, normalize=False)img = x_train[0]
label = t_train[0]
print(label)  # 5print(img.shape)  # (784,)
img = img.reshape(28, 28)  # 把图像的形状变为原来的尺寸
print(img.shape)  # (28, 28)img_show(img)

输出第1个图片:

计算精度的程序:

# coding: utf-8
import sys, os
sys.path.append(os.pardir)  # 为了导入父目录的文件而进行的设定
import numpy as np
import pickle
from dataset.mnist import load_mnist
from common.functions import sigmoid, softmaxdef get_data():(x_train, t_train), (x_test, t_test) = load_mnist(normalize=True, flatten=True, one_hot_label=False)return x_test, t_testdef init_network():with open("sample_weight.pkl", 'rb') as f:network = pickle.load(f)return networkdef predict(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 = softmax(a3)return yx, t = get_data()
network = init_network()
accuracy_cnt = 0
for i in range(len(x)):y = predict(network, x[i])p= np.argmax(y) # 获取概率最高的元素的索引if p == t[i]:accuracy_cnt += 1print("Accuracy:" + str(float(accuracy_cnt) / len(x)))

输出精度为:93.51%。

5.1 批处理

# coding: utf-8
import sys, os
sys.path.append(os.pardir)  # 为了导入父目录的文件而进行的设定
import numpy as np
import pickle
from dataset.mnist import load_mnist
from common.functions import sigmoid, softmaxdef get_data():(x_train, t_train), (x_test, t_test) = load_mnist(normalize=True, flatten=True, one_hot_label=False)return x_test, t_testdef init_network():with open("sample_weight.pkl", 'rb') as f:network = pickle.load(f)return networkdef predict(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 = softmax(a3)return yx, t = get_data()
network = init_network()batch_size = 100 # 批数量
accuracy_cnt = 0for i in range(0, len(x), batch_size):x_batch = x[i:i+batch_size]y_batch = predict(network, x_batch)p = np.argmax(y_batch, axis=1)accuracy_cnt += np.sum(p == t[i:i+batch_size])print("Accuracy:" + str(float(accuracy_cnt) / len(x)))

参考资料:

1、深度学习入门:基于python的理论与实现 

2、神经网络与深度学习 邱锡鹏。

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

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

相关文章

面试题整理01

1.i有没有线程安全问题?为什么?如何解决它? i在多线程环境下存在线程安全问题.原因是,i不是一个原子操作,它实际上包含了读取i的值,然后将其加1,然后将结果写回i的三个步骤.在多线程环境下,如果两个或多个线程同时执行i操作,可能会导致竞争条件. 举个例子.假设i的初始值为…

Elasticsearch高性能优化实践

Elasticsearch高性能优化实践_es批量导入数据多少为最优-CSDN博客 ES 性能调优 ES 的默认配置,是综合了数据可靠性、写入速度、搜索实时性等因素。实际使用时,我们需要根据公司要求,进行偏向性的优化。 一、写优化 假设我们的应用场景要求是,每秒 300 万的写入速度,每条 …

2024前端面试题汇总

2024前端面试题汇总 1、全局变量与局部变量2、Vue3 区分ref 与 reactive 的原因3、关于服务端渲染&#xff08;SSR&#xff09;与客户端渲染&#xff08;CSR&#xff09;的理解4、单页面应用&#xff08;SPA&#xff09;与多页面应用&#xff08;MPA&#xff09;的优劣5、Vue2 …

计算机二级Python选择题考点——Python语言程序设计Ⅱ

代码1&#xff1a; def fibRate(n):if n < 0:return -1elif n 1:return -1elif n 2:return 1else:L [1,5]for i in range(2,n):L.append(L[-1] L[-2])return L[-2] % L[-1] print(fibRate(7))n 7 L [1,5] i 2 , 3 , 4 , 5 , 6 i 2 -> L[-1] L[-2] 5 1 6 -&g…

tomcat中不同应用session共享

保存session HttpSession sessionrequest.getSession();session.setAttribute("logonUser",logonuser );//session.setMaxInactiveInterval(15);String sessionidsession.getId();session.setAttribute("sessionid", sessionid);ServletContext ContextA …

Linux逻辑卷(LV)扩容

Linux逻辑卷&#xff08;LV&#xff09;扩容 1、准备物理磁盘&#xff08;分区和不分区都行&#xff09;&#xff0c;可以使用lsblk命令查看新增的磁盘&#xff0c;如下图sde就是我们新增磁盘&#xff0c;容量为600G。 2、将新磁盘变成物理卷&#xff08;PV&#xff09; pvcr…

缓存的概念

文章目录 一、系统缓存buffer与cachecache 的保存位置cache 的特性 二、用户层缓存DNS缓存 三、浏览器缓存过期机制最后修改时间Etag标记过期时间 expires混合使用和缓存刷新缓存刷新 cookie和session 四、CDN缓存什么是CDN用户请求CDN流程利用 302 实现转发请求重定向至最优服…

Unity 平台编译预定义

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、Platform scripting symbols二、测试总结 前言 提示&#xff1a;这里可以添加本文要记录的大概内容&#xff1a; 链接: 官方文档 一、Platform scripting…

RabbitMQ 死信队列应用

1. 概念 死信队列&#xff08;Dead Letter Queue&#xff09;是在消息队列系统中的一种特殊队列&#xff0c;用于存储无法被消费的消息。消息可能会因为多种原因变成“死信”&#xff0c;例如消息过期、消息被拒绝、消息队列长度超过限制等。当消息变成“死信”时&#xff0c;…

【数据分享】1929-2023年全球站点的逐月最高气温数据(Shp\Excel\无需转发)

气象数据是在各项研究中都经常使用的数据&#xff0c;气象指标包括气温、风速、降水、湿度等指标&#xff0c;其中又以气温指标最为常用&#xff01;说到气温数据&#xff0c;最详细的气温数据是具体到气象监测站点的气温数据&#xff01; 之前我们分享过1929-2023年全球气象站…

Leetcode1109. 航班预订统计

Every day a Leetcode 题目来源&#xff1a;1109. 航班预订统计 解法1&#xff1a;差分数组 注意到一个预订记录实际上代表了一个区间的增量。我们的任务是将这些增量叠加得到答案。因此&#xff0c;我们可以使用差分解决本题。 代码&#xff1a; /** lc appleetcode.cn i…

设计模式 :总结篇

一、前言 有时候不想动脑子&#xff0c;就懒得看源码又不像浪费时间所以会看看书&#xff0c;但是又记不住&#xff0c;所以决定开始写"抄书"系列。本系列大部分内容都是来源于《 图解设计模式》&#xff08;【日】结城浩 著&#xff09;。该系列文章可随意转载。 本…

asp.net core监听本地ip地址

开发asp.net core的时候遇到一个问题我想提供访问供其他同事测试&#xff0c;但是默认都是localhost或者127.0.0.1。我想换成我的Ip地址访问但是不行&#xff0c;百度搜索需要更换监听的地址即修改launchSettings.json&#xff0c;修改为0.0.0.0:5248&#xff0c;这样不管local…

Android 双卡适配 subId 相关方法

业务场景 双卡设备进行网络等业务时&#xff0c;需要正确操作对应的卡。 执行卡业务和主要是使用subId和 PhoneId/SlotId进行区分隔离。 代码举例 初始化subId //初始化subId private int mSubId SubscriptionManager.INVALID_SUBSCRIPTION_ID;//1、通过intent传值&#x…

力扣hot100 跳跃游戏 II 贪心 思维

Problem: 45. 跳跃游戏 II 思路 &#x1f468;‍&#x1f3eb; 参考 每次在上次能跳到的范围&#xff08;end&#xff09;内选择一个能跳的最远的位置&#xff08;也就是能跳到max_far位置的点&#xff09;作为下次的起跳点 &#xff01; Code ⏰ 时间复杂度: O ( n ) O(n…

k8s学习-Health Check

强大的自愈能力是Kubernetes这类容器编排引擎的⼀个重要特性。自愈的默认实现方式是自动重启发生故障的容器。除此之外&#xff0c;用户还可以利用Liveness和Readiness探测机制设置更精细的健康检查&#xff0c;进而实现&#xff1a; &#xff08;1&#xff09;零停机部署。 &a…

DVI接口主机连接VGA显示器解决方案:DVI转VGA转换器DV

DVI转VGA转换器概述 DVI转VGA转换器能够将DVI数字信号转换成VGA模拟信号&#xff0c;通过VGA线缆传输给VGA显示设备使用&#xff0c;这样就能实现DVI接口主机连接VGA接口的显示器。 DVI转VGA转换器DV DVI转VGA转换器DV接口说明 DVI转VGA转换器DV接口介绍 DVI转VGA转换器连接示…

在next.js的13.2.1版本中使用中间件,实现禁止特定ip访问网址所有页面

在实现实现禁止特定ip访问网址所有页面时&#xff0c;有两种方式&#xff0c;一种是针对单个页面&#xff0c;另一种是针对整个网站 在pages/api中创建文件使用&#xff0c;针对单个页面,也可以应用于所有页面 之前是在pages/api下创建的中间件去实现的&#xff0c;但是使用p…

Spring Boot集成RocketMQ

本文目的是&#xff1a;教会你使用Spring Boot集成RocketMQ。 pom.xml文件引入rocketMQ依赖 <!-- rocketmq 依赖--><dependency><groupId>org.apache.rocketmq</groupId><artifactId>rocketmq-spring-boot-starter</artifactId>&…

XCTF:warmup[WriteUP]

CtrlU查看页面源码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><meta http-equiv"X-UA-Compatible&q…