一、基本概念
基于TensorFlow的NN(神经网络):
1.张量:即多维数组,表示数据
2.计算图:搭建神经网络,不运算
3.会话:执行计算图
注:用阶表示张量的维度,t=[[]]表示2阶,t=[[[]]]表示3阶。数张量右边括号数。
0阶张量表示数
1阶张量表示数组
2阶张量表示矩阵
测试样例一
import tensorflow as tf
'''测试1'''
a=tf.constant([1.0,2.0])#1阶张量,表示长度为2的一个数组。
b=tf.constant([3.0,4.0])
result=a+b
print(result))#也应该为1阶张量,表示长度为2的一个数组。
Tensor(“add:0”, shape=(2,), dtype=float32)
表示名为"add:0"的张量,shape=(2,)表示长度为2的一维数组,dtype=float32表示数据类型
测试样例二
'''测试2'''
x=tf.constant([[1.0,2.0]])#2阶张量,表示1X2矩阵
w=tf.constant([[3.0],[4.0]])#2阶张量,表示2X1矩阵
y=tf.matmul(x,w)#矩阵相乘
print(y)
##显示运算结果需要运行,即需要会话Session()
with tf.Session() as sess:
print(sess.run(y))
得到[[11.]],即1.03.0+2.04.0=11.0
二、神经网络的搭建
1.神经网络的参数
一般会先随机生成参数,生成参数格式:tf.Variable(生成参数的方法)
生成参数的方法:
tf.random_normal() 生成正态分布的随机数
tf.zeros() 生成全0数组
···
如:w=tf.Variable(tf.random_normal([2,3],stddev=2,mean=0,seed=1))
①随机种子如果去掉每次生成的随机数将不一致。
②如果没有特殊要求标准差、均值、随机种子是可以不写的。
tf.zeros([3,2],int32)表示生成[[0,0],[0,0],[0,0]]
2.搭建过程
2.1准备数据集,提取特征,喂给NN
2.2搭建NN结构,从输入到输出。先计算图,后会话执行。——前向传播
2.3大量特征喂给NN,迭代优化NN参数——反向传播
2.4预测+分类
'''前向传播'''
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("y is:\n", sess. run(y, feed_dict={x:[[0.7,0.5],[0.2,0.3],[0.3,0.4],[0.4,0.5]]}))
第一组喂体积0.7、重量0.5,第二组喂体积0.2、重量0.3,第三组喂体积0.3、重量0.4,第四组喂体积0.4、重量0.5.
三、含反向传播的完整实例
0.导入模块
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)
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 =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_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))
# 训练模型。
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_mse on all data is %g" % (i, total_loss))
# 输出训练后的参数取值。
print( "w1:\n", sess.run(w1))
print( "w2:\n", sess.run(w2))
输出结果:
总结
关键是先搭建前向传播神经网络,形成网络逻辑通路。在用反向传播更新优化参数,提升模型效果。
有关TensorFlow要熟悉变量,计算图,会话区别和联系:用变量存储特征,计算图搭建框架,最终用会话执行。