前言:这一章介绍的就是一些tensorflow封装好的函数,以及函数的意义。
本章主要介绍一下结合tensorflow中几个比较常见的优化器,batchnorm, 和 Dropout
文章中举了一个很好的关于神经网络优化参数的例子, 你现在在大沙漠之中眼睛被蒙住了,但是你知道沙漠最低处有水喝,问你怎么找到沙漠中最低点。
第一种方法:没读过书的人 随便找,拼运气,显然这种情况下死的概率很大
第二种方法:读过书的人就想我要找最低点,我把叫脚360的探索一圈,我感觉那个位置上最低我就向那个方向移动, SGD(随机梯度下降法)
所以SGD的优化参数就想贪心算法一下,每次我只想现在优化到最大的可能:,
SGD算法优化的步骤:
第一:找到初始位置(对应的就是你在沙漠中那个位置)
第二:计算神经网络的反向传播的偏导(对应就是你转了360全之后找到下一步的位置)
第三:定义一个常量(学习率)按照SGD计算公式修改参数,
# 深度学习入门书上的代码,在原来的代码基础上增加了一个绘制优化函数代码,
import numpy as np
import matplotlib.pyplot as plt
from collections import OrderedDict
from mpl_toolkits.mplot3d import Axes3D
def f(x, y):
return x**2 + y**2
def df(x, y):
return 2.0*x, 2.0*y
class SGD:
"""随机梯度下降法(Stochastic Gradient Descent)"""
def __init__(self, lr=0.01):
self.lr = lr
def update(self, params, grads):
for key in params.keys():
params[key] -= self.lr * grads[key]
# 定义函数初始的优化的位置
init_pos = (-5, 5)
params = {}
params['x'], params['y'] = init_pos[0], init_pos[0]
# 定义SGD下降的方向
grads = {}
grads['x'], grads['y'] = 0, 0
optimizers = OrderedDict()
optimizers["SGD"] = SGD(lr=0.1)
idx = 1
for key in optimizers:
optimizer = optimizers[key]
x_history = []
y_history = []
params['x'], params['y'] = init_pos[0], init_pos[1]
for i in range(100):
x_history.append(params['x'])
y_history.append(params['y'])
grads['x'], grads['y'] = df(params['x'], params['y'])
optimizer.update(params, grads)
x = np.arange(-10, 10, 0.1)
y = np.arange(-10, 10, 0.1)
fig = plt.figure()
ax = Axes3D(fig)
X, Y = np.meshgrid(x, y)
Z = f(X, Y)
# 绘制函数的立体图像
ax.plot_surface(X, Y, Z, cmap='rainbow')
plt.show()
# for simple contour line
mask = Z > 7
Z[mask] = 0
plt.plot(x_history, y_history, 'o-', color="red")
# plt.contour() 函数表示绘制等高线
plt.contour(X, Y, Z)
plt.ylim(-5, 5)
plt.xlim(-5, 5)
plt.plot(0, 0, '+')
plt.title(key)
plt.xlabel("x")
plt.ylabel("y")
print("",grads['x'], grads['y'])
plt.show()
# 实验结果:
原始函数的空间图像
SGD的优化行走过程
经过100步之后, SGD找到的最小值的位置, 我们可以发现已经很接近0了 SGD验证成功
-2.5462949704181095e-09 2.5462949704181095e-09