这几天一直在看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')