接着上次的Keras入门继续深入学习,若对上次知识有点遗忘的,建议回顾回顾哈。1 >2 >
今天专门深入学习一下 Keras 的核心网络层,内容主要来自官方文档,按个人理解进行梳理,主要介绍Keras 核心Layers的含义,以及其调用方法,做到了然于胸。
? 前情回顾
前面的文章我们有讲到,Keras初始化一个模型一般有两种 API 方法:
1.序列式 (sequential)
2.函数式 (functional)
具体的模型简单构建可以参考入门指南,本节的内容主要是集中介绍一下Keras 的核心层 Dense 的用法。
01 Dense-全连接层
Keras的 Dense 也就是我们常听说的 全连接层 ,它主要包括了下面一些参数:
'''Dense用法'''
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)
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)
如果需要应用,则需要先初始化一个模型,这里统一用 Sequential(),同时记得,在第一次使用 Dense 的时候,需要指定输入的尺寸, 后面就可以省略了,如:
'''第一次使用 Dense 的时候,需要指定输入的尺寸'''
model=Sequential()
# 作为 Sequential 模型的第一层,指定输入尺寸为 28*28
model.add(Dense(input_dim=28*28,units=633,activation='sigmoid'))
# 在第一层之后,你就不再需要指定输入的尺寸了
model.add(Dense(units=633,activation='sigmoid'))
model.add(Dense(units=633,activation='sigmoid'))
model.add(Dense(units=10,activation='softmax'))
model=Sequential()
# 作为 Sequential 模型的第一层,指定输入尺寸为 28*28
model.add(Dense(input_dim=28*28,units=633,activation='sigmoid'))
# 在第一层之后,你就不再需要指定输入的尺寸了
model.add(Dense(units=633,activation='sigmoid'))
model.add(Dense(units=633,activation='sigmoid'))
model.add(Dense(units=10,activation='softmax'))
参数详解:
(1) units:指的是输出结果的维度,一般会省略写关键字units,直接写正整数。如:model.add(Dense(32, input_shape=(16,))),其中32就是units的参数值。
(2) activation:指的是激活函数,如果没有指定就默认不使用激活函数,可供选择的激活函数包括:softmax、elu(指数线性单元)、selu(可伸缩的指数线性单元)、softplus、softsign、relu(整流线性单元)、tanh(双曲正切激活函数)、sigmoid、hard_sigmoid、exponential(自然数指数激活函数)
不同激活函数有着不一样的参数,可以查看:https://keras.io/zh/activations/
(3) use_bias:是否使用 偏置项。
(4) kernel_initializer:权值矩阵的初始化。
(5) bias_initializer:偏置项的初始化。
(4)-(5)中可供选择的Initializer有:Zeros、random_uniform、Ones、Constant、RandomNormal等等,可以查看:https://keras.io/zh/initializers/
'''initializer的demo'''
model.add(Dense(units=64,
kernel_initializer=initializers.random_normal(stddev=0.01),
bias_initializer=initializers.Zeros()
))
model.add(Dense(units=64,
kernel_initializer=initializers.random_normal(stddev=0.01),
bias_initializer=initializers.Zeros()
))
(6) kernel_regularizer:权值矩阵的正则化。
(7) bias_regularizer:偏置项的正则化。
(8) activity_regularizer:输出层的正则化。
(6)-(8)的参数都是正则化相关的,也就是对各个网络层的参数或者激活情况进行惩罚,惩罚是以“layer”为对象的,目前Keras可供使用的正则化器有L1/L2/L1_L2,具体可以查看:https://keras.io/zh/regularizers/
'''regularizers的demo'''
model.add(Dense(units=64, input_dim=64,
kernel_regularizer=regularizers.l2(0.01),
activity_regularizer=regularizers.l1(0.01)))
model.add(Dense(units=64, input_dim=64,
kernel_regularizer=regularizers.l2(0.01),
activity_regularizer=regularizers.l1(0.01)))
(9) kernel_constraint:指的是权值矩阵的约束函数。
(10) bias_constraint:指的是偏置项的约束函数。
constraints模块允许在优化期间对网格参数设置约束(比如非负),约束也是以“layer”为对象的,目前可用的约束包括:MaxNorm(最大范数权值约束)、NonNeg(权重非负的约束)、UnitNorm(映射到每个隐藏单元的权值的约束)、MinMaxNorm(最小/最大范数权值约束),具体可以查看:https://keras.io/zh/constraints/
'''constraints的demo'''
model.add(Dense(units=64, input_dim=64,
kernel_constraint=constraints.MinMaxNorm(min_value=0.0, max_value=1.0, rate=1.0, axis=0),
bias_constraint=constraints.NonNeg()
))
model.add(Dense(units=64, input_dim=64,
kernel_constraint=constraints.MinMaxNorm(min_value=0.0, max_value=1.0, rate=1.0, axis=0),
bias_constraint=constraints.NonNeg()
))
02 Dropout
Dropout存在的目的也是为了防止过拟合的,但李宏毅教授里说到了,如果你的训练模型本身表现就不好了,就不要dropout了,只会越来越差的,在Keras里可以这么使用:
keras.layers.Dropout(rate, noise_shape=None, seed=None)
'''dropout的demo'''
model.add(Dropout(0.7))
'''dropout的demo'''
model.add(Dropout(0.7))
rate:取值在0~1之间,含义为需要 drop的比例(概率)noise_shape:1维的Tensorseed:随机种子,正整数
03 Flatten
Flatten是用来把高维输入进行一维化的,也就是把(height,width,channel)的数据压缩为 height x width x channel的一维数据,而且不影响batch的大小,常常用于卷积层到全连接层的过渡操作。
model = Sequential()
model.add(Conv2D(64, (3, 3),
input_shape=(3, 32, 32), padding='same',))
# 现在:model.output_shape == (None, 64, 32, 32)
model.add(Flatten())
# 现在:model.output_shape == (None, 65536)
model.add(Conv2D(64, (3, 3),
input_shape=(3, 32, 32), padding='same',))
# 现在:model.output_shape == (None, 64, 32, 32)
model.add(Flatten())
# 现在:model.output_shape == (None, 65536)
04 Reshape
对输入进行重新尺寸调整,使用方法如下:
'''Reshape的demo'''
# 作为 Sequential 模型的第一层
model = Sequential()
model.add(Reshape((3, 4), input_shape=(12,)))
# 现在:model.output_shape == (None, 3, 4)
# 注意:`None` 是批表示的维度
# 作为 Sequential 模型的中间层
model.add(Reshape((6, 2)))
# 现在:model.output_shape == (None, 6, 2)
# 还支持使用 `-1` 表示维度的尺寸推断
model.add(Reshape((-1, 2, 2)))
# 现在:model.output_shape == (None, 3, 2, 2)
# 作为 Sequential 模型的第一层
model = Sequential()
model.add(Reshape((3, 4), input_shape=(12,)))
# 现在:model.output_shape == (None, 3, 4)
# 注意:`None` 是批表示的维度
# 作为 Sequential 模型的中间层
model.add(Reshape((6, 2)))
# 现在:model.output_shape == (None, 6, 2)
# 还支持使用 `-1` 表示维度的尺寸推断
model.add(Reshape((-1, 2, 2)))
# 现在:model.output_shape == (None, 3, 2, 2)
05 Permute
对输入维度的位置进行置换,如:
'''Permute的demo'''
model = Sequential()
model.add(Permute((2, 1), input_shape=(10, 64)))
# 现在:model.output_shape == (None, 64, 10)
# 注意:`None` 是批表示的维度
model = Sequential()
model.add(Permute((2, 1), input_shape=(10, 64)))
# 现在:model.output_shape == (None, 64, 10)
# 注意:`None` 是批表示的维度
其中,Permute只有一个参数dims,索引从1开始,比如上述案例中 (2, 1)表示将第一和第二维度进行置换。
06 RepeatVector
指的是将输入的数据进行升维,参数为n,取值为正整数,如下所示,n=3表示将输入升至2维。
'''RepeatVector的demo'''
model = Sequential()
model.add(Dense(32, input_dim=32))
# 现在:model.output_shape == (None, 32)
# 注意:`None` 是批表示的维度
model.add(RepeatVector(3))
# 现在:model.output_shape == (None, 3, 32)
model = Sequential()
model.add(Dense(32, input_dim=32))
# 现在:model.output_shape == (None, 32)
# 注意:`None` 是批表示的维度
model.add(RepeatVector(3))
# 现在:model.output_shape == (None, 3, 32)
以上是对Dense全连接层常用的参数进行剖析,还有挺多参数的,大家如果要用Keras的话还得自己深入研究,本文只能说起到一个“抛砖引玉”的作用了,本文相关的代码我也打包好了,大家可以在公众号后台回复 dense 获取。
References
[1] https://keras.io/zh/
[2] https://blog.csdn.net/walilk/article/details/50278697
有话要说?
Q:
你在学习 Keras 的过程中遇到了哪些问题?
欢迎留言与大家分享