过拟合:

真实的应用中,并不是让模型尽量模拟训练数据的行为,而是希望训练数据对未知做出判断。

模型过于复杂后,模型会积极每一个噪声的部分,而不是学习数据中的通用 趋势。当一个模型的参数比训练数据还要多的时候,这个模型就可以记忆这个所以训练数据的结果,而使损失函数为0.

避免过拟合的常用方法:正则化。在损失函数中加入刻画模型复杂程度的指标。损失函数:

J(θ)

引入正则化损失:J(θ)+λR(ω)

λ代表模型复杂损失在总损失的比列,R(ω)刻画的是模型的复杂程度。

模型的复杂程度由权重决定,一般。

常用的刻画模型复杂程度的函数R(ω)包括两种L1型正则和L2型正则。

loss=tf.ruduce_mean(tf.square(y_-y)+tf.contrib.layers.l2_ragularizer(lambda)(w))-----L2型正则的变量定义。、

除了引入正则化损失,还有避免过拟合的方法就是 加大训练数据 和 使用 Dropout。

 import tensorflow as tf
from sklearn.datasets import load_digits #从sklearn的数据集引入手写字体数据集
from sklearn.model_selection import train_test_split # 作用:将数据集划分为 训练集和测试集
from sklearn.preprocessing import LabelBinarizer #数据的预处理
#binarizer二值化 '''数据下载''' digits=load_digits() #导入手写字体的datasets
X=digits.data #获得其特征向量
y=digits.target #获得样本label
y=LabelBinarizer().fit_transform(y) #二值化[0,1,1....]
'''扩展sklearn.proprocessing.LabelBinarizer().fit_transform()'''
#lb=preprocessing.LabelBinarizer()
#>>> lb.fit_transform(['yes', 'no', 'no', 'yes'])
#array([[1],
# [0],
# [0],
# [1]])
X_train,X_test,y_train,y_test =train_test_split(X,y,test_size=.3)
# test_size:float-获得多大比重的测试样本 (默认:0.25)---int - 获得多少个测试样本
#数据集被划分为训练集和测试集,label必须二值化因为分类的结果就是binarizer '''生成层 函数'''
def add_layer(input,in_size,out_size,n_layer='layer',activation_function=None):
layer_name='layer %s' % n_layer
'''补充知识'''
#tf.name_scope:Wrapper for Graph.name_scope() using the default graph.
#scope名字的作用域
#sprase:A string (not ending with '/') will create a new name scope, in which name is appended to the prefix of all operations created in the context.
#If name has been used before, it will be made unique by calling self.unique_name(name).
with tf.name_scope('weights'):
Weights=tf.Variable(tf.random_normal([in_size,out_size]),name='w')
tf.summary.histogram(layer_name+'/wights',Weights)
#tf.summary.histogram:output summary with histogram直方图
#tf,random_normal正太分布
with tf.name_scope('biases'):
biases=tf.Variable(tf.zeros([1,out_size])+0.1)
tf.summary.histogram(layer_name+'/biases',biases)
#tf.summary.histogram:k
with tf.name_scope('Wx_plus_b'):
Wx_plus_b=tf.matmul(input,Weights)+biases
'''引入dropout,dropout添加在每一层的激活函数前'''
Wx_plus_b=tf.nn.dropout(Wx_plus_b,keep_prob)
#keep_prob 每个元素被留下来的概率
if activation_function==None:
outputs=Wx_plus_b
else:
outputs=activation_function(Wx_plus_b)
tf.summary.histogram(layer_name+'/output',outputs)
return outputs
'''准确率''' '''占位符'''
keep_prob = tf.placeholder(tf.float32)
xs=tf.placeholder(tf.float32,[None,64])
ys=tf.placeholder(tf.float32,[None,10]) '''添加层'''
l1=add_layer(xs,64,50,'l1',activation_function=tf.nn.softmax ) #据说其他激活函数会出错
prediction=add_layer(l1,50,10,activation_function=tf.nn.softmax)
#sotmax激活函数,用于分类函数 '''计算'''
#交叉熵cross_entropy损失函数,参数分别为实际的预测值和实际的label值y,re
'''补充知识'''
#reduce_mean()
# 'x' is [[1., 1. ]]
# [2., 2.]]
#tf.reduce_mean(x) ==> 1.5
#tf.reduce_mean(x, 0) ==> [1.5, 1.5]
#tf.reduce_mean(x, 1) ==> [1., 2.]
cross_entropy = tf.reduce_mean(-tf.reduce_sum(ys*tf.log(prediction),reduction_indices=[1]))
tf.summary.scalar('loss',cross_entropy)
'''补充知识'''
#reduce_sum
# 'x' is [[1, 1, 1]]
# [1, 1, 1]]
#tf.reduce_sum(x) ==> 6
#tf.reduce_sum(x, 0) ==> [2, 2, 2]
#tf.reduce_sum(x, 1) ==> [3, 3]
#tf.reduce_sum(x, 1, keep_dims=True) ==> [[3], [3]]
#tf.reduce_sum(x, [0, 1]) ==> 6
train_step=tf.train.GradientDescentOptimizer(0.5).minimize(cross_entropy)
merged=tf.summary.merge_all()
'''Session_begin'''
with tf.Session() as sess: #merged:tf.summary.merge_all:Merges all summaries collected in the default graph.
print("merged initialize sunccessfulliy")
train_writer=tf.summary.FileWriter('logs/train',sess.graph)
print("train_writer initialize sunccessfulliy")
test_writer=tf.summary.FileWriter('logs/test',sess.graph)
print("test_writer initialize sunccessfulliy")
sess.run(tf.global_variables_initializer())
print("variables initialize sunccessfulliy")
for i in range(1000):
#batch_xs,batch_ys=mnist.train.next_batch(100) #逐个batch去取数据
sess.run(train_step,feed_dict={xs:X_train,ys:y_train,keep_prob:0.6})
if(i%50==0):
#print(compute_accuracy(mnist.test.images,mnist.test.labels))
#train_result=sess.run(merged,feed_dict={xs:X_train,ys:y_train,keep_prob:1})
#test_result=sess.run(merged,feed_dict={xs:X_test,ys:y_test,keep_prob:1})
#train_writer.add_summary(train_result,i)
#test_writer.add_summary(test_result,i)
print(sess.run(cross_entropy,feed_dict={xs:X_test,ys:y_test,keep_prob:1}))
print("the {}".format(i))
05-11 17:35