relu

动手学深度学习之多层感知机

纵饮孤独 提交于 2020-02-15 02:06:41
多层感知机 多层感知机的基本知识 深度学习主要关注多层模型。本节将以多层感知机(multilayer perceptron,MLP)为例,介绍多层神经网络的概念。 隐藏层 下图展示了一个多层感知机的神经网络图,它含有一个隐藏层,该层中有5个隐藏单元。 ###### 表达公式 具体来说,给定一个小批量样本$X\in R^{n\times d}$,其批量大小为$n$,输入个数为$d$。假设多层感知机只有一个隐藏层,其中隐藏单元个数为$h$。记隐藏层的输出(也称为隐藏层变量或隐藏变量)为$H$,有$H\in R^{n\times h}$。因为隐藏层和输出层均是全连接层,可以设隐藏层的权重参数和偏差参数分别为$W_h\in R^{d\times h}$和$b_h\in R^{1\times h}$,输出层的权重和偏差参数分别为$W_o\in R^{h\times q}$和$b_o\in R^{1\times q}$。 先来看一种含单隐藏层的多层感知机的设计。其输出 O ∈ R n × q O\in R^{n\times q} O ∈ R n × q 的计算为 H = X W h + b h O = H W o + b o \begin{aligned} H&=XW_h+b_h\\ O&=HW_o+b_o \end{aligned} H O ​ = X W h ​ + b h ​ = H W

动手学深度学习---多层感知机

僤鯓⒐⒋嵵緔 提交于 2020-02-14 18:01:09
多层感知机 线性回归和 softmax 回归是单层神经网络。多层感知机 (multilayer perceptron,MLP) 是多层神经网络。如图展示了一个多层感知机的神经网络图。 该网络输入和输出个数分别为4和3, 含有一个隐藏层 ,该层中有5个隐藏单元。输入层不涉及计算,图中多层感知机的层数为2。其中隐藏层中的神经元和输入层中各个输入完全连接,输出层中的神经元和隐藏层中的各个神经元也完全连接。因此,多层感知机中的隐藏层和输出层都是全连接层。 具体来说,给定一个小批量样本 X∈R^(n×d) ,其批量大小为 n ,输入个数为 d 。假设多层感知机只有一个隐藏层,其中隐藏单元个数为 h 。记隐藏层的输出(也称为隐藏层变量或隐藏变量)为 H ,有 H∈R^(n×h) 。因为隐藏层和输出层均是全连接层,可以设隐藏层的权重参数和偏差参数为 Wh∈R^(d×h)和 bh∈R^(1×h) ,输出层的权重和偏差参数分别为 Wo∈R^(h×q) 和 bo∈R^(1×q) 。 含单隐藏层的多层感知机的设计。其输出 O∈R^(n×q) 的计算为: 也就是将隐藏层的输出直接作为输出层的输入。如果将以上两个式子联立起来,可以得到: 从联立后的式子可以看出,虽然神经网络引入了隐藏层,却依然等价于一个单层神经网络:其中输出层权重参数为 WhWo ,偏差参数为 bhWo+bo 。不难发现

ncnn之六:ncnn量化(post-training quantization)三部曲 - ncnnoptimize

