神经网络的实现过程:
1、准备数据集,提取特征,作为输入喂给神经网络(Neural Network,NN)
2、搭建 NN 结构,从输入到输出(先搭建计算图,再用会话执行)
( NN 前向传播算法 --> 计算输出)
3、大量特征数据喂给 NN,迭代优化 NN 参数
( NN 反向传播算法 --> 优化参数训练模型)
4、使用训练好的模型预测和分类
1. 前向传播
#coding:utf-8
import tensorflow as tf
print("============两层简单神经网络=========== ")
#定义输入和参数
#定义常量X
#x = tf.constant([[0.7,0.5]])
#用placeholder定义输入(sess.run可以喂多组数据)
x = tf.placeholder(tf.float32,shape=(None,2))
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)
#会话计算结果
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))
#计算最终结果 y 值
#x为常量值时的输出结果
#print("两层简单网络计算结果为:\n y = ",sess.run(y))
#用placeholder定义x作为输入,sess.run喂多组数据的输出结果
print("喂入多组数据的结果:\n",sess.run(y,feed_dict = {x: [[0.7,0.5],[0.2,0.3],[0.3,0.4],[0.4,0.5]]}))
2. 反向传播
#coding:utf-8
#导入模块,生成模拟数据集
import tensorflow as tf
import numpy as np
#一次不可过大
BATCH_SIZE = 8
seed = 23455
#基于seed 产生随机数
rng = np.random.RandomState(seed)
#随机数返回32行2列的矩阵,特征为体积和体重 作为输入的数据集
X = rng.rand(32,2)
#伪造每组特征输入的标签
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)
#定义损失函数与反向传播方法
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 生成会话,训练 STEP 轮
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")
# 训练模型
STEP = 3000 #训练3000轮
for i in range(STEP):
start = (i*BATCH_SIZE)%32 #每组喂8组数据
end = start + BATCH_SIZE
sess.run(train_step,feed_dict = {x:X[start:end],y_:Y[start:end]})
#每500次打印一次参数信息
if i % 500 == 0:
total_loss = sess.run(loss,feed_dict = {x:X,y_:Y})
print("经过 %d 轮训练,损失数据为:%g" %(i,total_loss))
#输出训练后的权重
print("\n")
print("w1:\n",sess.run(w1))
print("w2:\n",sess.run(w2))
关于tensorflow学习教程均来自 mooc 课程:人工智能时间:tensorflow笔记 mooc 课程