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 plt

def 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 result

x=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 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.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_a
    
    return 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 Image


def 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)  # 5

print(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, softmax


def get_data():
    (x_train, t_train), (x_test, t_test) = load_mnist(normalize=True, flatten=True, one_hot_label=False)
    return x_test, t_test


def init_network():
    with open("sample_weight.pkl", 'rb') as f:
        network = pickle.load(f)
    return network


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

    return y


x, 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 += 1

print("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, softmax


def get_data():
    (x_train, t_train), (x_test, t_test) = load_mnist(normalize=True, flatten=True, one_hot_label=False)
    return x_test, t_test


def init_network():
    with open("sample_weight.pkl", 'rb') as f:
        network = pickle.load(f)
    return network


def 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) + b1
    z1 = sigmoid(a1)
    a2 = np.dot(z1, w2) + b2
    z2 = sigmoid(a2)
    a3 = np.dot(z2, w3) + b3
    y = softmax(a3)

    return y


x, t = get_data()
network = init_network()

batch_size = 100 # 批数量
accuracy_cnt = 0

for 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.mfbz.cn/a/362121.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

HTML+CSS:导航栏组件

效果演示 实现了一个导航栏的动画效果&#xff0c;当用户点击导航栏中的某个选项时&#xff0c;对应的选项卡会向左平移&#xff0c;同时一个小圆圈会出现在选项卡的中心&#xff0c;表示当前选项卡的位置。这个效果可以让用户更加清晰地了解当前页面的位置和内容。 Code <…

FFMPEG 之 DXVA2 硬解

一&#xff1a;FFMPEG 支持的硬解方式有很多&#xff1a; DXVA2、D3D11VA、CUDA、QSV、OPENCL、DRM、VAAPI、VDPAU、VIDEOTOOLBOX、MEDIACODEC。 有的支持 Windows 平台&#xff0c;有的支持 linux 平台&#xff0c;有的支持 apple ios 平台&#xff0c;…

【AI视野·今日NLP 自然语言处理论文速览 第七十七期】Mon, 15 Jan 2024

AI视野今日CS.NLP 自然语言处理论文速览 Mon, 15 Jan 2024 Totally 57 papers &#x1f449;上期速览✈更多精彩请移步主页 Daily Computation and Language Papers Machine Translation Models are Zero-Shot Detectors of Translation Direction Authors Michelle Wastl, Ja…

手动上传文件

代码&#xff1a; import { Button, UploadProps, Upload, message } from antd; import { UploadOutlined } from ant-design/icons;const MyUpload: React.FC () > {const props: UploadProps {name: jpgFile,action: /xxxxx/xx/接口,headers: {authorization: token,}…

Python正则表达式语法

正则表达式是一种强大的文本处理工具&#xff0c;它可以用来搜索、匹配和替换特定的字符模式。在Python中&#xff0c;正则表达式常常被用于处理字符串数据&#xff0c;例如文本搜索、数据提取、格式验证等任务。本文将深入介绍Python中正则表达式的语法&#xff0c;帮助读者全…

ElasticSearch 应用实践 笔记

概述 介绍 ES 是一个开源的高扩展的分布式全文搜索引擎&#xff0c;是整个Elastic Stack技术栈的核心。它可以近乎实时的存储&#xff0c;检索数据&#xff1b;本身扩展性很好&#xff0c;可以扩展到上百台服务器&#xff0c;处理PB级别的数据。ElasticSearch的底层是开源库Lu…

CRG设计之时钟

1. 前言 CRG(Clock and Reset Generation&#xff0c;时钟复位生成模块) 模块扮演着关键角色。这个模块负责为整个系统提供稳定可靠的时钟信号&#xff0c;同时在系统上电或出现故障时生成复位信号&#xff0c;确保各个模块按预期运行。简而言之&#xff0c;CRG模块就像是SoC系…

MySQL-DQL(Data Query Language)数据查询语言

文章目录 1. DQL定义2. 基础查询3. 条件查询&#xff08;WHERE&#xff09;4. 分组查询&#xff08;GROUP BY&#xff09;5. 过滤分组&#xff08;HAVING&#xff09;6. 排序&#xff08;ORDER BY&#xff09;7. 限制查询结果的条数&#xff08;LIMIT&#xff09;8. 多表查询8.…

Unity_Visual Effect Graph

Unity_Visual Effect Graph Unity可视化特效渲染虽不及Unreal Engine,然也还是吊打一众其他引擎的,粗浅整理一波吧,需要深入研究的点实在是太多了。 按照常规包管理方式安装Visual Effect Graph插件: 安装之后,示例文件夹中自带资源,拖入场景即可: 场景只是资源的显…

Vue学习Element-ui

声明&#xff1a;本文来源于黑马程序员PDF讲义 Ajax 我们前端页面中的数据&#xff0c;如下图所示的表格中的学生信息&#xff0c;应该来自于后台&#xff0c;那么我们的后台和前端是 互不影响的2个程序&#xff0c;那么我们前端应该如何从后台获取数据呢&#xff1f;因为是2…

Tensorflow2.0笔记 - where,scatter_nd, meshgrid相关操作

本笔记记录tf.where进行元素位置查找&#xff0c;scatter_nd用于指派元素到tensor的特定位置&#xff0c;meshgrid用作绘图的相关操作。 import tensorflow as tf import numpy as np import matplotlib.pyplot as plttf.__version__#where操作查找元素位置 #输入的tensor是Tr…

问题:第十三届全国人民代表大会第四次会议召开的时间是()。 #经验分享#知识分享#媒体

问题&#xff1a;第十三届全国人民代表大会第四次会议召开的时间是&#xff08;&#xff09;。 A. 2018年3月3日至3月11日 B. 2019年3月5日至3月11日 C. 2020年3月5日至3月11日 D. 2021年3月5日至3月11日 参考答案如图所示 问题&#xff1a;顾客满意是顾客对一件产品满足…

EDR、SIEM、SOAR 和 XDR 的区别

在一个名为网络安全谷的神秘小镇&#xff0c;居住着四位守护者&#xff0c;他们分别是EDR&#xff08;艾迪&#xff09;、SIEM&#xff08;西姆&#xff09;、SOAR&#xff08;索亚&#xff09;和XDR&#xff08;艾克斯&#xff09;。他们各自拥有独特的能力&#xff0c;共同守…

中国城乡建设统计年鉴,pdf、xls格式,时间覆盖2002-2022年

基本信息&#xff1a; 数据名称: 中国城乡&#xff08;市&#xff09;建设统计年鉴 数据格式: pdf、xls不定 数据时间: 2002-2022年 数据几何类型: 文本 数据坐标系: —— 数据来源&#xff1a;住房和城乡建设部 2005年之后数据中有《中国城市建设统计年鉴》、《中…

node,node-sass,sass-loader之间的版本关系

前言 安装配置node-sass 以及 sass-loader想必是很多前端的噩梦–一不小心又不成功还得装个半天。 下面说一下这个问题。 当然&#xff0c;你肯定遇到过&#xff1a; Node Sass version 9.0.0 is incompatible with ^4.0.0-这样的问题&#xff0c;这个也是因为三者关系对不上…

SpringMVC-基本概念

一、引子 我们在上篇文章Spring集成Web中抛出了一个问题&#xff1a;为什么我们一直在自用Java Web阶段使用的Servlet来承接客户端浏览器的请求呢&#xff0c;我们熟知甚至是已经在日常开发中经常使用的Controller又与之有什么关系呢&#xff1f;我们将在本篇文章解答读者的这…

怎么使用cmd命令来进行Vue脚手架的项目搭建

前言 使用vue搭建项目的时候&#xff0c;我们可以通过对应的cmd命令去打开脚手架&#xff0c;然后自己配置对应的功能插件 怎么打开 我们打开对应的cmd命令之后就开始进入对应的网站搭建 vue ui 然后我们就打开对应的项目管理器来进行配置----这里我们打开开始创建新的项目…

鱼和熊掌如何兼得?一文解析RDS数据库存储架构升级

在2023年云栖大会上&#xff0c;阿里云数据库产品事业部负责人李飞飞在主题演讲中提到&#xff0c;瑶池数据库推出“DB存储”一体化能力&#xff0c;结合人工智能、机器学习、存储等方法和创新能力&#xff0c;实现Buffer Pool Extension能力和智能冷温热数据分层能力。在大会的…

springboot139华强北商城二手手机管理系统

简介 【毕设源码推荐 javaweb 项目】基于springbootvue 的 适用于计算机类毕业设计&#xff0c;课程设计参考与学习用途。仅供学习参考&#xff0c; 不得用于商业或者非法用途&#xff0c;否则&#xff0c;一切后果请用户自负。 看运行截图看 第五章 第四章 获取资料方式 **项…

使用post-css实现移动端适配

介绍移动端适配以及适配方案 适配原因 移动端不像PC端,有足够大的屏幕展示较多的内容不同的移动端设备&#xff0c;有不同屏幕宽度同样大小的页面元素在不同屏幕宽度设备展示时&#xff0c;布局就会错乱有些元素没有展示在可视范围内有些元素不能撑满整个屏幕&#xf…
最新文章