tensorflow框架--反向传播

反向传播:训练模型参数,在所有参数上用梯度下降,使NN模型在训练数据上的损失函数最小。
损失函数(loss):计算得到的预测值y与已知答案y_的差距。
损失函数的计算有很多方法,均方误差MSE是比较常用的方法之一。
均方误差MSE:求前向传播计算结果与已知答案之差的平方再求平均。
在这里插入图片描述
用tensorflow函数表示为:
loss_me = tf.reduce_mean(tf.square(y_ - y))
反向传播训练方法:以减小loss值为优化目标,有梯度下降、momentum优化器、adam优化器等优化方法。
这三种优化方法用tensorflow的函数可以表示为:
train_step = tf.train.GradientDescentOptimizer(learning_rate).minimize(loss)
train_step = tf.train.MomentumOptimizer(learning_rate,momentum).minimize(loss)
train_step = tf.train.AdamOptimizer(learning_rate).minimize(loss)
三种优化方法区别如下:
**tf.train.GradientDescentOptimizer()**使用随机梯度下降算法,使参数沿着梯度的反方向,即总损失减小的方向移动,实现更新参数。
在这里插入图片描述
参数更新公式是
在这里插入图片描述
其中,J(θ)为损失函数,θ为参数,α为学习率。

**tf.train.MomentumOptimizer()**在更新参数时,利用了超参数,参数更新公式是
在这里插入图片描述
**tf.train.AdamOptimizer()**是利用自适应学习率的优化算法,Adam算法和随机梯度下降算法不同。随机梯度下降算法保持单一的学习率更新所有的参数,学习率在训练过程中并不会改变。而Adam算法通过计算梯度的一阶矩估计和二阶矩估计而为不同的参数设计独立的自适应性学习率。

学习率:决定每次参数更新的幅度。
优化器中都需要一个叫做学习率的参数,使用时,如果学习率选择过大会出现震荡不收敛的情况,如果学习率选择过小,会出现收敛速度慢的情况。我们可以选个比较小的值填入,比如0.01,0.001.

进阶:反向传播参数更新推导过程
符号说明:
在这里插入图片描述
f(z)表示激活函数;
最后的输出层为第L层。
推导过程:
在这里插入图片描述

搭建神经网络的八股

我们最后梳理出神经网络搭建的八股,神经网络的搭建课分四步完成:准备工作、前向传播、反向传播和循环迭代。
0.导入模块,生成模拟数据集:
import
常量定义
生成数据集
1.前向传播:定义输入、参数和输出
x= y_ =
w1= w2=
a= y=
2.反向传播:定义损失函数、反向传播方法
loss=
train_step=
3.生成会话,训练STEPS轮
with tf.session() as sess
Init_op = tf.global_variables_initializer()
sess_run(init_op)
STEPS=3000
for i in range(STEPS):
start=
end=
sess.run(train_step,feed_dict:)

举例
随机产生32组生产出的零件的体积和重量,训练3000轮,每500轮输出一次损失函数。下面我们通过源代码进一步理解神经网络的实现过程:
0.导入模块,生成模拟数据集;

#coding:utf-8
#0导入模块,生成模拟数据集。
import tensorflow as tf
import numpy as np
BATCH_SIZE = 8
seed = 23455

#基于seed产生随机数
rng = np.random.RandomState(seed)
#随机数返回322列的矩阵,表示32组; 体积和重量,作为输入数据集
X = rng.rand(32,2)
#从X这322列的矩阵中 取出一行 判断如果和小于1 给Y赋值1 如果和不小于1 给Y赋值0
#作为输入数据集的标签(正确答案)
Y = [[int(x0 + x1 <1)] for (x0,x1) in X]
print "X:\n",X
print "Y:\n",Y

1.定义神经网络的输入、参数和输出,定义前向传播过程;

#1定义神经网络的输入、参数和输出,定义前向传播过程。
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=1))
w2 = 
tf.Variable(tf.random_normal([3,1],stddev=1,seed=1))

a = tf.matmul(x,w1)
y = tf.matmul(a,w2)

2.定义损失函数及反向传播方法

#2.定义损失函数及反向传播方法
loss = tf.reduce_mean(tf.square(y-y_))
train_step = tf.train.GradientDescentOptimizer(0.001).minimize(loss)
#train_step = tf.train.MomentumOptimizer(0.001,0.9).minimize(loss)
#train_step = tf.train.AdamOptimizer(0.001).minimize(loss)

3.生成会话,训练STEPS轮

#3生成会话,训练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)

由神经网络的实现结果,我们可以看出,总共训练3000轮,每轮从X的数据集个Y的标签中抽取相对应的胸start开始到end结束个特征值和标签,喂入神经网络,用sess.run求出loss,每500轮打印一次loss值。经过3000轮后,我们打印出最终训练好的参数w1,w2.
在这里插入图片描述
这样四步就可以实现神经网络的搭建了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值