tensorflow

tensorflow笔记(反向传播)-mooc(北京大学)

2019-05-22  本文已影响0人  Jasmine晴天和我

反向传播

反向传播 \rightarrow训练模型参数,在所有参数上用梯度下降,使NN模型在训练数据上的损失函数最小
损失函数(loss):预测值(y)与已知答案(y_1)的差距
均方误差MSE:
MSE(y_1,y) = \sum^{i=1}_{n}{\frac{(y-y_1)^2}{n}}
loss = tf.reduce_mean(tf.square(y1-y)
反向传播训练:以减小loss值为优化目标

train_step = tf.train.GradientDescentOptimizer(learning_rate).minimize(loss)
train_step = tf.train.MomentumOptimizer(learing_rate,momentum).minimize(loss)
train_step = tf.train.AdamOptimizer(learning_rate).minimize(loss)

学习率,决定参数每次更新的幅度,使用时先填比较小的值

案例,为保证输出一致,本文设置了随机种子seed

# 导入模块,生成模拟数据集
import tensorflow as tf 
import numpy as np 
BATCH_SIZE = 8  #一次喂入神经网络多少组数据,不能一次喂很多
seed = 23455
#基于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)) #2是指的数据的尺寸,因为只有两个特征,None指的batch size的大小,所以可以是任何数。
#placeholder()函数是在神经网络构建graph的时候在模型中的占位,此时并没有把要输入的数据传入模型,它只会分配必要的内存。等到建立session,在会话中,运行模型的时候通过feed_dict()函数向占位符喂入数据。
y_ = tf.placeholder(tf.float32, shape=(None,1)) #正确答案
w1 = tf.Variable(tf.random_normal([2,3], stddev=1, seed=1)) #隐藏层是3个神经元
w2 =  tf.Variable(tf.random_normal([3,1], stddev=1, seed=1))
a = tf.matmul(x,w1)
y = tf.matmul(a,w2)
print(w1)
print(w2)
#定义损失函数及反向传播方法
loss = tf.reduce_mean(tf.square(y-y_))
train_step = tf.train.GradientDescentOptimizer(0.001).minimize(loss) #梯度下降,学习率0.001
#train_step = tf.train.MomentumOptimizer(0.001,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: #每500轮打印一次
            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))
上一篇下一篇

猜你喜欢

热点阅读