非线性

为什么神经网络需要非线性激活函数

Deadly 提交于 2019-12-10 04:36:00
生物神经网络启发了人工神经网络的发展,在了解为什么神经网络需要非线性激活函数之前,理解生物神经网络的工作原理对我们是有帮助的。 一个典型的生物神经元的物理结构包括细胞体、树突、轴突。树突具有接受刺激并将冲动传入细胞体的功能,细胞体具有联络和整合输入信息并传出信息的作用,轴突的主要功能是将神经冲动由细胞体传至其他神经元。神经元通过树突接收来自其他神经元的信号,来自树突的信号在细胞体中积累,如果产生的信号强度超过一定的阈值,神经元就把信息传递给轴突。否则,信号会被神经元杀死,不再传播。 在人工神经网络中,激活函数决定是否需要传递信号。上图中第二层的神经单元可以看做是一个细胞体,它接收来自其它神经元的信号,然后整合信息。在人工神经网络中计算如下,b代表偏置项(在上图中代表一个实数),g代表激活函数。 如果神经网络中没有激活函数,或者说是线性激活函数,那么会发生什么呢? 假设有一个上图所示的两层的浅层神经网络(输入层不算),如果每个神经元都采用线性激活函数g(z)=z。 上面的神经网络正向传播的过程就可以表示如下: 中括号表示第几层,W是权重矩阵, 的维度是(3,3), 和 的维度是(3,1), 的维度是(1,3), 和 的维度是(1,1),x是(3,1)的向量。 可以看到第二层的输出值仍然是输入特征的线性组合,不难想象,如果在神经网络中使用线性激活函数或者没有激活函数

BN

自古美人都是妖i 提交于 2019-12-05 23:53:55
参考:https://www.cnblogs.com/eilearn/p/9780696.html 机器学习领域有个很重要的假设: 独立同分布假设,就是假设训练数据和测试数据是满足相同分布的 ,这是通过训练数据获得的模型能够在测试集获得好的效果的一个基本保障。那BatchNorm的作用是什么呢? BatchNorm就是在深度神经网络训练过程中使得每一层神经网络的输入保持相同分布的。   思考一个问题:为什么传统的神经网络在训练开始之前,要对输入的数据做Normalization?原因在于神经网络学习过程 本质上是为了学习数据的分布 ,一旦训练数据与测试数据的分布不同,那么网络的泛化能力也大大降低;另一方面,一旦在mini-batch梯度下降训练的时候,每批训练数据的分布不相同,那么网络就要在每次迭代的时候去学习以适应不同的分布,这样将会大大降低网络的训练速度,这也正是为什么我们需要对所有训练数据做一个Normalization预处理的原因。   为什么深度神经网络随着网络深度加深,训练起来越困难,收敛越来越慢?这是个在DL领域很接近本质的好问题。很多论文都是解决这个问题的,比如ReLU激活函数,再比如Residual Network, BN本质上也是解释并从某个不同的角度来解决这个问题的。 1、“Internal Covariate Shift”问题   从论文名字可以看出

[ch02-02] 非线性反向传播

时光怂恿深爱的人放手 提交于 2019-12-05 16:55:26
系列博客,原文在笔者所维护的github上: https://aka.ms/beginnerAI , 点击star加星不要吝啬,星越多笔者越努力。 2.2 非线性反向传播 2.2.1 提出问题 在上面的线性例子中,我们可以发现,误差一次性地传递给了初始值w和b,即,只经过一步,直接修改w和b的值,就能做到误差校正。因为从它的计算图看,无论中间计算过程有多么复杂,它都是线性的,所以可以一次传到底。缺点是这种线性的组合最多只能解决线性问题,不能解决更复杂的问题。这个我们在神经网络基本原理中已经阐述过了,需要有激活函数连接两个线性单元。 下面我们看一个非线性的例子,如图2-8所示。 图2-8 非线性的反向传播 其中 \(1<x<=10,0<y<2.15\) 。假设有5个人分别代表x、a、b、c、y: 正向过程 第1个人,输入层,随机输入第一个x值,x取值范围(1,10],假设第一个数是2 第2个人,第一层网络计算,接收第1个人传入x的值,计算: \(a=x^2\) 第3个人,第二层网络计算,接收第2个人传入a的值,计算b: \(b=\ln (a)\) 第4个人,第三层网络计算,接收第3个人传入b的值,计算c: \(c=\sqrt{b}\) 第5个人,输出层,接收第4个人传入c的值 反向过程 第5个人,计算y与c的差值: \(\Delta c = c - y\) ,传回给第4个人 第4个人

