背景:

生产一批零件X含体积x0,重量x1作为特征,假设体积x0+重量x1<1则是一个良品,计算良品率Y

目标:训练计算层w参数,使loss逐渐降低,准确率提高

由背景搭建的模型 2-3-1结构(各层元素间两点一线)

人工神经网络模型样本量要求 人工神经网络建模步骤_人工智能


搭建神经网络的八股:准备,前传,反传,迭代

$ 先理一遍思路

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:)

#file \tf\tf3_6.py

#coding:utf:8
#0导入模块,生成模拟数据集.
import tensorflow as tf
import numpy as np #科学计算模块
BATCH_SIZE = 8 #一次喂入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作为输入数据集的标签(正确答案)
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)) #输入的特征32位浮点 特征2个(体积,重量)总数未知None
y_= tf.placeholder(tf.float32, shape=(None, 1)) #输入的特征32位浮点 特征1个(合格/不合格)总数未知None

w1= tf.Variable(tf.random_normal([2, 3], stddev=1, seed=1)) #生成正态分布随机数 2x3矩阵(计算图第一计算层中6个w) 标准差1 随机种子1
w2= tf.Variable(tf.random_normal([3, 1], stddev=1, seed=1)) #生成正态分布随机数 3x1矩阵(计算图第二计算层中3个w) 标准差1 随机种子1

a = tf.matmul(x, w1) #前向传播的计算过程描述 矩阵乘法实现
y = tf.matmul(a, w2) #前向传播的计算过程描述 矩阵乘法实现

#2定义损失函数及反向传播方法.
#均方误差MSE:MSE(y_,y) 各组预测值y与实际答案y_差距的平方求和除n
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轮
#会话(Session):执行计算图中的节点运算(即计算结果)
#变量初始化,计算图解点运算都要使用会话(with结构)实现,即{
#with tf.Session() as sess:
#    sess.run()
#}
with tf.Session()as sess:
#变量初始化:在sess.run函数中使用tf.global_variables_initializer()
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 #训练3000轮
for i in range(STEPS):
    start = (i*BATCH_SIZE) % 32
    end = start + BATCH_SIZE
    #每轮从X数据集和Y的标签中,抽取相应的从start到end的特征和标签,喂入神经网络,用sess.run()执行训练过程
    sess.run(train_step, feed_dict={x: X[start:end], y_: Y[start:end]})
    if i % 500 == 0: #500轮打印一次loss值
        total_loss = sess.run(loss, feed_dict={x:X, y_: Y})
        print("After %d training step(s), loss on all date is %g"%(i, total_loss))

测试结果

”’
X:
[[0.83494319 0.11482951]
[0.66899751 0.46594987]
[0.60181666 0.58838408]
[0.31836656 0.20502072]
[0.87043944 0.02679395]
[0.41539811 0.43938369]
[0.68635684 0.24833404]
[0.97315228 0.68541849]
[0.03081617 0.89479913]
[0.24665715 0.28584862]
[0.31375667 0.47718349]
[0.56689254 0.77079148]
[0.7321604 0.35828963]
[0.15724842 0.94294584]
[0.34933722 0.84634483]
[0.50304053 0.81299619]
[0.23869886 0.9895604 ]
[0.4636501 0.32531094]
[0.36510487 0.97365522]
[0.73350238 0.83833013]
[0.61810158 0.12580353]
[0.59274817 0.18779828]
[0.87150299 0.34679501]
[0.25883219 0.50002932]
[0.75690948 0.83429824]
[0.29316649 0.05646578]
[0.10409134 0.88235166]
[0.06727785 0.57784761]
[0.38492705 0.48384792]
[0.69234428 0.19687348]
[0.42783492 0.73416985]
[0.09696069 0.04883936]]
Y:
[[1], [0], [0], [1], [1], [1], [1], [0], [1], [1], [1], [0], [0], [0], [0], [0], [0], [1], [0], [0], [1], [1], [0], [1], [0], [1], [1], [1], [1], [1], [0], [1]]
w1:
[[-0.8113182 1.4845988 0.06532937]
[-2.4427042 0.0992484 0.5912243 ]]
w2:
[[-0.8113182 ]
[ 1.4845988 ]
[ 0.06532937]]

After 0 training step(s), loss on all date is 5.13118
After 500 training step(s), loss on all date is 0.429111
After 1000 training step(s), loss on all date is 0.409789
After 1500 training step(s), loss on all date is 0.399923
After 2000 training step(s), loss on all date is 0.394146
After 2500 training step(s), loss on all date is 0.390597
”’


Copyright:dolor_059