TensorFlow深度神经网络配置

建议DNN配置

名称配置
权重初始化He initialization
激活函数ELU
归一化Batch Normalization
正则化dropout
优化器Adam
学习速率调整None

全连接层

from tensorflow.contrib.layers import fully_connected
with tf.name_scope("dnn"):
	hidden1 = fully_connected(X, n_hidden1, scope="hidden1")
	hidden2 = fully_connected(hidden1, n_hidden2, scope="hidden2")
	logits = fully_connected(hidden2, n_outputs, scope="outputs",activation_fn=None)

交叉熵

  1. sparse_softmax_cross_entropy_with_logits
  2. softmax_cross_entropy_with_logits

权重初始化

Xavier初始化和He(Kaiming)初始化,提高训练速度,避免梯度消失或爆炸

# fully_connected()默认用Xavier初始化(均匀分布)
# He初始化
he_init = tf.contrib.layers.variance_scaling_initializer()
hidden1 = fully_connected(X, n_hidden1, weights_initializer=he_init, scope="h1")

激活函数

  • ELU函数>leaky ReLU函 数(和它的变种) >ReLU函数>tanh函数>逻辑函数

  • 如果更关心运行时的性能,可以选择leaky ReLU函数,而不是ELU函数。

  1. Sigmoid激活函数

​ 梯度消失/爆炸

  1. ReLU激活函数

​ 神经元死亡,即它们只输出0。

  1. leaky ReLU(带泄漏线性整流函数)

​ 在大的图片数据集的情况下会比ReLU效果更好,但是在小的数据集时会有过拟合的风险。

def leaky_relu(z, name=None):
	return tf.maximum(0.01 * z, z, name=name)
hidden1 = fully_connected(X, n_hidden1, activation_fn=leaky_relu)
  1. ELU(加速 线性单元)

​ 计算速度比ReLU和它的变种慢 (因为使用了指数函数),但是在训练过程中,可以通过更快的收敛速度来弥补。然而,测试中, ELU网络时间慢于ReLU网络。

hidden1 = fully_connected(X, n_hidden1, activation_fn=tf.nn.elu)

批量归一化

  • 解决梯度消失/爆炸问题。
  • 每一批量归一化层来学习的: γ(缩放) , β(偏移) , μ(平均 值) 和σ(标准方差)。
  • 增加了模型复杂度,如果需要快速预测, 在进行批量归一化之前先检查一下 ELU+He初始化的表现如何。
  1. batch_normalization

​ 必须自己计算均值和标准方差、必须自己确定缩放和偏移参数

  1. batch_norm

​ batch_norm只中心化、归一化和对输入进行偏移操作,但是并不缩放(即γ固定为1)。

​ 对没有激活函数或者用ReLU激活函数的层是有效果的,但是对于其他的激活函数,需要设置"scale"为True。

import tensorflow as tf
from tensorflow.contrib.layers import batch_norm
n_inputs = 28 * 28
n_hidden1 = 300
n_hidden2 = 100
n_outputs = 10
X = tf.placeholder(tf.float32, shape=(None, n_inputs), name="X")
is_training = tf.placeholder(tf.bool, shape=(), name='is_training')
# 使用当前小批量的均值和标准方差(训练中),还是使用运行平均值(测试中)
bn_params = {
'is_training': is_training,
'decay': 0.99,
'updates_collections': None
}
hidden1 = fully_connected(X, n_hidden1, scope="hidden1",normalizer_fn=batch_norm, normalizer_params=bn_params)
hidden2 = fully_connected(hidden1, n_hidden2, scope="hidden2",normalizer_fn=batch_norm, normalizer_params=bn_params)
logits = fully_connected(hidden2, n_outputs, activation_fn=None,scope="outputs",normalizer_fn=batch_norm, normalizer_params=bn_params)

优化器

Adam优化

​ 动量衰减超参数β1通常被初始化为0.9,缩放衰减超参数通常被初始化为0.999。平滑项通常会设置为一个很小的数字, 比如10^-8。

optimizer = tf.train.AdamOptimizer(learning_rate=learning_rate)

学习速率调度

指数调度
initial_learning_rate = 0.1
decay_steps = 10000
decay_rate = 1/10
global_step = tf.Variable(0, trainable=False)
learning_rate = tf.train.exponential_decay(initial_learning_rate, global_step,decay_steps, decay_rate)
optimizer = tf.train.MomentumOptimizer(learning_rate, momentum=0.9)
training_op = optimizer.minimize(loss, global_step=global_step)

因为AdaGrad、 RMSProp和Adam优化在训练中自动降低了学习速率, 所以不需要额外加入。

提前停止

定期对验证集进行模型 评估(比如: 每50步) , 同时如果表现好于前一个“优胜者”快照就将此“优胜者”快照保存起来。 在保存最后一张“优胜者”快照的时候计算步数, 当步数达到某些限制(比如: 2000步) 时停止训练。 然后恢复最后一张“优胜者”快照。

正则化

l1_regularizer()、 l2_regularizer()和l1_l2_regularizer()

with arg_scope(
[fully_connected],
weights_regularizer=tf.contrib.layers.l1_regularizer(scale=0.01)):
	hidden1 = fully_connected(X, n_hidden1, scope="hidden1")
	hidden2 = fully_connected(hidden1, n_hidden2, scope="hidden2")
	logits = fully_connected(hidden2, n_outputs, activation_fn=None,scope="out")

不要忘记将正则化损失加到整体损失中

reg_losses = tf.get_collection(tf.GraphKeys.REGULARIZATION_LOSSES)
loss = tf.add_n([base_loss] + reg_losses, name="loss")

dropout

超参数p被称为丢弃率, 通常设置为 50%。

from tensorflow.contrib.layers import dropout

is_training = tf.placeholder(tf.bool, shape=(), name='is_training')
keep_prob = 0.5
X_drop = dropout(X, keep_prob, is_training=is_training)
hidden1 = fully_connected(X_drop, n_hidden1, scope="hidden1")
hidden1_drop = dropout(hidden1, keep_prob, is_training=is_training)
hidden2 = fully_connected(hidden1_drop, n_hidden2, scope="hidden2")
hidden2_drop = dropout(hidden2, keep_prob, is_training=is_training)
logits = fully_connected(hidden2_drop, n_outputs, activation_fn=None,scope="outputs")

模型过度拟合, 可以提高dropout速率(即降低 keep_prob超参数) 。 如果模型不拟合训练集, 需要降低 dropout速率(即提高keep_prob超参数) 。 同样针对大层可以帮助提高dropout速率, 针对小层可以降低。

摘自:机器学习实战第十一章

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值