一.模型网络层
1.全连接层
tf.keras.layers.Dense(
input_dim/input_shape, # 输入的个数(第一层要写,其它层可以不写)
units, # 输出的个数
activation=None, # 激活函数名称或实例,详见激活函数
kernel_initializer='glorot_uniform', # 参数初始化,详见参数初始化
kernel_regularizer=None, # 参数的正则化规则。'l1'/'l2',详见正则化
use_bias=True, # 卷积层后有BatchNorm或者InstanceNorm层时,最好设为False
bias_initializer='zeros', # 偏置量初始化
bias_regularizer=None, # 偏置的正则化
activity_regularizer=None, # 激活函数正则化
kernel_constraint=None,
bias_constraint=None,
name
)
2.卷积层
tf.keras.layers.Conv2D/Convolution2D(
filters, # 卷积核的数量,对应输出特征图的通道数
kernel_size, # 卷积核的尺寸(整数或元组)
strides, # 步长(整数或元组)
padding='valid', # padding方式,'same','valid'
activation=None, # 激活函数
)
3.池化层
- 最大池化(Max-Pooling):提取池化窗口区域内的最大值
- 平均池化(Mean-pooling):提取池化窗口区域内的平均值
- 随机池化(Stochastic-Pooling):随机提取池化窗口区域内的一个值(很少用)
tf.keras.layers.MaxPooling2D/MaxPool2D(
pool_size=(2, 2), # 池化窗口大小
strides=None, # 移动步长,默认和`pool_size`一样
padding='valid', # padding方式
**kwargs
input_shape=(28,28,1) # 单张图的行列通道数(只加在第一个卷积层)
)
tf.keras.layers.AveragePooling2D/AvgPool2D(
pool_size=(2, 2), # 池化窗口大小
strides=None, # 移动步长,默认和`pool_size`一样
padding='valid', # padding方式
**kwargs
)
4.BN层
tf.keras.layers.BatchNormalization(
epsilon=1e-3, # 默认0.001。防止分母为0
gamma_initializer='ones', # 线性变换γ的初始值
beta_initializer='zeros', # 线性变换β的初始值
scale=True, # 默认True。是否启用线性变换的γ
center=True, # 默认True。是否启用线性变换的β
)
5.Dropout(属于正则化的一种)
tf.keras.layers.Dropout(floatRate) # floatRate浮点数类型,所有神经元失活的比例
6.ZeroPadding2D
tf.keras.layers.ZeroPadding2D(
padding, # 扩充边界,3种输入方式
# 整数:以上下、左右对称的方式填充0
# 例子:1,表示上下各填充一行0,即:行数加2;左右各填充一列0,即:列数加2
# 2个整数的元组:第一个整数表示上下对称的方式填充0;第二个整数表示左右对称的方式填充0
# 例子:(1,2),表示上下各填充一行0,即:行数加2;左右各填充一列2,即:列数加4
# 2个整数的2个元组的元组:表示 ((top_pad, bottom_pad), (left_pad, right_pad))
data_format='channels_last', # 表示输入中维度的顺序。
# channels_last 对应输入形状 (batch, height, width, channels)
# channels_first 对应输入尺寸为 (batch, channels, height, width)。
)
7.UpSampling2D
tf.keras.layers.UpSampling2D(
size, # 2种输入方式
# 整数:上采样后行列都是原来的整数倍
# 2个整数的元组:上采样后行列都是原来的整数倍
# 例子:(1,2),行数是原来的1倍;列数是原来的2倍
data_format='channels_last',
# 表示输入中维度的顺序,“channels_last” (默认) 或 “channels_first”
# channels_last 对应输入形状 (batch, height, width, channels)
# channels_first 对应输入尺寸为 (batch, channels, height, width)。
interpolation='nearest':
# 插值方式`nearest`(默认) or `bilinear`.
)
8.Conv2DTranspose
tf.keras.layers.Conv2DTranspose(
filters: # 整数, 输出的维度
kernel_size: # 整数或元组,卷积核大小
strides: # 整数或元组,步长
padding: # "valid"`or`"same"`
activation: # 激活函数,非必须
use_bias: # 是否使用偏置
kernel_initializer: # 卷积核初始化方式(详见 `keras.initializers`).
kernel_regularizer, # 卷积核正则方式(详见 `keras.regularizers`).
)
9.Embedding
作用:获取每个词对应的词向量,对于多分类图片来说就是获取每个图在每个类对应的类别向量,将正整数(索引)转换为固定大小的稠密向量。
注意:只能被用在网络的第一层
# 实例化输入与输出(batch_size,input_length) -->(batch_size,input_length,output_dim)
tf.keras.layers.Embedding(
input_dim, 词汇表大小(或类别总数)
output_dim, 稠密嵌入矩阵的维度,即词语向量的维度(或转换后的输出通道数)
input_length=None,表示文本词序列的长度(单个样本的特征数)(后面接Dense是必须设置该参数)
embeddings_initializer='uniform'
)
10.GlobalAveragePooling2D
(NHWC)->(NC) 全局平均,每个通道得出一个平均数,返回通道个数
input_shape = (2, 4, 5, 3)
x = tf.random.normal(input_shape)
y = tf.keras.layers.GlobalAveragePooling2D()(x)
print(y.shape) # (2, 3)
二.激活函数
x = np.linespace(-10,10,1000)
y = tf.nn.sigmoid(x) # sigmoid [0,1]
y = tf.nn.tanh(x) # tanh [-1,1]
y = tf.nn.relu(x) # tanh (x≤0,y=0;x>0,y=x)
y = tf.nn.leaky_relu(x) # leakrelu (x≤0,y=-αx;x>0,y=x)
y = tf.nn.softmax(x) # softmax
或
tf.keras.activations.*
三.参数初始化
对于神经网络来说,需要初始化的参数有两类:权重W与偏置B,B一般为0。
初始化种类:
- 随机(/正态)初始化:随机初始化从均值为0,标准差是1的高斯分布中取样,使用一些很小的值对参数W进行初始化
- 标准初始化:标准初始化从区间(-1/√d,1/√d)均匀分布生产的权重中随机取值,d为每个神经元的输入数量。
使用方式:
- 一般使用:
initializer = tf.keras.initializers.glorot_nonrmal()
values = initializer(shape=(2, 2))
- 网络层中使用:
initializer = tf.keras.initializers.glorot_nonrmal()
layer = tf.keras.layers.Dense(3, kernel_initializer=initializer)
Glorot初始化和Kaiming初始化
# 1.Xavier(Glorot初始化)
# 基本思想是各层的 激活值 和 梯度的方差 在传播过程中保持一致。
initializer = tf.keras.initializers.glorot_nonrmal()
initializer = tf.keras.initializers.glorot_uniform()
# 2.He(Kaiming初始化)
# 基本思想是正向传播时,激活值的方差保持不变;反向传播时,关于状态值的梯度的方差保持不变。
initializer = tf.keras.initializers.he_nonrmal()
initializer = tf.keras.initializers.he_uniform()
四.正则化(过拟合问题)
1.L1和L2回归(适用浅机器学习)
l1 = tf.keras.regularizers.l1(l1=0.01)
l2 = tf.keras.regularizers.l2(l2=0.01)
l12 = tf.keras.regularizers.l1_l2(l1=0.01,l2=0.01)
model.add(tf.keras.layers.Dense(16,kernel_regularizer=l1,activation='relu'))
2.Dropout
3.BN
五.损失函数
bce = tf.keras.losses.BinaryCrossentropy() # 二分类 'binary_crossentropy'
cce = tf.keras.losses.CategoricalCrossentropy() # 多分类 'categorical_crossentropy'
mae = tf.keras.losses.MeanAbsoluteError() # 回归 'mae'
mse = tf.keras.losses.MeanSquaredError() # 回归 'mse'
smoothL1 = tf.keras.losses.Huber() # 回归 'huber_loss'
六.优化器
# 1.SGD(小批量数据集)
tf.keras.optimizers.SGD(
learning_rate # 学习率,默认为0.01
momentum # Momentum动量算法参数,默认为0
nesterov # 是否使用Nesterov动量,默认false
name # 应用名称,默认'SGD'
)
# 2.Momentum(对梯度进行修正,保留之前的更新方向,增加稳定性)
tf.keras.optimizers.SGD(learning_rate=0.01,momentum=0.9)
# 3.AdaGrad(训练时自动修正学习率)
tf.keras.optimizers.Adagrad(
learning_rate=0.001,
epsilon=1e-07,
initial_accmulator_value=0.1 # 加速器起始值必须为非负值
)
# 4.RMSprop(优化AdaGrad,加快速度)
tf.keras.optimizers.RMSprop(
learning_rate=0.001,
rho=0.9, # β的值
epsilon=1e-07,
centered=False,
momentum=0.0
)
# 5.Adam(对梯度和学习率都修正)
tf.keras.optimizers.Adam(
learning_rate=0.001, # α
beta_1=0.9, # β1
beta_2=0.999, # β2
epsilon=1e-7
)
五.学习率退火(学习率随着训练而变化)
# 1.分段常数衰减
lrfn = tf.keras.optimizers.schedules.PiecewiseConstantDecay(
boundaries, # 分段更新的区间。例如 [1000,1100]
values # 不同区间的学习率 例如 values=[0.1,0.01,0.001]
)
# 2.指数衰减(α=α0e^(step / decay_steps))
lrfn = tf.keras.optimizers.schedules.ExponentialDecay(
initial_learning_rate, # 初始学习率α0
decay_steps=100000, # k值
decay_rate=0.96, # 指数的底e
staircase=True
)
# 3.1/t衰减(α=α0/(1+kt))
lrfn = tf.keras.optimizers.schedules.InverseTimeDecay(
initial_learning_rate=0.1, # 初始学习率α0
decay_steps=1, # k=decay_rate/decay_steps
decay_rate=0.5
)
# 使用
model.compile(
optimizer=tf.keras.optimizers.SGD(learning_rate=lrfn),
loss='sparse_categorical_crossentropy',
metrics=['accuracy']
)
六.回调函数
# 1.EarlyStopping
tf.keras.callbacks.EarlyStopping(
monitor='val_loss', # 默认监控验证集损失率来进行提前停止。'val_accuracy','loss','accuracy'
patience=0, # 被监控属性没有连续提高或下降便停止的周期数
verbose=0 # 等于1时,停止训练时提示 early stopping
)
# 使用
es = tf.keras.callbacks.EarlyStopping(monitor='val_loss',patience=10,verbose=1)
model.fit(x,y,epochs=10,batch_size=32,validation_data=(x_test,y_test),callbacks=[es])
简单总结一下
1.激活函数的选择
-
隐藏层:
- 优先选择RELU激活函数(注意Dead Relu问题采用Xavier初始化方法)
- 其次LeakRule
- 可以使用tanh激活函数
- 不能使用sigmoid激活函数
-
输出层:
- 二分类 ---- sigmoid 激活函数
- 多分类 ---- softmax 激活函数
- 回归 ------- linear线性激活函数
- 其他 tanh
-
Dead Relu问题解决
- 使用LeakRule
- 使用L2正则化
- 采用Xavier初始化方法
2.损失函数的选择
- 二分类 ---- BinaryCrossentropy 二分类交叉熵损失函数
- 多分类 ---- CategoricalCrossentropy 多分类交叉熵损失函数
- 回归 ------- MAE,MSE,HUBER 损失函数
3.优化器选择
Adam