遇到的有关深度神经网络及有关函数

1.孪生神经网络
2. Dense层
Dense layer 就是常提到和用到的全连接层 。

keras.layers.Dense(units, activation=None, use_bias=True, kernel_initializer='glorot_uniform', bias_initializer='zeros', kernel_regularizer=None, bias_regularizer=None, activity_regularizer=None, kernel_constraint=None, bias_constraint=None)

units: 正整数,输出空间维度。
activation: 激活函数 (详见 activations)。 若不指定,则不使用激活函数 (即,「线性」激活: a(x) = x)。
use_bias: 布尔值,该层是否使用偏置向量。
kernel_initializer: kernel 权值矩阵的初始化器 (详见 initializers)。
bias_initializer: 偏置向量的初始化器 (see initializers).
kernel_regularizer: 运用到 kernel 权值矩阵的正则化函数 (详见 regularizer)。
bias_regularizer: 运用到偏置向的的正则化函数 (详见 regularizer)。
activity_regularizer: 运用到层的输出的正则化函数 (它的 “activation”)。 (详见 regularizer)。
kernel_constraint: 运用到 kernel 权值矩阵的约束函数 (详见 constraints)。
bias_constraint: 运用到偏置向量的约束函数 (详见 constraints)。

3.BatchNormalization层(批量归一化层)
对输入数据做了归一化处理,就是将每个特征在所有样本上的值转归一化成均值0方差1。这样我们保证训练数据里数值都同样量级上,从而使得训练的时候数值更加稳定。对于浅层模型来说,通常数据归一化预处理足够有效。输出数值在只经过几个神经层后通常不会出现剧烈变化。但对于深层神经网络来说,情况一般比较复杂。因为每一层里都对输入乘以权重后得到输出。当很多层这样的相乘累计在一起时,一个输出数据较大的改变都可以导致输出产生巨大变化,从而带来不稳定性。
在模型训练时,在应用激活函数之前,先对一个层的输出进行归一化,将所有批数据强制在统一的数据分布下,然后再将其输入到下一层,使整个神经网络在各层的中间输出的数值更稳定。从而使深层神经网络更容易收敛而且降低模型过拟合的风险。
4.激活函数
神经网络中的每个神经元节点接受上一层神经元的输出值作为本神经元的输入值,并将输入值传递给下一层,输入层神经元节点会将输入属性值直接传递给下一层(隐层或输出层)。在多层神经网络中,上层节点的输出和下层节点的输入之间具有一个函数关系,这个函数称为激活函数(又称激励函数)。
激活函数的用途(为什么需要激活函数)?
如果不用激励函数(其实相当于激励函数是f(x) = x),在这种情况下你每一层节点的输入都是上层输出的线性函数,很容易验证,无论你神经网络有多少层,输出都是输入的线性组合,与没有隐藏层效果相当,这种情况就是最原始的感知机(Perceptron)了,那么网络的逼近能力就相当有限。正因为上面的原因,我们决定引入非线性函数作为激励函数,这样深层神经网络表达能力就更加强大(不再是输入的线性组合,而是几乎可以逼近任意函数)。

有哪些激活函数,都有什么性质和特点?
1.Sigmoid函数,数学形式如下:
在这里插入图片描述
几何图像如下:
遇到的有关深度神经网络及有关函数_第1张图片
特点:
它能够把输入的连续实值变换为0和1之间的输出,特别的,如果是非常大的负数,那么输出就是0;如果是非常大的正数,输出就是1.
缺点:
sigmoid函数曾经被使用的很多,不过近年来,用它的人越来越少了。主要是因为它固有的一些 缺点。
**缺点1:**在深度神经网络中梯度反向传递时导致梯度爆炸和梯度消失,其中梯度爆炸发生的概率非常小,而梯度消失发生的概率比较大。首先来看Sigmoid函数的导数,如下图所示:
遇到的有关深度神经网络及有关函数_第2张图片
如果我们初始化神经网络的权值为 [ 0 , 1 ] [0,1][0,1] 之间的随机值,由反向传播算法的数学推导可知,梯度从后向前传播时,每传递一层梯度值都会减小为原来的0.25倍,如果神经网络隐层特别多,那么梯度在穿过多层后将变得非常小接近于0,即出现梯度消失现象;当网络权值初始化为 ( 1 , + ∞ ) (1,+∞)(1,+∞) 区间内的值,则会出现梯度爆炸情况。
详细数学分析见文章:http://neuralnetworksanddeeplearning.com/chap5.html 中文译文:深度神经网络为何很难训练
**缺点2:**Sigmoid 的 output 不是0均值(即zero-centered)。这是不可取的,因为这会导致后一层的神经元将得到上一层输出的非0均值的信号作为输入。 产生的一个结果就是:如x > 0 , f = w T x + b x>0, \ f= w^Tx+bx>0, f=w
T
x+b,那么对w求局部梯度则都为正,这样在反向传播的过程中w要么都往正方向更新,要么都往负方向更新,导致有一种捆绑的效果,使得收敛缓慢。 当然了,如果按batch去训练,那么那个batch可能得到不同的信号,所以这个问题还是可以缓解一下的。因此,非0均值这个问题虽然会产生一些不好的影响,不过跟上面提到的梯度消失问题相比还是要好很多的。
**缺点3:**其解析式中含有幂运算,计算机求解时相对来讲比较耗时。对于规模比较大的深度网络,这会较大地增加训练时间。

