之前一直使用tensorflow,后面又用了tensorlayer,slim等等一大堆高层封装,怎么说吧,虽然封装的越来越高级,但是总缺点什么东西, 当遇到keras时,我发现了它的方便是有道理的,把一些实用的功能考虑到了,比如友好的数据增强,自适应学习率, 简便的层定义,超方便的迁移学习,所以打算花费一点时间熟悉一下keras,毕竟这个年轻的库也越来越受开发者的青睐。
Keras中的网络层一览
核心层:这里我们只介绍计算机视觉中图像识别可能使用到的层
- ense:全连接层
- Dropout:经典的dropout,但现在越来越少用了,理由可以自行查找,破坏分布,特别是网络前面有BN时
- Activation:激活层,在一般的层中会有activation参数来设置激活函数类型
- Flatten:展平层,将多维的数据展成一维,例如(3,3,12)-> (108,)
- Reshape:类比numpy中的reshape,符合质量守恒定律,前后的数据量是不变的,当该层作为首层时,需要制定input_shape参数
- Permute:维度重排层
- RepeatVector:将输入向量重复并形成新的一批数据,(None,32)- > (None,n,32)
- Lambda:自定义函数层,可以对输入的数据进行任意表达式的运算
- ActivityRegularizer:目前不清楚有什么作用,文档介绍为:经过本层的数据不会有任何变化,但会基于其激活值更新损失函数值
- Masking:是RNN中的用法,暂不做介绍,文档中的介绍为:使用给定的值对输入的序列信号进行“屏蔽”,用以定位需要跳过的时间步
卷积层
- Conv1D:一维滤波,有点像时域上的信号卷积
- Conv2D:我们熟悉的CNN中常用的卷积层,二维卷积操作,注意:激活函数不设置默认为恒等变换
- SeparableConv2D:高效的深度可分离卷积,将传统卷积分为两步走,巧妙的减少了参数,和Conv2D参数设置一致
- Conv2DTranspose:转置的卷积操作(反卷积)
- Conv3D:三维卷积操作,暂时没有用到
- Cropping1D:对一维的数据进行裁剪
- Cropping2D:对二维图像在长和宽上进行裁剪
- Cropping3D:暂不清楚
- UpSampling1D:上采样层
- UpSampling2D:类比同上
- UpSampling3D:类比同上
- ZeroPadding1D:在一维上进行0填充
- ZeroPadding2D:类比同上
- ZeroPadding3D:类比同上
- MaxPooling1D:一维信号上的最大池化
- MaxPooling2D:池化在CNN发展初期很重要的一种层,但是在后期被卷积层逐步替代(strides为2的卷积操作也能降低特征图尺寸,增大特征的感受野,也能学习出类似最大池化的计算形式,但是池化层的计算效率是比卷积高效很多的,就目前来说。)
- MaxPooling3D:对三维信号进行池化操作
- AveragePooling1D:平均池化,同上
- AveragePooling2D:平均池化,同上
- AveragePooling3D:平均池化,同上
- GlobalMaxPooling1D:全局最大池化
- GlobalMaxPooling2D:这个是现在流行起来的使用GAP或者GMP来代替全连接层,将每一单幅的特征图直接输出为一个值,要么是整张特征图的最大值要么是平均值,听说一片论文还做了实验,通过热图之类的图像,说明了全局池化可以帮助定位到识别的物体。
- GlobalAveragePooling1D:全局平均池化,同上
- GlobalAveragePooling2D:全局平均池化,同上
融合层:首字母小写后的函数即为他们对应封装,比如Add对应的就是add
- Add:顾名思义就是将多个tensor进行相加,输出shape不变(毋庸置疑),注意:接收的参数是一个列表[x1,x2,...]
- SubStract:输出的是两个tensor的差,输出shape不变,注意:接收的参数是一个列表[x1,x2,...]
- Multiply:接收一个列表,返回他们对应位置的乘积
- Average:接收一个列表,返回对应位置上的均值
- Maximum:接收一个列表,返回对应位置上的最大值
- Concatenate:接收一个列表,按照指定的维度进行拼接
- Dot:两个矩阵的张量乘积,注意里面的正则化参数。
高级激活层
- LeakyReLU:修正线性整流函数,是relu的修正版,relu在网络层的输出值在负值时,是出于死亡状态的,这对网络的性能是不利的,LeakyReLU正好抓住了这一点,在输出小于0时,仍会有输出值,公式为:f(x)=alpha*x when x<0,其中alpha为认为设置的参数
- PReLU:参数化的relu函数,公式和LeakyReLU差不多,但是它的alpha是可以学习的
- ELU:指数线性单元,f(x) = alpha * (exp(x) - 1.) when x < 0
- ThresholdedReLU:带有门限的激活函数,没用过,f(x) = x when x > theta, f(x) = 0 otherwise
批规范化层
- BatchNormalization:该层在每个batch上将前一层的激活值重新规范化,即使得其输出数据的均值接近0,其标准差接近1,注意:其中的center参数要设置为True。一般来说,偏置是单独加在BN层中的。
Keras中的网络配置一览
初始化方法
一般来说,权重的初始化为kernel_initializer,偏置的初始化为bias_initializer,后面既可以跟具体的函数名,如:kernel_initializer=ini(stddev=0.01),可以跟预定义的字符串,如:kernel_initializer='random_normal'),但是区别已经很显而易见了,使用具体的函数时可以设置参数。
- Zeros:全0初始化
- Ones:全1初始化
- Constant:初始化为固定值
- RandomNormal:正态分布初始化,当然需要设置均值和方差
- RandomUniform:均匀分布
- TruncatedNormal:截断的正态分布,位于两个标准差之外会被舍弃,该方法在之前是网络的标准初始化方式
- VarianceScaling:当scale为2.0时,即为he_normal
- Orthogonal:随机正交矩阵进行初始化,暂时没用到过
- Identiy:单位矩阵初始化,暂时没用到过
- lecun_uniform:[-limit, limit]的区间中均匀采样,其中limit=sqrt(3/fan_in)
- lecun_normal:由0均值,标准差为stddev = sqrt(1 / fan_in)的正态分布产生
- glorot_normal:就是Xavier正态分布初始化,与sigmoid函数配合使用
- he_normal:名的Kaiming初始化,和relu搭配之用效果更佳,它是一种自适应的初始化方法,根据输入和输出神经元的个数来决定截断正态分布的方差,可配置为三种模式:fan_in,fan_out,fan_avg
激活函数
Keras中可以使用单独的激活层,也可以在网络层中传递activation参数来实现
- softmax
- relu
- tanh
- sigmoid
- hard_sigmoid
- linear
- elu
- selu:可伸缩的指数线性单元
- softplus
- softsign
正则项
- kernel_regularizer:施加在权重上的惩罚项
- bias_regularizer:施加在偏置上的惩罚项
- activity_regularizer:施加在输出上的惩罚项,这个没用过
损失函数
- mean_squared_error或mse
- mean_absolute_error或mae
- mean_absolute_percentage_error或mape
- mean_squared_logarithmic_error或msle
- squared_hinge
- hinge
- categorical_hinge
- binary_crossentropy
- logcosh
- categorical_crossentropy:softmax交叉熵损失函数,标签为one_hot类型,可用
- sparse_categorical_crossentrop
- kullback_leibler_divergence:预测值概率分布Q到真值概率分布P的信息增益,用以度量两个分布的差异
- poisson
- cosine_proximity:预测值与真实标签的余弦距离平均值的相反数
优化算法
- SGD:随机梯度下降法
- RMSprop:常用在递归神经网络中,建议除学习率外,其他参数保持默认
- Adagrad:保持默认参数
- Adadelta:保持默认参数
- Adam:比较常用的优化器,保持默认参数
- Adamax:Adamax优化器来自于Adam的论文的Section7,该方法是基于无穷范数的Adam方法的变体
- Nadam:Adam本质上像是带有动量项的RMSprop,Nadam就是带有Nesterov 动量的Adam RMSprop
性能评估
在compile我们常常还会设置一个参数metrics,它是用来制定评估方式。性能评估函数类似与目标函数, 只不过该性能的评估结果讲不会用于训练.
- binary_accuracy:对二分类问题,计算在所有预测值上的平均正确率
- categorical_accuracy: 对多分类问题,计算再所有预测值上的平均正确率
- top_k_categorical_accracy:计算top-k正确率,当预测值的前k个值中存在目标类别即认为预测正确,在一些比赛中会让你给出top-k的准确率