TensorFlow正则化经常被用于Deep-Learn中,泛化数据模型,解决过拟合问题。再深度学习网络只有在有足够大的数据集时才能产生惊人的学习效果。当数据量不够时,过拟合的问题就会经常发生。然而,只选取我们需要的数据量的模型,就会非常难以继续进行泛化和优化。所以正则化技术孕育而生~~~~~~~
正则化的基本思想是向损失函数添加一个惩罚项用于惩罚大的权重,隐式的减少*参数的数量。可以达到弹性地适应不同数据量训练的要求而不产生过拟合的问题。~~~~~~
#正则化
import tensorflow as tf
import matplotlib.pyplot as plt
import numpy as np data = []
label = []
np.random.seed(0)
for i in range(150):
x1 = np.random.uniform(-1,1)
x2 = np.random.uniform(0,2)
if x1**2+x2**2 <= 1:
data.append([np.random.normal(x1,0.1),np.random.normal(x2,0.1)])
label.append(0)
else:
data.append([np.random.normal(x1,0.1),np.random.normal(x2,0.1)])
label.append(1) data = np.hstack(data).reshape(-1,2)
label = np.hstack(label).reshape(-1,1)
plt.scatter(data[:,0],data[:,1],c=label,
cmap="RdBu",vmin=-.2,vmax=1.2,edgecolor="white")
plt.show()
2.查看不同迭代中的变量取值的变化
v1 = tf.Variable(0,dtype=tf.float32)
step = tf.Variable(0,trainable=False)
ema = tf.train.ExponentialMovingAverage(0.99,step)
maintain_averages_op = ema.apply([v1])
with tf.Session() as sess:
#初始化
init_op = tf.global_variables_initializer()
sess.run(init_op)
print(sess.run([v1,ema.average(v1)]))
#更新变量v1的取值
sess.run(tf.assign(v1,5))
sess.run(maintain_averages_op)
print(sess.run([v1,ema.average(v1)]))
#更新step和v1的取值
sess.run(tf.assign(step,10000))
sess.run(tf.assign(v1,10))
sess.run(maintain_averages_op)
print(sess.run([v1,ema.average(v1)]))
#更新一次v1的滑动平均值
sess.run(maintain_averages_op)
print(sess.run([v1,ema.average(v1)])) #结果 [0.0, 0.0]
[5.0, 4.5]
[10.0, 4.5549998]
[10.0, 4.6094499]
note:优化器optimizer
tf的7种优化器
最常用的: GradientDescentOptimizer
tf.train.Optimizer
tf.train.GradientDescentOptimizer
tf.train.AdadeltaOptimizer
tf.train.AdagradOptimizer
tf.train.AdagradDAOptimizer
tf.train.MomentumOptimizer
tf.train.AdamOptimizer
tf.train.FtrlOptimizer
tf.train.ProximalGradientDescentOptimizer
tf.train.ProximalAdagradOptimizer
tf.train.RMSPropOptimizer