TensorfFlow2【5】常用网络层,激活函数,优化器

一.模型网络层

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值