Tensorflow 框架搭建神经网络(五)

# Copyright (c)2018, 东北大学软件学院学生
# All rightsreserved
# 文件名称:test.py
# 作   者:孔云
#问题描述:搭建网络实现。反向传播:训练模型参数,在所有参数上用梯度下降,使 NN 模型在训练数据上的损失函数最小。
#损失函数(loss): 计算得到的预测值 y 与已知答案 y_的差距。
#损失函数的计算有很多方法,均方误差 MSE 是比较常用的方法之一。
#均方误差 MSE: 求前向传播计算结果与已知答案之差的平方再求平均。 
# coding:utf-8
# 0导入模块,生成模拟数据集。
import tensorflow as tf
import numpy as np
BATCH_SIZE = 8
SEED = 23455
# 基于seed产生随机数
rdm = np.random.RandomState(SEED)
# 随机数返回32行2列的矩阵 表示32组 体积和重量 作为输入数据集
X = rdm.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_)
# 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定义损失函数及反向传播方法。
loss_mse = tf.reduce_mean(tf.square(y - y_))
#使用随机梯度下降算法,使参数沿着梯度的反方向,即总损失减小的方向移动,实现更新参数,
#随机梯度下降算法保持单一的学习率更新所有的参数,学习率在训练过程中并不会改变。
train_step = tf.train.GradientDescentOptimizer(0.001).minimize(loss_mse)
# train_step = tf.train.MomentumOptimizer(0.001,0.9).minimize(loss_mse)
# train_step = tf.train.AdamOptimizer(0.001).minimize(loss_mse)

# 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_mse, feed_dict={x: X, y_: Y_})
            print("After %d training step(s), loss_mse on all data is %g" % (i, total_loss))
    # 输出训练后的参数取值。
    print("训练后参数取值:\n")
    print("w1:\n", sess.run(w1))
    print("w2:\n", sess.run(w2))

由上述代码知,神经网络搭建分为以下几个步骤:

0.导入模块,生成模拟数据集;

import
常量定义
生成数据集
1.前向传播:定义输入、参数和输出
x= y_=
w1= w2=
a= y=
2. 反向传播:定义损失函数、反向传播方法
loss=
train_step=
3. 生成会话,训练 STEPS 轮

运行结果:

注释:由神经网络的实现结果,我们可以看出,总共训练 3000 轮, 每轮从 X 的数据集和 Y 的标签中抽取相对应的从 start 开始到 end 结束个特征值和标签, 喂入神经网络, 用 sess.run 求出 loss, 每 500 轮打印一次 loss 值。经过 3000 轮后, 打印出最终训练好的参数 w1、 w2。 神经网络由此搭建完成。

猜你喜欢

转载自blog.csdn.net/u012369559/article/details/79993070