Opencv的线性滤波和非线性滤波

大城市里の小女人 提交于 2019-12-05 09:41:41
线性滤波 :方框滤波 均值滤波 高斯滤波 非线性滤波: 中值滤波 双边滤波 这几个滤波都是起模糊作用 去除噪点 不废话了 下面是代码 1 #include <opencv2/opencv.hpp> 2 #include<iostream> 3 #include<string> 4 using namespace cv; 5 using namespace std; 6 7 int main() 8 { 9 Mat picture; //Original picture from cammmera 10 Mat img; //The picture which has been done 11 VideoCapture capture(0); 12 while (1) 13 { 14 capture >> picture; 15 // boxFilter(picture, img, -1, Size(15, 14)); //方框滤波(线性) 16 // blur(picture, img, Size(25, 25)); //均值滤波(线性) 17 // GaussianBlur(picture, img, Size(9, 9),0,0); // 高斯滤波0,0代表标准偏差(线性) 18 // medianBlur(picture, img, 7); //中指滤波 数字为孔径的线性尺寸

Tensorflow学习笔记---2--DCGAN代码学习

半世苍凉 提交于 2019-12-05 08:41:11
以mnist数据训练为例,学习DCGAN(deep convolutional generative adversarial networks)的网络结构。 代码下载地址https://github.com/carpedm20/DCGAN-tensorflow 注1:发现代码中以mnist为训练集的网络和以无标签数据集(以下简称unlabeled_dataset)为训练集的网络不同,结构有别。以下笔记主要针对前者(Generator=3个ReLU+1个Sigmoid,Discriminator=3个LeakyReLU+1个Sigmoid)。 注2:事实上,以unlabeled_dataset为训练集的网络也同原网页中所画的Generator有一些不同(事实上,区别是每个conv层的filter个数被减半了。原因可能为了减少网络参数利于测试者训练?)。除此以外,结构相同。Discriminator的结构与Generator的结构正好对称。 原代码中对于有label的数据集,Generator和Discriminator的网络结构均只有两个卷积层。 预备:batch_size=64, mnist图片大小28*28*c_dim,其中c_dim=1为颜色维数,类别数10;随机输入维数z_dim=100 Generator 部分 step1(获得输入z):服从均匀分布的输入样本z(shape

非线性支持向量机SVM

左心房为你撑大大i 提交于 2019-12-04 17:32:18
非线性支持向量机SVM 对于线性不可分的数据集, 我们引入了 核 (参考: 核方法·核技巧·核函数 ) 线性支持向量机的算法如下: 将线性支持向量机转换成 非线性支持向量机 只需要将 变为 核函数 即可: 非线性支持向量机的算法如下: 来源: https://www.cnblogs.com/hichens/p/11875506.html

Batch Normalization

心已入冬 提交于 2019-12-03 02:36:43
Batch Normalization作为最近一年来DL的重要成果,已经广泛被证明其有效性和重要性。虽然有些细节处理还解释不清其理论原因,但是实践证明好用才是真的好,别忘了DL从Hinton对深层网络做Pre-Train开始就是一个经验领先于理论分析的偏经验的一门学问。 本文是对论文《Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift》的导读(看看看, 这是通过减少内部协变量移位加速神经网络训练)。 机器学习领域有个很重要的假设:IID独立同分布假设,就是假设训练数据和测试数据是满足相同分布的,这是通过训练数据获得的模型能够在测试集获得好的效果的一个基本保障。那BatchNorm的作用是什么呢?BatchNorm就是在深度神经网络训练过程中使得每一层神经网络的输入保持相同分布的(相同分布是怎样的?是什么的相同分布?参数吗?)。 接下来一步一步的理解什么是BN。 为什么深度神经网络随着网络深度加深,训练起来越困难,收敛越来越慢?这是个在DL领域很接近本质的好问题。很多论文都是解决这个问题的,比如ReLU激活函数,再比如Residual Network,BN本质上也是解释并从某个不同的角度来解决这个问题的(这个解释还是很妙的)。

