Tensorflow第六课--基于L2正则化损失函数的5层神经网络
发布时间:2018-05-13 22:18,
浏览次数:306
, 标签:
Tensorflow
这几天一直在看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')