当前位置: 首页 > 工具软件 > Trick > 使用案例 >

trick用法及其作用大总结

郎曜文
2023-12-01

trick用法及其作用大总结

1. L2正则化

作用:防止过拟合 提高泛化能力
用法:
①首先是定义一个带有L2正则化的 初始化权重weight的函数

# 使用正太分布初始化权重并添加L2正则化,使用w1控制L2损失的大小
def variable_with_weight_loss(shape, stddev, w1):
    # 从截断的(2个标准差以内)正态分布中输出随机值
    var = tf.Variable(tf.truncated_normal(shape, stddev=stddev))
    if w1 is not None:
        # l2_loss(var)*w1
        weight_loss = tf.multiply(tf.nn.l2_loss(var), w1, name='weight_loss')
        # 使用默认图
        tf.add_to_collection('losses', weight_loss)
    return var

把var返回给weight
我的理解w1就相当于无恩达课程里面的
②在给weight确定具体形式时候规定 w1 等等 w1=0.004等等

weight1 = variable_with_weight_loss(shape=[5, 5, 3, 64], stddev=5e-2, w1=0.0)

再如

weight3 = variable_with_weight_loss(shape=[dim, 384], stddev=0.04, w1=0.004)

即可完成L2正则化
③要将tf.add_to_collection(‘losses’, weight_loss)决定的losses先与cross_entropy求和,定义最终的loss

def loss(logits, labels):
    labels = tf.cast(labels, tf.int64)
    # 计算logits和labels之间的稀疏softmax交叉熵
    cross_entropy = tf.nn.sparse_softmax_cross_entropy_with_logits(
        logits=logits, labels=labels, name='cross_entropy_per_example')
    # 计算cross_entropy均值
    cross_entropy_mean = tf.reduce_mean(cross_entropy, name='cross_entropy')
    # 将cross_entropy的loss添加到整体的loss里
    tf.add_to_collection('losses', cross_entropy_mean)
    # 将整体losses的collection中的全部loss求和
    return tf.add_n(tf.get_collection('losses'), name='total_loss')

2.使用LRN对结果进行处理-Local Response Normalization-本地响应标准化

作用:增强大的抑制小的,增强泛化能力,防止过拟合
用法:有时候卷积relu之后 或者是 池化之后 跟一个

pool1 = tf.nn.max_pool(conv1, ksize=[1, 3, 3, 1], strides=[1, 2, 2, 1], padding='SAME')
# 使用LRN对结果进行处理-Local Response Normalization-本地响应标准化
# 增强大的抑制小的,增强泛化能力
norm1 = tf.nn.lrn(pool1, 4, bias=1.0, alpha=0.001/9.0, beta=0.75)

再如

conv2 = tf.nn.relu(tf.nn.bias_add(kernel2, bias2))
# LRN-本地响应标准化
norm2 = tf.nn.lrn(conv2, 4, bias=1.0, alpha=0.001/0.9, beta=0.75)

3.启动图片数据增强的线程队列

作用:在图像的深度学习中,为了丰富图像训练集,更好的提取图像特征,泛化模型(防止模型过拟合),一般都会对数据图像进行数据增强,数据增强,常用的方式,就是旋转图像,剪切图像,改变图像色差,扭曲图像特征,改变图像尺寸大小,增强图像噪音(一般使用高斯噪音,盐椒噪音)等
用法:以cifar数据集为例:
①在构造数据的时候用distorted

images_train, labels_train = cifar10_input.distorted_inputs(data_dir=data_dir,
batch_size=batch_size)


在sess之后写上

# 启动图片数据增强的线程队列
tf.train.start_queue_runners()

4.滑动平均操作

作用:防止过拟合
用法:
①先在程序开头规定一个滑动平均衰减率

MOVING_AVERAGE_DECAY=0.99

②为了更好说明 复制粘贴最佳样例程序的一段
因为这里涉及到变量更新的问题

    global_step=tf.Variable(0,trainable=False)#初始化钟表0,使其为不可被训练更新

#定义损失函数 学习率 滑动平均操作和训练过程
    variable_averages=tf.train.ExponentialMovingAverage(
        MOVING_AVERAGE_DECAY,global_step)
    variable_averages_op=variable_averages.apply(
        tf.trainable_variables())#可更新的变量全部更新
    cross_entropy=tf.nn.sparse_softmax_cross_entropy_with_logits(
        logits=y,labels=tf.argmax(y_,1))
    cross_entropy_mean=tf.reduce_mean(cross_entropy)
    loss=cross_entropy_mean+tf.add_n(tf.get_collection('losses'))
    learning_rate=tf.train.exponential_decay(
        LEARNING_RATE_BASE,
        global_step,
        mnist.train.num_examples / BATCH_SIZE,#存疑这个是怎么来的
        LEARNING_RATE_DECAY)
    train_step=tf.train.GradientDescentOptimizer(learning_rate).minimize(loss,global_step=global_step)
    with tf.control_dependencies([train_step,variable_averages_op]):
        train_op=tf.no_op(name='train')#保证train之前参数被刷新

5.学习率指数衰减

作用:同时保证优化速度和收敛性
用法:
①先规定基础学习率和学习率衰减指数

LEARNING_RATE_BASE=0.01
LEARNING_RATE_DECAY=0.99


在loss后面单独规定学习率
注意这之前也要规定global_step

learning_rate=tf.train.exponential_decay(
        LEARNING_RATE_BASE,
        global_step,
        mnist.train.num_examples / BATCH_SIZE,#更新次数
        LEARNING_RATE_DECAY)
    train_step=tf.train.GradientDescentOptimizer(learning_rate).minimize(loss,global_step=global_step)
    with tf.control_dependencies([train_step,variable_averages_op]):
        train_op=tf.no_op(name='train')#保证train之前参数被刷新
 类似资料: