MLK | Keras 核心网络层的解读指南

640?wx_fmt=png
接着上次的Keras入门继续深入学习,若对上次知识有点遗忘的,建议回顾回顾哈。
1 >  
2 >  


今天专门深入学习一下 Keras 的核心网络层,内容主要来自官方文档,按个人理解进行梳理,主要介绍Keras 核心Layers的含义,以及其调用方法,做到了然于胸。


? 前情回顾


640?wx_fmt=png
前面的文章我们有讲到,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)
如果需要应用,则需要先初始化一个模型,这里统一用 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'))


参数详解:
(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()
              ))
(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)))
(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()
              ))


02 Dropout

Dropout存在的目的也是为了防止过拟合的,但李宏毅教授里说到了,如果你的训练模型本身表现就不好了,就不要dropout了,只会越来越差的,在Keras里可以这么使用:
 
 
keras.layers.Dropout(rate, noise_shape=None, seed=None)

'''dropout的demo'''
model.add(Dropout(0.7))
rate:取值在0~1之间,含义为需要 drop的比例(概率)
noise_shape:1维的Tensor
seed:随机种子,正整数


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)


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)


05 Permute

对输入维度的位置进行置换,如:
 
 
'''Permute的demo'''
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)


以上是对Dense全连接层常用的参数进行剖析,还有挺多参数的,大家如果要用Keras的话还得自己深入研究,本文只能说起到一个“抛砖引玉”的作用了,本文相关的代码我也打包好了,大家可以在公众号后台回复 dense 获取。


References

[1] https://keras.io/zh/
[2] https://blog.csdn.net/walilk/article/details/50278697



有话要说?


Q:   你在学习 Keras 的过程中遇到了哪些问题?
欢迎留言与大家分享


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值