2.tanh函数
数学公式形式如下:
在这里插入图片描述
tanh函数及其导数的几何图像如下图:
遇到的有关深度神经网络及有关函数_第3张图片
tanh读作Hyperbolic Tangent,它解决了Sigmoid函数的不是zero-centered(0均值)输出问题,然而,梯度消失(gradient vanishing)的问题和幂运算的问题仍然存在。
3.Relu函数
数学公式形式如下:
在这里插入图片描述
Relu函数及其导数的图像如下图所示:
遇到的有关深度神经网络及有关函数_第4张图片
ReLU函数其实就是一个取最大值函数,注意这并不是全区间可导的,但是我们可以取sub-gradient,如上图所示。ReLU虽然简单,但却是近几年的重要成果,有以下几大优点:
1) 解决了梯度消失问题 (在正区间)
2)计算速度非常快,只需要判断输入是否大于0
3)收敛速度远快于sigmoid和tanh

ReLU也有几个需要特别注意的问题:
1)ReLU的输出不是zero-centered(0均值)
2)Dead ReLU Problem,指的是某些神经元可能永远不会被激活,导致相应的参数永远不能被更新。有两个主要原因可能导致这种情况产生: (1) 非常不幸的参数初始化,这种情况比较少见
(2) learning rate太高导致在训练过程中参数更新太大,
不幸使网络进入这种状态。
解决方法是可以采用Xavier初始化方法,以及避免将学习率设置太大或使用adagrad等自动调节learning rate的算法。

尽管存在这两个问题,ReLU目前仍是最常用的激活函数,在搭建人工神经网络的时候推荐优先尝试!

4.Leaky ReLU函数(PReLU)
函数表达式:
在这里插入图片描述
Leaky Relu函数及其导数的图像如下图所示:(ɑ=0.01)
遇到的有关深度神经网络及有关函数_第5张图片
人们为了解决Dead ReLU Problem,提出了将ReLU的前半段设为α x \alpha xαx而非0,通常α = 0.01。理论上来讲,Leaky ReLU有ReLU的所有优点,外加不会有Dead ReLU问题,但是在实际操作当中,并没有完全证明Leaky ReLU总是好于ReLU。

5.ELU (Exponential Linear Units) 函数
函数表达式:
遇到的有关深度神经网络及有关函数_第6张图片
函数及其导数的图像如下图所示:
遇到的有关深度神经网络及有关函数_第7张图片
ELU也是为解决ReLU存在的问题而提出,显然,ELU有ReLU的基本所有优点,以及:

1.不会有Dead ReLU问题
2.输出的均值接近0(zero-centered)

6.MaxOut函数
相当于网络中的激活函数层我们假设网络某一层的输入特征向量为:X=(x1,x2,……xd),也就是我们输入是d个神经元。Maxout隐藏层每个神经元的计算公式如下:
在这里插入图片描述
上面的公式就是maxout隐藏层神经元i的计算公式。其中,k就是maxout层所需要的参数了,由我们人为设定大小。就像dropout一样,也有自己的参数p(每个神经元dropout概率),maxout的参数是k。公式中Z的计算公式为:
在这里插入图片描述
权重w是一个大小为(d,m,k)三维矩阵,b是一个大小为(m,k)的二维矩阵,这两个就是我们需要学习的参数。如果我们设定参数k=1,那么这个时候,网络就类似于以前我们所学普通的MLP网络。
我们可以这么理解,本来传统的MLP算法在第i层到第i+1层,参数只有一组,然而现在我们不这么干了,我们在这一层同时训练n组的w、b参数,然后选择激活值Z最大的作为下一层神经元的激活值,这个max(z)函数即充当了激活函数。

如何选择正确的激活函数?

根据问题的性质,我们可以为神经网络更快更方便地收敛作出更好的选择。

用于分类器时,Sigmoid函数及其组合通常效果更好。

由于梯度消失问题,有时要避免使用sigmoid和tanh函数。

ReLU函数是一个通用的激活函数,目前在大多数情况下使用。

