TensorFlow1实现正则化

TensorFlow1中实现正则化的方法有多种,下面依次介绍

1.将loss包含的项手动加入collection

这种方法在创建层时要用最原始的api,如tf.nn.conv2d,因为需要手动创建变量并加入collection

#为全连接层创建变量w,计算其L2损失,并加入名为"losses"的collection中
w = tf.get_variable(name='w', shape=[384, 192], initializer=tf.truncated_normal_initializer(stddev=0.05))
regular = tf.multiply(tf.nn.l2_loss(w), 0.005, name='regular')
tf.add_to_collection('losses', regular)
#将交叉熵也加入"losses"collection中,并全部相加得到l2正则化后的loss
cross_entropy = tf.losses.softmax_cross_entropy(onehot_labels=record_labels, logits=y_predict)
tf.add_to_collection('losses', cross_entropy)
loss = tf.add_n(tf.get_collection('losses'))
2.使用get_variable中的regularizer参数

regularizer参数可设定该变量的正则化形式,并将其加入TensorFlow自带的一个正则化collection中,在variable_scope中也有regularizer参数,操作相同。
在高级一点的网络层api中,如tf.layers.conv2d,可使用kernel_regularizer参数定义变量的正则化形式

#定义一个regularizer
#regularizer = tf.contrib.layers.l2_regularizer(scale=0.1)(弃用)
regularizer=keras.regularizers.l2(0.001)
#创建变量时使用改regularizer
weights = tf.get_variable(
        name="weights",
        regularizer=regularizer,
        ...
    )
#得到保存正则化项的collection,并与原loss相加
reg_variables = tf.get_collection(tf.GraphKeys.REGULARIZATION_LOSSES)
loss = cross_entropy + tf.add_n(reg_variables)
#collection中的所有数据都是在一个list中,也可以通过另一种函数直接得到保存正则项的collection中的所有值之和
loss = cross_entropy + tf.losses.get_regularization_loss()
3.在Keras的层中使用kernel_regularizer参数

之前的正则化方式都需要手动将原损失和正则项加在一起,而更高级的Keras api中,在kernel_regularizer参数上定义正则化方式后,无需手动与原loss相加

model = keras.models.Sequential([
    keras.layers.Dense(16, kernel_regularizer=keras.regularizers.l2(0.001),
                       activation=tf.nn.relu, input_shape=(NUM_WORDS,)),
    keras.layers.Dense(16, kernel_regularizer=keras.regularizers.l2(0.001),
                       activation=tf.nn.relu),
    keras.layers.Dense(1, activation=tf.nn.sigmoid)
])
4.将网络中所有参数加上相同的正则系数
l2_loss = weight_decay * tf.add_n(
     [tf.nn.l2_loss(tf.cast(v, tf.float32)) for v in tf.trainable_variables()])
loss = cross_entropy + l2_loss
  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值