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,一经查实,立即删除!

相关文章

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…

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 实现转发请求重定向至最优服…

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…

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…

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

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

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转换器连接示…

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…

嵌入式学习第十四天!(结构体、共用体、枚举、位运算)

1. 结构体&#xff1a; 1. 结构体类型定义&#xff1a; 嵌入式学习第十三天&#xff01;&#xff08;const指针、函数指针和指针函数、构造数据类型&#xff09;-CSDN博客 2. 结构体变量的定义&#xff1a; 嵌入式学习第十三天&#xff01;&#xff08;const指针、函数指针和…

深度学习侧信道攻击的集成方法

深度学习侧信道攻击的集成方法 深度学习侧信道攻击的集成方法项目背景与意义摘要项目链接作者数据集CHES CTF 数据集ASCAD FIXED KEY 数据集ASCAD RANDOM KEY 数据集 代码代码执行神经网络 深度学习侧信道攻击的集成方法 项目背景与意义 在TCHES2020&#xff08;第4期&#x…

安卓线性布局LinearLayout

<?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas.android.com/apk/res/android"xmlns:tools"http://schemas.android.com/tools"android:layout_width"match_parent"android:…

如何用MapTalks IDE来发布网站?

简介 MapTalks IDE 全称 MapTalks集成设计环境&#xff08;Integrated Design Environment&#xff09;&#xff0c;是由MapTalks技术团队开发的新一代web地图设计软件。 通过MapTalks IDE&#xff0c;您可以自由的创建二维和三维地图&#xff0c;在其中载入或创建地理数据&a…

【数据结构与算法】之哈希表系列-20240130

这里写目录标题 一、383. 赎金信二、387. 字符串中的第一个唯一字符三、389. 找不同四、409. 最长回文串五、448. 找到所有数组中消失的数字六、594. 最长和谐子序列 一、383. 赎金信 简单 给你两个字符串&#xff1a;ransomNote 和 magazine &#xff0c;判断 ransomNote 能不…

【Midjourney】新手指南:命令

1./ask 向Midjourney提问&#xff0c;不过问题和回答都是英文的&#xff0c;例如&#xff1a; 2./blend 将两张图片合并为一张 ​ 3./describe 上传一张图片&#xff0c;Midjourney会生成四组该图片相关的关键词&#xff0c;可以使用这些关键词再生成图片。 ​ 4./turbo …

力扣 55.跳跃游戏

思路&#xff1a; 从后往前遍历&#xff0c;遇到元素为0时&#xff0c;记录对应的下标位置&#xff0c;再向前遍历元素&#xff0c;看最大的跳跃步数能否跳过0的位置&#xff0c;不能则继续往前遍历 代码&#xff1a; class Solution { public:bool canJump(vector<int>…

毕业设计过程学习

传统的目标检测算法主要通过人工设计与纹理、颜色和形状相关的特征来进行目标区域特征的提取。随着深度学习和人工智能技术的飞速发展&#xff0c;目标检测技术也取得了很大的成就。早期基于深度学习的目标检测算法的研究方向仍然是将目标定位任务和图像分类任务分离开来的&…