如果神经网络中出现死神经元,那么PReLU函数就是最好的选择。

请记住,ReLU函数只能在隐藏层中使用。

一点经验:你可以从ReLU函数开始,如果ReLU函数没有提供最优结果,再尝试其他激活函数。

————————————————
原文链接:https://blog.csdn.net/tyhj_sf/article/details/79932893

3.卷积
4.反卷积
5.np.expand_dims
其实感觉expand_dims(a, axis)就是在axis的那一个轴上把数据加上去,这个数据在axis这个轴的0位置。这个东西的主要作用,就是增加一个维度。
例如原本为一维的2个数据,axis=0,则shape变为(1,2),axis=1则shape变为(2,1)
再例如 原本为 (2,3),axis=0,则shape变为(1,2,3),axis=1则shape变为(2,1,3)
遇到的有关深度神经网络及有关函数_第8张图片
对于一个数据,numpy里面的维度是

1.先数最里面的括号包含的个数,数的量作为维度最右边的值
2.然后再把最里面的括号当成一个整体,再来数数量,数的数量为上面维度左边的值。
3.一直持续这个2的操作,把维度一直按照从右到左数出来
4.直到剩下最后一个括号
6.TensorFlow 2 保存模型结构和参数
1.保存整个模型为一个 h5 文件

由于是保存的整个模型,这个模型包括如下内容:
The model’s architecture,模型的结构
The model’s weight values (模型的权值)
The model’s training config (模型的配置,即我们通过compile编译模型的一些信息,如优化器,损失函数等),
The optimizer and its state, (优化器的状态信息,我们可以接着之前的训练继续训练)

# 保存模型
model.save('path_to_my_model.h5')
 
# 加载模型,同时加载了模型的结构、权重等信息
new_model = keras.models.load_model('path_to_my_model.h5')
  1. os.getcwd()函数
    在Python中可以使用os.getcwd()函数获得当前的路径。
    该函数不需要传递参数,它返回当前的目录。需要说明的是,当前目录并不是指脚本所在的目录,而是所运行脚本的目录。

8.Python中有join和os.path.join()两个函数,具体作用如下:

join:连接字符串数组。将字符串、元组、列表中的元素以指定的字符(分隔符)连接生成一个新的字符串
os.path.join(): 将多个路径组合后返回

一、函数说明

1.join()函数

语法:‘sep’.join(seq)

参数说明:

sep:分隔符。可以为空

seq:要连接的元素序列、字符串、元组、字典等

上面的语法即:以sep作为分隔符,将seq所有的元素合并成一个新的字符串

返回值:返回一个以分隔符sep连接各个元素后生成的字符串

2、os.path.join()函数

语法: os.path.join(path1[,path2[,…]])

返回值:将多个路径组合后返回

注:第一个绝对路径之前的参数将被忽略

原文链接:https://blog.csdn.net/zmdzbzbhss123/article/details/52279008

8.train_test_split()函数
在机器学习中,我们通常将原始数据按照比例分割为“测试集”和“训练集”,从 sklearn.model_selection 中调用train_test_split 函数

X_train,X_test, y_train, y_test =sklearn.model_selection.train_test_split(train_data,train_target,test_size=0.4, random_state=0,stratify=y_train)
# train_data:所要划分的样本特征集

# train_target:所要划分的样本结果

# test_size:样本占比,如果是整数的话就是样本的数量,训练集:测试集

# random_state:是随机数的种子。
# 随机数种子:其实就是该组随机数的编号,在需要重复试验的时候,保证得到一组一样的随机数。比如你每次都填1,其他参数一样的情况下你得到的随机数组是一样的。但填0或不填,每次都会不一样。

9.函数定义:DataFrame.drop(labels=None,axis=0, index=None, columns=None, inplace=False)
删除单个行

labels是指要删除的标签,一个或者是列表形式的多个,axis是指处哪一个轴,columns是指某一列或者多列,level是指等级,针对多重索引的情况,inplaces是否替换原来的dataframe,具体更详细的可以参阅官网https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.drop.html

10.

`tf.constant(
           value,
           dtype=None,
           shape=None,
           name='Constant',
           vertify_shape=False
)

参数说明:
value:输出类型的常量值(或列表)dtype。
dtype:输出张量元素的类型。
shape:产生张量的可选尺寸。
name:张量的可选名称。
verify_shape:布尔值,用于验证值的形状。
所给的value中包含的元素少于指定shape的大小,则用最后一个元素进行重复填充.

11
sys模块包括了一组非常实用的服务,内含很多函数方法和变量,用来处理Python运行时配置以及资源,从而可以与前当程序之外的系统环境交互,如:python解释器。

你可能感兴趣的:(机器学习,深度学习)