relu

激活函数

寵の児 提交于 2019-12-27 18:19:19
为什么要引入激活函数? 为神经网络引入非线性属性,也就是说,我们希望神经网络既能计算线形函数,也能计算非线性函数。 1.sigmoid 优点: 输出在0-1之间,单调连续,输出范围有限 容易求导: f ( x ) ′ = f ( x ) ( 1 − f ( x ) ) f{\left( x \right)^\prime } = f\left( x \right)\left( {1 - f\left( x \right)} \right) f ( x ) ′ = f ( x ) ( 1 − f ( x ) ) 缺点: 导致模型的梯度消失 误差反向传播时会有: ∂ E ∂ y ( x ) ∂ y ( x ) ∂ θ \frac{{\partial E}}{{\partial y\left( x \right)}}\frac{{\partial y\left( x \right)}}{{\partial \theta }} ∂ y ( x ) ∂ E ​ ∂ θ ∂ y ( x ) ​ ,而一次反向传播,对激活函数有: ∂ σ ( x ) ∂ θ = σ ( 1 − σ ) < 1 \frac{{\partial \sigma \left( x \right)}}{{\partial \theta }} = \sigma (1 - \sigma ) < 1 ∂ θ ∂ σ ( x ) ​

神经网络-激励函数

孤者浪人 提交于 2019-12-27 17:32:45
一、前言 激励函数在神经网络的作用通俗上讲就是讲多个线性输入转换为非线性的关系。 不使用激励函数的话,神经网络的每层都只是做线性变换,多层输入叠加后也还是线性变换。因为线性模型的表达能力不够,激励函数可以引入非线性因素。 1.1 单一的神经网络 如果没有激励函数,在单层神经网络中,我们的输入和输出关系如下图: 这是一个线性方程的直观表示,如果我们增加感知机,如下图: 其中结果输出就是右边的绿色区域,但是本质上还是各种线性方程的组合,对于非线性数据则无法很好的处理。如下数据: 上图数据你就没有办法画出一条直线来将数据区分开. 这时候有两个办法,第一个办法,是做线性变换(linear transformation),比如讲x,y变成x^2,y^2,这样可以画出圆形。如图所示: 如果将坐标轴从x,y变为以x^2,y^2为标准,你会发现数据经过变换后是线性可分的了。大致示意图如下: 1.2 含有激励函数的神经网络 加入非线性激励函数后,神经网络就有可能学习到平滑的曲线来分割平面,而不是用复杂的线性组合逼近平滑曲线来分割平面。 这就是为什么我们要有非线性的激活函数的原因。如下图所示说明加入非线性激活函数后的差异,上图为用线性组合逼近平滑曲线来分割平面,下图为平滑的曲线来分割平面: 二、激励函数 1、激活函数通常有如下一些性质: 非线性: 当激活函数是线性的时候

Sequential容器中常用层的添加

筅森魡賤 提交于 2019-12-27 09:38:54
model = Sequential ( ) model . add ( layers . Conv2D ( filters = 64 , kernel_size = ( 3 , 3 ) , padding = 'Same' , activation = 'relu' ) ) model . add ( layers . MaxPool2D ( pool_size = ( 2 , 2 ) , strides = ( 2 , 2 ) ) ) model . add ( layers . Flatten ( ) ) model . add ( layers . Dense ( 256 , activation = "relu" ,kernel_regularizer = tf . keras . regularizers . l2 ( 0.003 ) ) ) model . add ( layers . BatchNormalization ( ) ) model . add ( layers . Dropout ( 0.4 ) ) 来源: CSDN 作者: weixin_43729570 链接: https://blog.csdn.net/weixin_43729570/article/details/103652068

TensorFlow实现LeNet5模型

