Tensorflow第六课--基于L2正则化损失函数的5层神经网络

本文介绍使用TensorFlow实现L2正则化的方法,并通过构建一个五层神经网络来解决过拟合问题。文章详细展示了如何定义损失函数,并在其中加入正则化项以限制模型复杂度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这几天一直在看Tensorflow:实战google深度学习框架。感觉这本书真的写的很好,尤其是对于Tensorflow之前毫无所知的我,通过这本书也能学懂并且了解很多。今天我主要是学习了损失函数。添加损失函数的主要目的是解决在训练过程中的过拟合问题。正则化的思想就是在损失函数中加入刻画模型复杂程度的指标。假设用于刻画模型训练数据上表现的损失函数是J(a),那么在优化时不是直接进行优化J(a),而是优化J(a)+bR(w)。R(w)表示刻画模型的复杂程度,而b表示模型复杂损失在总损失中的比例。a表示一个神经网络中所有的参数,包括权重和偏置值。

L1正则化计算公式:

                                         

L2正则化计算公式:

                                                

无论是哪个正则化表示方式,其主要目的都是希望通过限制权重的大小,使得模型不能任意的你和训练数据中的随机噪音。Tensorflow中集成了正则化损失函数方法。

w = tf.Variable(tf.random_normal([2, 1], stddev = 1, seed = 1), dtype=tf.float32) #其中stddev是方差,seed是种子。
y = tf.matmul(x, w)
loss = tf.reduce_mean(tf.square(y_ - y) + tf.contrib.layers.l2_regularizer(lamada)(w))
下面代码是利用完整的mnist数据集实现带有L2正则化函数的5层神经网络代码的成功实现,供你们参考。菜菜的我可是用了大半天才运行成功,总是报错,可能是我对tensorflow还不是很熟悉,但是每次练习都是一个成长的过程。
#-*- coding:utf-8 -*-
import tensorflow as tf
import input_data
def get_weight(shape, lamada,session):
    var = tf.Variable(tf.random_normal(shape,stddev=1.0), dtype=tf.float32)
    sess.run(tf.global_variables_initializer())
    #print sess.run(var)
    tf.add_to_collection('losses', tf.contrib.layers.l2_regularizer(lamada)(var))
    return var
#input_data:用于训练和测试的MNIST数据集的源码
mnist = input_data.read_data_sets("MNIST_data/", one_hot=True) #download the data of train and testm
trainimage = mnist.train.images
trainLabel = mnist.train.labels
trainimageSize = mnist.train.images.size
trainLabelSize = mnist.train.labels.size
print trainimageSize,trainLabelSize
testimage = mnist.test.images
testlabel = mnist.test.labels
testimageSize = mnist.test.images.size
testlabelSize = mnist.test.labels.size
print testimageSize,testlabelSize
x = tf.placeholder("float", [None, 784])
layer_dimension = [784, 10, 10, 10, 1]
n_layers = len(layer_dimension)
y_ = tf.placeholder("float", [None, 1])
# 在机器学习的模型中,我们需要定义一个衡量模型好坏的方式,称为代价函数(Cost Loss),这里使用了交叉熵去衡量 reduce_sum 累加
init = tf.initialize_all_variables()
with tf.Session() as sess:
    import numpy as nf
    sess.run(init)
    for i in range(1):
        batch = mnist.train.next_batch(5)
       # sess.run(train_step, feed_dict={x: batch[0],y_: batch[1]})
        for i1 in range(5):
            print "i1:", i1
            #cur_layer = tf.constant([batch[0][i1]],dtype=tf.float32)
            cur_layer = nf.array([batch[0][i1]], nf.float32)
           # print cur_layer.tolist()
            in_dimension = layer_dimension[0]
            for i2 in range(1, n_layers):
                print "i2:",i2
                out_dimension = layer_dimension[i2]
                weight = get_weight([in_dimension, out_dimension], 0.001,sess)
                print "weight:",sess.run(weight)
                bias = tf.Variable(tf.constant(0.1, shape=[out_dimension]))
                a = tf.global_variables_initializer()
                sess.run(a)
                print "bias",sess.run(bias)
                print "zhi:",tf.matmul(cur_layer, weight)
                cur_layer = tf.nn.sigmoid(tf.matmul(cur_layer, weight) + bias)
                print sess.run(cur_layer)
                in_dimension = layer_dimension[i2]
            mse_loss = tf.reduce_mean(tf.square(batch[1][i1] - cur_layer))
            tf.add_to_collection('losses', mse_loss)
        loss = tf.add_n(tf.get_collection('losses'))
        print sess.run(mse_loss)
        print sess.run(loss)
        tf.get_default_graph().clear_collection('losses')


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值