1. 初始化
默认情况下使用Glorot初始化
1.1 使用其他初始化
(1)lecun
kernel_initializer='lecun_normal'
(2)he初始化
kernel_initializer='he_normal'
2. 非饱和激活函数
2.1 LeakyRelu
keras.layers.LeakyRelu(alpha=0.2)
alpha为x<0时的斜率
2.1.1报错
AttributeError: module ‘keras.api._v2.keras.layers’ has no attribute ‘LeakyRelu’
import tensorflow as tf
tf.keras.layers.LeakyReLU(alpha=0.2)
2.2 PReLU
将α作为了需要学习的参数,该激活函数为PReLU
import tensorflow as tf
tf.keras.layers.PReLU()
同样的就可以使用PReLU
2.2.1 参数
tf.keras.layers.PReLU(
alpha_initializer='zeros',
alpha_regularizer=None,
alpha_constraint=None,
shared_axes=None,
**kwargs
)
2.3 RRelu
2.4 SELU
在创建层的时候设置activation='selu'
keras.layers.Dense(300,activation='selu',kernel_initializer='lecun_normal')
2.4.1 自归一化的条件
- 输入特征必须是标注化的
- 每一个隐藏层的权重必须使用LeCun正态初始化,即必须设置
kernel_initializer='lecun_normal'
- 网络的架构必须是顺序的
- 本论文仅在都是密集层的时候能保证自归一化
2.5 ELU
keras.layers.Dense(300,activation='elu',kernel_initializer='he_normal')
3. 批量归一化
keras.layers.BatchNormalization()
3.1 参数
tf.keras.layers.BatchNormalization(
axis=-1,
momentum=0.99,
epsilon=0.001,
center=True,
scale=True,
beta_initializer='zeros',
gamma_initializer='ones',
moving_mean_initializer='zeros',
moving_variance_initializer='ones',
beta_regularizer=None,
gamma_regularizer=None,
beta_constraint=None,
gamma_constraint=None,
**kwargs
)
- axis:需要被归一化的轴
- momentum:使用融合公式,代表倾向于新值的量
4. 梯度剪裁
使用梯度剪裁就需要对SGD进行设置,因此不能像之前一样
之前:
# model.compile(loss="sparse_categorical_crossentropy",optimizer='sgd',metrics=['accuracy'])
使用梯度剪裁(还是会报错):
optimizer=keras.optimizer.SGD(clipvalue=1.0)
model.compile(loss="mse",optimizer=optimizer,metrics=['accuracy'])
4.1 报错
AttributeError: module ‘keras.api._v2.keras’ has no attribute ‘optimizer’
optimizer=tf.keras.optimizers.SGD(clipvalue=1.0)
或者是直接 from tensorflow import keras
4.2 梯度剪裁的参数
- clipvalue
剪裁到限定范围内,可能会改变梯度向量的方向 - clipnorm(推荐!!!)
可以保留方向
5.迁移学习
不要直接在原模型上修改,会影响原模型的权重,使用clone_model(
)对模型进行克隆
5.1 克隆模型
使用clone_model
克隆模型(但是不会克隆权重)和get_weights
复制权重
model_clone=keras.models.clone_model(model)
model_clone.set_weights(model.get_weights())
新的输出层是随机初始化的,可能会产生较大的错误,因此存在较大的错误梯度,这颗可能会破坏重用的权重,一种方法是在前几个轮次冻结重用的层
使用trainable控制训练,冻结训练如下:
for layer in model_clone.layers[-1]:
layer.trainable=False
解冻之后可以降低学习率
5.2 小结
迁移学习在小型密集神经网络中不能很好的工作,最适合使用深度卷积神经网络
5.3 报错:TypeError: ‘PReLU’ object is not iterable
原代码
tf.keras.layers.PReLU()
报错
TypeError: 'PReLU' object is not iterable
6.优化器
6.1 动量优化
optimizer=keras.optimizers.SGD(lr=0.001,momentum=0.9)
动量为0.9通常在实验中效果很好
6.2 Nesterov 加速梯度
在使用优化器时nesterov=True
optimizer=keras.optimizers.SGD(lr=0.001,momentum=0.9,nesterov=True)
6.3 RMSProp
RMSProp完整的参数:
tf.keras.optimizers.RMSprop(
learning_rate=0.001,
rho=0.9,
momentum=0.0,
epsilon=1e-07,
centered=False,
name='RMSprop',
**kwargs
)
使用示例:
optimizer=keras.optimizers.RMSprop(lr=0.001,rho=0.9)
6.4 Adam 和 Nadam
在TensorFlow中提供的Adam及其变体主要包括:
使用示例
optimizer=keras.optimizers.Adam (lr=0.001,beta_1=0.9,beta_2=0.999)
重点关注beta_1,beta_2两个参数
beta_1通常被初始化为0.9,beta_2通常被初始化为0.999