# 深度学习与神经网络:正则化小栗子(附代码)

1:什么是正则化?

√正则化：在损失函数中给每个参数 w 加上权重，引入模型复杂度指标，从而抑制模型噪声，减小 过拟合。

loss = loss(y 与 y_) + REGULARIZER*loss(w)

2:正则化如何计算?

① L1 正则化： 𝒍𝒐𝒔𝒔𝑳𝟏 = ∑𝒊 |𝒘𝒊 |

loss(w) = tf.contrib.layers.l1_regularizer(REGULARIZER)(w)

② L2 正则化： 𝒍𝒐𝒔𝒔𝑳𝟐 = ∑𝒊 |𝒘𝒊 | 𝟐

loss(w) = tf.contrib.layers.l2_regularizer(REGULARIZER)(w)

③:用 Tesnsorflow 函数实现正则化：

```代码:
import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt
'''制作数据集'''
BATCH_SIZE = 30
SEED = 100
#产生随机数
rdm = np.random.RandomState(SEED)
X = rdm.randn(300,2)  #随机三百行两列的数
Y_ = [int(x0 * x0 + x1 * x1 < 2) for (x0, x1) in X]
#从X中获取,得到正确Y
Y_c = [['red' if y else 'blue']for y in Y_] #y_中标注颜色
X = np.vstack(X).reshape(-1,2)
Y_ = np.vstack(Y_).reshape(-1,1)
plt.scatter(X[:,0],X[:,1],c = np.squeeze(Y_c))#横坐标的第一二列元素
plt.show()
'''定义神经网络'''
def get_weight(shape,regularizer):
w = tf.Variable(tf.random_normal(shape),dtype=tf.float32)
return w

def get_bias(shape):
b  = tf.Variable(tf.constant(0.01,shape=shape))
return b

x = tf.placeholder(tf.float32,shape=(None,2))
y_ = tf.placeholder(tf.float32,shape=(None,1))
#隐藏层
w1 = get_weight([2,11],0.01)
b1 = get_bias([11])
y1 = tf.nn.relu(tf.matmul(x,w1)+b1)
#输出层
w2 = get_weight([11,1],0.01)
b2 = get_bias([1])
y = tf.matmul(y1,w2)+b2
#损失函数
lose_mse  = tf.reduce_mean(tf.squeeze(y-y_))
#定义反向传播,无正则化

with tf.Session() as sess:
init_op = tf.global_variables_initializer()
sess.run(init_op)
STEPS = 40000
for i in range(STEPS):
start  = (i*BATCH_SIZE)%300
end  = start+BATCH_SIZE
sess.run(train_step,feed_dict={x:X[start:end],y_:Y_[start:end]})
if i%2000 ==0:
lose_mse_v = sess.run(lose_mse,feed_dict={x:X,y_:Y_})
print("after %d step,loss is:%f"%(i,lose_mse_v))
xx,yy = np.mgrid[-3:3:.01,-3:3:.01]
grid  = np.c_[xx.ravel(),yy.ravel()]
probs  = sess.run(y,feed_dict={x:grid})
probs = probs.reshape(xx.shape)
print("w1:\n",sess.run(w1))
print("b1:\n",sess.run(b1))
print("w2:\n",sess.run(w2))
print("b2:\n",sess.run(b1))

plt.scatter(X[:,0], X[:,1],c = np.squeeze(Y_c))
plt.contour(xx,yy,probs,levels = [.5])
plt.show()
# 定义反向传播方法：包含正则化

with tf.Session() as sess:
init_op = tf.global_variables_initializer()
sess.run(init_op)
STEPS = 40000
for i in range(STEPS):
start = (i * BATCH_SIZE) % 300
end = start + BATCH_SIZE
sess.run(train_step, feed_dict={x: X[start:end], y_: Y_[start:end]})
if i % 2000 == 0:
loss_v = sess.run(lose_total, feed_dict={x: X, y_: Y_})
print("After %d steps, loss is: %f" % (i, loss_v))

xx, yy = np.mgrid[-3:3:.01, -3:3:.01]
grid = np.c_[xx.ravel(), yy.ravel()]
probs = sess.run(y, feed_dict={x: grid})
probs = probs.reshape(xx.shape)
print
"w1:\n", sess.run(w1)
print
"b1:\n", sess.run(b1)
print
"w2:\n", sess.run(w2)
print
"b2:\n", sess.run(b2)

plt.scatter(X[:, 0], X[:, 1], c=np.squeeze(Y_c))
plt.contour(xx, yy, probs, levels=[.5])
plt.show()```

0 条评论

• ### Tensorflow 笔记：搭建神经网络

用张量表示数据，用计算图搭建神经网络，用会话执行计算图，优化线上的权重（参数），得到模型。

• ### NLP系列学习：潜在语义牵引

关于主题模型这一块是比较特殊的,这期间也给我带来了一些困惑,因为其中的一些算法和我们在机器学习中使用的算法还是很不同的,在这篇文章里,我想简单介绍下LSI(潜在...

• ### 用函数拟合能力解释神经网络

从下图中，我们很容易观察出来有3个转折点，而且红色曲线也基本可以拟合上蓝色曲线了。

• ### tf.truncated_normal_initializer

从截断的正态分布中输出随机值。生成的值服从具有指定平均值和标准偏差的正态分布，如果生成的值大于平均值2个标准偏差的值则丢弃重新选择。

• ### 带alpha透明通道视频—网页播放带alpha通道视频叠加合成方案

带alpha通道的图片有GIF和PNG，但是GIF只有8位，失真严重，边缘锯齿非常明显。

• ### Centos7 禁止ping的几种方式

通过修改配置方式禁止ping后，内部ping也将失效，通过防火墙方式禁止ping后，可以ping自己内部网络。

• ### jinfo Java配置信息工具

jinfo 还可以使用 -sysprops 选项把虚拟机进程的 System.getProperties() 的内容打印出来。在运行期修改参数使用-flag...

• ### Top 5 Google Cloud Tools for Application Development

Top Google Cloud tools for web application development. Google gives a wide scop...