﹥>﹥吖頭↗ 提交于 2020-02-11 13:13:16
1 NetOptimize 定义类 NetOptimize 用于优化网络结构 class NetOptimize : public ncnn :: Net { public : // 0=fp32 1=fp16 int storage_type ; public : int fuse_batchnorm_scale ( ) ; int fuse_convolution_batchnorm ( ) ; int fuse_convolutiondepthwise_batchnorm ( ) ; int fuse_deconvolution_batchnorm ( ) ; int fuse_deconvolutiondepthwise_batchnorm ( ) ; int fuse_innerproduct_batchnorm ( ) ; int fuse_innerproduct_dropout ( ) ; int fuse_convolution_activation ( ) ; int fuse_convolutiondepthwise_activation ( ) ; int fuse_deconvolution_activation ( ) ; int fuse_deconvolutiondepthwise_activation ( ) ; int fuse

AlexNet

笑着哭i 提交于 2020-02-11 01:44:05
这篇论文的作者包括Alex Krizhevsky,Ilya Sutskever 和Geoffrey E. Hinton,三人均来自于多伦多大学计算机科学院,其中,前两者都是Hinton的学生,Hinton就不多说了,和Yoshua Bengio以及Yann LeCun共同获得了2018年图灵奖。下面我们来看一下这篇论文《ImageNet Classification with Deep Convolutional Neural Networks》。 我主要从论文的性能提升方面,和训练提速方面进行介绍。 1、ReLU 论文并没有使用标准的tanh函数和sigmoid函数 而是使用了Rectified Linear Unit,即ReLU 结果也是显而易见的 使用ReLU(实线)的四层卷积神经网络在CIFAR-10上达到25%的训练错误率,比使用tanh(虚线)神经元的等效网络快六倍。每个网络的学习率是独立选择的,以使训练尽可能快。没有采用任何形式的正规化。这里所演示的效果的大小随着网络架构的不同而不同,但是使用ReLUs的网络始终比使用饱和神经元的网络学习速度快几倍。 为什么ReLU比tanh和sigmoid收敛速度快呢,我们来具体看一下几个函数 sigmoid tanh ReLU 从图像上可以看出,sigmoid和tanh在饱和区域非常平缓

CNN 构建例子by Tensorflow 2.0

拜拜、爱过 提交于 2020-02-10 21:45:34
CNN 结构 构建CNN的结构参考了下面的图: 图片来自于论文: T. Klamt and S. Behnke, “Towards Learning Abstract Representations for Locomotion Planning in High-dimensional State Spaces,” 2019 International Conference on Robotics and Automation (ICRA), Montreal, QC, Canada, 2019, pp. 922-928. doi: 10.1109/ICRA.2019.8794144 Tensorflow 代码: from __future__ import absolute_import , division , print_function , unicode_literals import tensorflow as tf from tensorflow . keras import datasets , layers , models import matplotlib . pyplot as plt # import the figure model = models . Sequential ( ) # model.add(layers.Conv2D(32, (3, 3

【TensorFlow2.x系列第3篇】TensorFlow2.0-深度学习中的激活函数

假装没事ソ 提交于 2020-02-08 10:15:58
对于激活函数的应用是比较熟悉和频繁的,但一直以来没有系统性地把深度学习中地激活函数做一个总结,因此小知同学特地对常用的激活函数做一个比较全面的总结, 在讲述理论的同时,也根据激活函数的公式进行编程实现 激活函数概念 所谓激活函数(Activation Function),就是在人工神经网络的神经元上运行的函数,负责将神经元的输入映射到输出端。 什么是激活函数 激活函数(Activation functions)对于人工神经网络模型去学习、理解非常复杂和非线性的函数来说具有十分重要的作用。它们将非线性特性引入到我们的网络中。如图1,在神经元中,输入的 inputs 通过加权,求和后,还被作用了一个函数,这个函数就是激活函数。引入激活函数是为了增 加神经网络模型的非线性。没有激活函数的每层都相当于矩阵相乘。就算你叠加了若干层之后,无非还是个矩阵相乘罢了。 为什么使用激活函数 如果不用激活函数,每一层输出都是上层输入的线性函数,无论神经网络有多少层,输出都是输入的线性组合,这种情况就是最原始的感知机(Perceptron)。 如果使用的话,激活函数给神经元引入了非线性因素,使得神经网络可以任意逼近任何非线性函数,这样神经网络就可以应用到众多的非线性模型中。 个人认知与理解 我觉得机器学习的传统算法与深度学习算法的比较重要的区别是: 从广义上来讲

激活函数

早过忘川 提交于 2020-02-07 09:28:27
激活函数 因为线性的卷积运算,无法形成复杂的空间表示,故很难提取出高语义的信息,因此需要加入非线性的映射,称为激活函数,可以逼近任意的非线性函数,以提升整个神经网络的表达能力. 常用的激活函数 Sigmoid 函数 σ ( x ) = 1 1 + e − x \sigma(x) = \frac{1}{1+e^{-x}} σ ( x ) = 1 + e − x 1 ​ \sigma(x) 的导数计算 σ ( x ) ′ = ( 1 1 + e − x ) ′ = 1 − 1 1 + e − x = 1 − σ ( x ) \sigma(x)' = \left(\frac{1}{1+e^{-x}}\right)' = 1 - \frac{1}{1+e^{-x}} = 1- \sigma(x) σ ( x ) ′ = ( 1 + e − x 1 ​ ) ′ = 1 − 1 + e − x 1 ​ = 1 − σ ( x ) 目的是将一个实数输入转化到 0~1 之间的输出,具体的说也是将越大的负数转化到越靠近 0, 将越大的正数转化到越靠近 1. 即 0 端对应抑制状态,1 端对应激活状态. 中间部分梯度大. 缺点: (1) Sigmoid 函数会造成梯度消失. 靠近 0 和 1 两端时,梯度几乎变为 0, (2) Sigmoid 输出不是以 0 为均值, 这会导致经过 SIgmoid

手撸网络结构—ResNet

我的梦境 提交于 2020-02-07 00:50:50
ResNet 核心就是残差学习单元,相比常规神经网络残差学习单元能够避免出现梯度消失的现象。 ResNet使用两种残差单元,左图(BasicBlock)对应的是浅层网络,而右图(Bottleneck)对应的是深层网络。 在每组残差单元中,第一个单元需要进行下采样从而与单元输出的结果进行匹配。 resnet18采用的都是BasicBlock进行的叠加,前两组残差单元如下图: resnet50采用的都是Bottleneck进行的叠加,前两组残差单元如下图: 文字功力有限,直接上代码: import torch import torch . nn as nn from torchsummary import summary def conv3x3 ( in_planes , out_planes , padding = 0 , stride = 1 , bn = True , rl = True ) : """3x3 convolution with padding""" layers = [ ] layers . append ( nn . Conv2d ( in_planes , out_planes , kernel_size = 3 , padding = padding , stride = stride ) ) if bn : layers . append ( nn .

Chapter3_神经网络

♀尐吖头ヾ 提交于 2020-02-05 12:03:49
神经网络 输入层(第0层)->中间层(隐藏层)->输出层(最后一层) 隐藏层的激活函数 将输入信号的总和转换为输出信号.决定如何来激活输入信号的总和 先计算输入信号的加权总和(带偏置),然后用激活函数转换这一总和 \[ a = b+\omega_1x_1+\omega_2x_2\\ y = h(a) \] 阶跃函数 以阈值为界,一旦输入超过阈值,就切换输出 #阶跃函数的实现 import numpy as np def step_function(x): y = x > 0 return y.astype(np.int) step_function(np.array([-1.0,1.0,2.0])) array([0, 1, 1]) #绘制阶跃函数的图形 import matplotlib.pylab as plt x = np.arange(-5.0,5.0,0.1) y = step_function(x) plt.plot(x,y) plt.ylim(-0.1,1.1)#指定y轴的范围 plt.show() sigmoid函数 \[ h(x) = \frac{1}{1+exp(-x)} \] #sigmoid函数的实现 def sigmoid(x): return 1/(1+np.exp(-x)) x = np.array([-1.0,1.0,2.0]) sigmoid(x)

pytorch中激活函数ReLU

拜拜、爱过 提交于 2020-02-05 07:31:59
nn.ReLU(inplace=True) Parameters inplace – can optionally do the operation in-place. Default: False ReLU(x)=max(0,x) 参数inplace=True: inplace为True,将会改变输入的数据 ,否则不会改变原输入,只会产生新的输出 注: 产生的计算结果不会有影响。利用in-place=True计算可以节省内(显)存,同时还可以省去反复申请和释放内存的时间。但是会对原变量覆盖,只要不带来错误就用。 m = nn . ReLU ( ) n = nn . ReLU ( inplace = True ) input = autograd . Variable ( torch . randn ( 5 ) ) inputTemp = input print ( input ) print ( m ( input ) ) print ( input , '\n' ) print ( inputTemp ) print ( n ( inputTemp ) ) print ( inputTemp ) #运行结果 tensor ( [ 0.2750 , - 0.1387 , - 0.6451 , - 0.8800 , 0.4505 ] ) tensor ( [ 0.2750 , 0