人工神经网络基础

匿名 (未验证) 提交于 2019-12-03 00:27:02
神经网络中最基本的成分是神经元模型,在生物神经元中每个神经元与其他神经元相连,当他“兴奋”时就会向连接的神经元发送化学物质,从而改变这些神经元内的电位;如果某神经元的电位超过一个“阈值”那么他就会被激活,即兴奋起来,向其他神经元发送化学物质。 1943年,【McCulloch and Pitts】将上述的情形抽象为如图所示的简单模型,这就是一直沿用至今的“M-P神经元模型”。在这个模型中,神经元接收来自n个其他神经元的输入信号,这些信号通过带权重的连接进行传递,神经元接收到的总输入值将与神经元的阈值进行比较,然后通过“激活函数”处理已产生的神经元的输出。 阈值的目的是:使通过激活函数后得到的非线性图像可以左右移动而增加解决问题的能力 理想中的激活函数是阶跃函数,他将输入值映射成为0或1,1对应神经元的兴奋。0对应神经元的抑制,然而阶跃函数具有不连续不光滑等不好的性质,因此常用Sigmoid函数作为激活函数,典型的Sigmoid函数如如所示,它把可能在较大范围内变化的输入值挤压到(0,1)输出值范围内,因此也常被称为挤压函数。 激活函数通常选择非线性的函数,非线性的函数比起线性的函数进行任意的线性组合,或者在复合一个线性函数,仍得到一个线性函数;而非线性的函数进行线性符合或者在复合非线性函数之后得到的就不再是一个线性函数,它将呈现一个更加回环曲折的图像。 激活函数的主要作用是

tensorflow实现非线性拟合

匿名 (未验证) 提交于 2019-12-02 23:43:01
import tensorflow as tf import numpy as np x_data = np.random.rand(100) y_data = x_data*0.6 + 0.8 # 定义变量 k = tf.Variable(tf.zeros([1, 1])) b = tf.Variable(tf.zeros([1, 1])) y = k * x_data + b # 定义二次代价函数 loss = tf.reduce_mean(tf.square(y - y_data)) # 定义梯度下降优化器 optimizer = tf.train.GradientDescentOptimizer(0.2) # 最小化训练 train_step = optimizer.minimize(loss) with tf.Session() as sess: sess.run(tf.global_variables_initializer()) for i in range(201): sess.run(train_step) if i % 10 == 0: print("step: "+str(i)) print(sess.run([k, b])) 运行结果图如下: 文章来源: https://blog.csdn.net/any1234567890/article/details

非线性规划

匿名 (未验证) 提交于 2019-12-02 23:40:02
Matlab 中非线性规划的数学模型写成以下形式 Matlab 中的命令是 X=FMINCON(FUN,X0,A,B,Aeq,Beq,LB,UB,NONLCON,OPTIONS) NONLCON 是用 M 文件定义的非线性向量函数C 、Ceq 为了不计算二阶导数矩阵及其逆阵,我们设法构造另一个矩阵H,用它来逼近二阶导数矩阵的逆阵,这一类方法也称拟牛顿法(Quasi-Newton Method)。 通常,我们取第一个H 为单位阵。 在 Matlab 工具箱中,用于求解无约束极值问题的函数有 fminunc 和 fminsearch 二次规划 若某非线性规划的目标函数为自变量 x 的二次函数,约束条件又全是线性的,就称 这种规划为二次规划。 Matlab 中二次规划的形式: H 是实对称矩阵, b, f 是列向量, A 是相应维数的矩阵。 Matlab 中求解二次规划的命令是 [X,FVAL]= QUADPROG(H,f,A,b,Aeq,beq,LB,UB,X0,OPTIONS) 返回值 X 是决策向量 x 的值,返回值 FVAL 是目标函数在 x 处的值。 罚函数法 利用罚函数法,可将非线性规划问题的求解,转化为求解一系列无约束极值问题。 形式: Matlab 中可以直接利用 max 、 min 和 sum 函数。