Tensorflow机器学习,学习反向传播过程
简介
——搭建一个简单的神经网络
——前向传播
——方向传播过程
——八股之正则化
1,反向传播的定义
BP算法(即误差反向传播算法)适合于多层神经元网络的一种学习算法,它建立在梯度下降法的基础上。BP网络的输入输出关系实质上是一种映射关系:一个 输入m输出的BP神经网络所完成的功能是从 维欧氏空间向m维欧氏空间中一有限域的连续映射,这一映射具有高度非线性。它的信息处理能力来源于简单非线性函数的多次复合,因此具有很强的函数复现能力。这是BP算法得以应用的基础。
—— 简单来说,反向传播就是训练参数模型,在所有参数上用梯度下降的方式,使NN模型在训练数据上的损失最小。
—— 损失函数(loss):指预测的值 (y) 与已知的标准答案 (y_)的差距
而损失函数的计算可以用很多种方法,下面,我们就来讲其中的一个方法,均方误差
—(1)均方误差(MSE)的概念
它的意思是从 i 开始到之后每个预测值 yi 到 y_i 的差的平方求和,再除以n个样本数
—(2)均方误差用函数表示:
loss = tf.reduce_mean(tf.square(y-y_))
2,反向传播的训练方法
反向传播训练的方法主要以减小loss值为优化目标
它主要用到的函数如下
train_step = tf.train.GradientDescentOptimizer(learning_rate).minimize(loss)
train_step = tf.train.AdamOptimizer(learning_rate).minimize(loss)
我们采用第一种方法,你也可以尝试其他方法看看优化的效果有什么不同
——其中, learning_rate是学习率,什么是学习率呢?就是决定参数每次更新幅度的数(可以理解为每次学习的幅度大小)
3,接下来,我们用代码结合上一章内容(前向传播)来实现整个神经网络过程
前向传播过程
不理解的朋友,在代码中已经有非常详细的注释了
# coding:utf-8
# 导入模块,生成模拟数据集
import tensorflow as tf
import numpy as np
BATCH_SIZE = 8
seed = 666
# 基于seed生产随机数
rng = np.random.RandomState(seed)
# 随机数返回32行2列的矩阵 表示32组 体积和重量 作为输入数据集
X = rng.rand(32, 2)
# 从X这个32行2列的矩阵中 取出一行 判断如果和小于1 给Y赋值1 如果和不小于1 给Y赋值0
# 作为输入数据集的标签(正确答案)
Y = [[int(x0 + x1 < 1)] for (x0, x1) in X]
print("X:\n", X)
print("Y:\n", Y)
# 定义神经网络的输入、参数和输出,定义前向传播过程
x = tf.placeholder(tf.float32, shape=(None, 2))
y_ = tf.placeholder(tf.float32, shape=(None, 1))
w1 = tf.Variable(tf.random_normal([2, 3], stddev=1, seed=2))
w2 = tf.Variable(tf.random_normal([3, 1], stddev=1, seed=2))
a = tf.matmul(x, w1)
y = tf.matmul(a, w2)
# 2定义损失函数及反向传播方法
loss = tf.reduce_mean(tf.square(y - y_))
train_step = tf.train.GradientDescentOptimizer(0.001).minimize(loss)
# train_step = tf.train.MomentumOptimizer(0.991,0.9).minimize(loss)
# train_step = tf.train.AdamOptimizer(0.001).minimize(loss)
# 生成会话, 训练STEPS轮
with tf.Session() as sess:
init_op = tf.global_variables_initializer()
sess.run(init_op)
# 输出目前(未经训练) 的参数取值。
print("w1:\n", sess.run(w1))
print("w2:\n", sess.run(w2))
print("\n")
# 训练模型
STEPS = 3000
for i in range(STEPS):
start = (i * BATCH_SIZE) % 32
end = start + BATCH_SIZE
sess.run(train_step, feed_dict={x: X[start:end], y_: Y[start:end]})
if i % 500 == 0:
total_loss = sess.run(loss, feed_dict={x: X, y_: Y})
print("After %d training step(s), loss on all data is %g" % (i, total_loss))
# 输出训练后的参数取值
print("\n")
print("w1:\n", sess.run(w1))
print("w2:\n", sess.run(w2))
结果为
X:
WARNING: Logging before flag parsing goes to stderr.
[[0.70043712 0.84418664]
[0.67651434 0.72785806]
[0.95145796 0.0127032 ]
[0.4135877 0.04881279]
[0.09992856 0.50806631]
[0.20024754 0.74415417]
[0.192892 0.70084475]
[0.29322811 0.77447945]
[0.00510884 0.11285765]
[0.11095367 0.24766823]
[0.0232363 0.72732115]
[0.34003494 0.19750316]
[0.90917959 0.97834699]
[0.53280254 0.25913185]
[0.58381262 0.32569065]
[0.88889931 0.62640453]
[0.81887369 0.54734542]
[0.41671201 0.74304719]
[0.36959638 0.07516654]
[0.77519298 0.21940924]
[0.07934213 0.48678052]
[0.1536739 0.82846513]
[0.19136857 0.27040895]
[0.56103442 0.90238039]
[0.85178834 0.41808196]
[0.39347627 0.01622051]
[0.29921337 0.35377822]
[0.89350267 0.78613657]
[0.77138693 0.42005486]
[0.77602514 0.46430814]
[0.18177017 0.8840256 ]
[0.71879227 0.6718813 ]]
Y:
[[0], [0], [1], [1], [1], [1], [1], [0], [1], [1], [1], [1], [0], [1], [1], [0], [0], [0], [1], [1], [1], [1], [1], [0], [0], [1], [1], [0], [0], [0], [0], [0]]
w1:
[[-0.85811085 -0.19662298 0.13895045]
[-1.2212768 -0.40341285 -1.1454041 ]]
w2:
[[-0.85811085]
[-0.19662298]
[ 0.13895045]]
After 0 training step(s), loss on all data is 0.785053
After 500 training step(s), loss on all data is 0.452825
After 1000 training step(s), loss on all data is 0.443921
After 1500 training step(s), loss on all data is 0.443254
After 2000 training step(s), loss on all data is 0.442924
After 2500 training step(s), loss on all data is 0.442648
w1:
[[-0.7031774 -0.16427353 0.07961477]
[-1.118631 -0.38113183 -1.1755049 ]]
w2:
[[-0.5047402 ]
[-0.09774721]
[ 0.27635282]]
以上就是整个神经网络的传播过程了,不懂的朋友留言评论,互相学习