99封情书 提交于 2019-12-26 20:34:00
# -*- coding: utf-8 -*- import tensorflow as tf from tensorflow.examples.tutorials.mnist import input_data # 获取mnist数据 mnist = input_data . read_data_sets ( "MNIST_data/" , one_hot = True ) # 注册默认session 后面操作无需指定session 不同sesson之间的数据是独立的 sess = tf . InteractiveSession () # 构造参数W函数 给一些偏差0.1防止死亡节点 def weight_variable ( shape ): initial = tf . truncated_normal ( shape , stddev = 0.1 ) return tf . Variable ( initial ) # 构造偏差b函数 def bias_variable ( shape ): initial = tf . constant ( 0.1 , shape = shape ) return tf . Variable ( initial ) # x是输入,W为卷积参数 如[5,5,1,30] 前两个表示卷积核的尺寸 # 第三个表示通道channel

Jetson Nano TensorRt sampleSSD例程

最后都变了- 提交于 2019-12-25 13:20:52
1 平台: jetson Nano + 128gtf卡+ jetpack:jetson-nano-sd-r32.1-2019-03-18 .zip sampleSSD目录:/usr/src/tensorrt/sample/sampleSSD/ 使用的data文件在“:/usr/src/tensorrt/data/ssd/ 编译之后的可执行文件在:/usr/src/tensorrt/bin/ 2 环境准备: 2.1 主要为了装上pillow sudo apt-get -y install cmake sudo apt-get install python3 sudo apt-get install python3-pip sudo apt-get install python3-dev sudo apt install libopenblas-dev libatlas-dev liblapack-dev sudo apt install liblapacke-dev checkinstall sudo pip3 install numpy scipy sudo pip3 install pyyaml sudo pip3 install scikit-build sudo apt install libffi-dev sudo pip3 install cffi sudo apt

(原)MobileNetV1

南楼画角 提交于 2019-12-25 04:56:26
转载请注明出处: https://www.cnblogs.com/darkknightzh/p/9410540.html 论文: MobileNets: Efficient Convolutional Neural Networks for Mobile Vision Applications 网址: https://arxiv.org/abs/1704.04861?context=cs 非官方的pytorch代码: https://github.com/marvis/pytorch-mobilenet 1. 深度可分离卷积 mobilenetV1使用的是深度可分离卷积(Depthwise Separable Convolution,DSC),DSC包含两部分:depthwise convolution(DWC)+ pointwise convolution(PWC)。DWC对输入的通道进行滤波,其不增加通道的数量,PWC用于将PWC不同的通道进行连接,其可以增加通道的数量。通过这种分解的方式,可以明显的减少计算量。 如下图所示,传统的卷积(a),卷积核参数为${{D}_{K}}\centerdot {{D}_{K}}\centerdot M\centerdot N$,其中${{D}_{K}}$为卷积核大小,M为输入的通道数,N为输出的通道数。DWC(b)中卷积核参数为${{D}_

关于梯度爆炸和梯度消失的详解(转载)

会有一股神秘感。 提交于 2019-12-24 04:02:06
转载链接: https://www.jianshu.com/p/3f35e555d5ba 1.为什么使用梯度下降来优化神经网络参数? 反向传播(用于优化神网参数) :根据损失函数计算的误差通过反向传播的方式,指导深度网络参数的更新优化。 采取反向传播的原因:首先,深层网络由许多线性层和非线性层堆叠而来,每一层非线性层都可以视为是一个非线性函数 (非线性来自于非线性激活函数),因此整个深度网络可以视为是一个复合的非线性多元函数。 我们最终的目的是希望这个非线性函数很好的完成输入到输出之间的映射,也就是找到让损失函数取得极小值。所以最终的问题就变成了一个寻找函数最小值的问题,在数学上,很自然的就会想到使用梯度下降来解决。 2.梯度消失、爆炸会带来哪些影响 举个例子,对于一个含有三层隐藏层的简单神经网络来说, 当梯度消失发生时,接近于输出层的隐藏层由于其梯度相对正常,所以权值更新时也就相对正常,但是当越靠近输入层时,由于梯度消失现象,会导致靠近输入层的隐藏层权值更新缓慢或者更新停滞。这就导致在训练时,只等价于后面几层的浅层网络的学习。 3.产生的原因 以最简单的网络结构为例,假如有三个隐藏层,每层的神经元个数都是1,且对应的非线性函数为 (其中 为某个激活函数)如下图: 现在假设我们需要更新参数 ,那么我们就要求出损失函数对参数 的导数 而对于激活函数,之前一直使用Sigmoid函数

dead relu and Tensorboard

一曲冷凌霜 提交于 2019-12-22 02:22:22
https://medium.com/analytics-vidhya/is-relu-dead-27943b50102 1、使用relu作为激活函数时,因其在输入小于0时,输出为0,所以可能会造成dead relu,使得输出和梯度都为0; 2、上述文章中使用了多种方式尝试去改善,包括更多层,更多数据,改变初始化方式,使用leak relu(why)等都没有效果,最后使用了SELU解决了这个问题。 3、这篇文章主要是通过Tensorboard来观察dead relu这种现象,以前只会使用它来观察loss啊,accuracy等,以后也会观察下梯度了 来源: https://www.cnblogs.com/573177885qq/p/11968097.html

【学习笔记】卷积神经网络

核能气质少年 提交于 2019-12-18 02:05:42
目录 人工神经网络VS卷积神经网络 卷积神经网络CNN 卷积层 新的激活函数-Relu Pooling计算 Mnist数据集卷积网络实现 人工神经网络VS卷积神经网络 参数太多,在cifar-10的数据集中,只有32*32*3,就会有这么多权重,如果说更大的图片,比如200*200*3就需要120000多个,这完全是浪费。 没有利用像素之间位置信息,对于图像识别任务来说,每个像素与周围的像素都是联系比较紧密的。 网络层数限制 我们知道网络层数越多其表达能力越强,但是通过梯度下降方法训练深度人工神经网络很困难,因为全连接神经网络的梯度很难传递超过3层。因此,我们不可能得到一个很深的全连接神经网络,也就限制了它的能力。 那么,卷积神经网络又是怎样解决这个问题的呢?主要有三个思路: 局部连接:这个是最容易想到的,每个神经元不再和上一层的所有神经元相连,而只和一小部分神经元相连。这样就减少了很多参数。 权值共享:一组连接可以共享同一个权重,而不是每个连接有一个不同的权重,这样又减少了很多参数。 下采样:可以使用Pooling来减少每层的样本数,进一步减少参数数量,同时还可以提升模型的鲁棒性。对于图像识别任务来说,卷积神经网络通过尽可能保留重要的参数,去掉大量不重要的参数,来达到更好的学习效果 卷积神经网络CNN 卷积神经网络与上一篇文章中的普通神经网络非常相似

VGG16小记

旧城冷巷雨未停 提交于 2019-12-17 02:11:37
VGG16是VGG网络中的一个。 conv+relu算一层(均为3 3卷积核),pooling算一层(核大小为2 2)。即有参数的层共有16层。 用在SSD时的结构。 ( 0 ) : Conv2d ( 3 , 64 , kernel_size = ( 3 , 3 ) , stride = ( 1 , 1 ) , padding = ( 1 , 1 ) ) ( 1 ) : ReLU ( inplace ) ( 2 ) : Conv2d ( 64 , 64 , kernel_size = ( 3 , 3 ) , stride = ( 1 , 1 ) , padding = ( 1 , 1 ) ) ( 3 ) : ReLU ( inplace ) ( 4 ) : MaxPool2d ( kernel_size = 2 , stride = 2 , padding = 0 , dilation = 1 , ceil_mode = False ) ( 5 ) : Conv2d ( 64 , 128 , kernel_size = ( 3 , 3 ) , stride = ( 1 , 1 ) , padding = ( 1 , 1 ) ) ( 6 ) : ReLU ( inplace ) ( 7 ) : Conv2d ( 128 , 128 , kernel_size = ( 3 , 3 )