zoukankan      html  css  js  c++  java
  • TensorFlow——dropout和正则化的相关方法

    1.dropout

    dropout是一种常用的手段,用来防止过拟合的,dropout的意思是在训练过程中每次都随机选择一部分节点不要去学习,减少神经元的数量来降低模型的复杂度,同时增加模型的泛化能力。虽然会使得学习速度降低,因而需要合理的设置保留的节点数量。

    在TensorFlow中dropout的函数原型如下:def dropout(x, keep_prob, noise_shape=None, seed=None, name=None),各个参数的意义如下:

    x:输入的模型节点

    keep_prob:保持节点的比率,如果为1,则表示全部节点参与学习,如果为0.8,则表示丢弃20%的节点。

    noise_shape:设置指定的x中参与dropout计算的维度,如果为None,则表示所有的维度都参与计算,也可以设定某个维度,例如:x的形状为[ n, len, w, ch],使用noise_shape为[n, 1, 1, ch],这表明会对x中的第二维度和第三维度进行dropout。

    dropout改变了神经网络的网络结构,它仅仅是属于训练时的方法,所以在进行测试时要将dropout的keep_porb的值为1。

    x = tf.placeholder(tf.float32, [None, 784])
    y = tf.placeholder(tf.float32, [None, 10])
    
    keep_prob = tf.placeholder(tf.float32)
    
    w1 = tf.Variable(tf.random_normal([784, 30]))
    b1 = tf.Variable(tf.zeros([30]))
    w_h_1 = tf.add(tf.matmul(x, w1), b1)
    w_h_r_1 = tf.nn.sigmoid(w_h_1)
    w_h_r_drop_1 = tf.nn.dropout(w_h_r_1, keep_prob=keep_prob)
    
    w2 = tf.Variable(tf.random_normal([30, 30]))
    b2 = tf.Variable(tf.zeros([30]))
    w_h_2 = tf.add(tf.matmul(w_h_r_drop_1, w2), b2)
    w_h_r_2 = tf.nn.sigmoid(w_h_2)
    w_h_r_drop_2 = tf.nn.dropout(w_h_r_2, keep_prob=keep_prob)
    
    w3 = tf.Variable(tf.random_normal([30, 30]))
    b3 = tf.Variable(tf.zeros([30]))
    w_h_3 = tf.add(tf.matmul(w_h_r_drop_2, w3), b3)
    w_h_r_3 = tf.nn.sigmoid(w_h_3)
    w_h_r_drop_3 = tf.nn.dropout(w_h_r_3, keep_prob=keep_prob)
    
    w4 = tf.Variable(tf.random_normal([30, 10]))
    b4 = tf.Variable(tf.zeros([10]))
    w_h_4 = tf.add(tf.matmul(w_h_r_drop_3, w4), b4)
    w_h_r_4 = tf.nn.softmax(w_h_4)
    pred = tf.nn.dropout(w_h_r_4, keep_prob=keep_prob)
    
    
    cost = tf.reduce_mean(tf.reduce_sum(tf.square(pred - y)))
    feed_dict={x:batch_xs, y:batch_ys, keep_prob:0.7}

    2.正则化

    正则化是在神经网络计算损失值的过程中,在损失后面再加上一项。这样损失值所代表的输出与标准结果间的误差就会受到干扰,导致学习参数w 和 b无法按照目标方向来调整,实现模型无法与样本完全拟合,从而达到防止过拟合的效果。正则化主要有L1和L2正则,如下:

    L1:所有学习参数w的绝对值的和

    L2:所有学习参数w的平方和然后求平方根。

    如此,损失函数表达式如下:

    在TensorFlow中,已经封装好了相应的函数,L2的正则化函数为:tf.nn.l2_loss(t, name=None),L1的正则化函数需要自己组合,tf.reduce_sum(tf.abs(w))

    L2 = tf.nn.l2_loss(w1) + tf.nn.l2_loss(w2) + tf.nn.l2_loss(w3) +tf.nn.l2_loss(w4)
    
    cost = tf.reduce_mean(tf.reduce_sum(tf.square(pred - y))) + L2*0.01

    在使用正则化的时候,我们为正则化项设置一个权重的系数,注意这个权重系数的值,可以通过不断尝试来确定权重系数的值。

  • 相关阅读:
    Android 编程下的计时器
    Android 编程下 java.lang.NoClassDefFoundError: cn.jpush.android.api.JPushInterface 报错
    Android 编程下的 TraceView 简介及其案例实战
    Android 编程下的日志工具类
    C#设计模式--装饰器模式
    C#设计模式--设配器模式
    C#设计模式--原型模式
    C#设计模式--建造者模式
    C#设计模式--单例模式
    C#设计模式--抽象工厂模式
  • 原文地址:https://www.cnblogs.com/baby-lily/p/10964206.html
Copyright © 2011-2022 走看看