1、使用Tensorflow搭建神经网络时,通常用张量表示数据,用计算图搭建神经网络,用会话执行计算图,再优化神经网络的参数(权重),获得更准确的模型
2、张量与计算图
张量(tensor):多维数组(列表)
阶:张量的维数
0阶张量就是标量判断张量是几阶的,就可以看方括号有几个,n个就是n阶
张量可以表示0阶到n阶数组(列表)
表示result是一个名叫add:0的张量,是一个长度为2的一维数组,数据类型是浮点型的
这段代码所描述的就是一段计算过程,就是一张计算图
输出内容只显示出结果是个张量,并没有运算张量具体的值计算图只描述了计算过程,不计算运算结果
3、计算图的定义
计算图(Graph):搭建神经网络的计算过程,只搭建,不运算(是承载一个或多个计算节点的一张图)
神经网络的基本单元是神经元,上图就是神经元的基本模型,其实就是数学里的乘加运算,x1、x2是输入,w1、w2是权重
实现:
输出的结果显示y是个张量,只搭建了承载计算过程的计算图,并没有运算。如果想得到运算结果,就要用到会话了
import tensorflow as tf x = tf.constant([[1.0, 2.0]]) #1行2列的张量 w = tf.constant([[3.0], [4.0]]) #2行1列的张量 y = tf.matmul(x,w) y
4、会话
会话(session):执行计算图中的节点运算
用with结构实现:
with tf.Session() as sess:
print sess.run(y)
import tensorflow as tf x = tf.constant([[1.0, 2.0]]) #1行2列的张量 w = tf.constant([[3.0], [4.0]]) #2行1列的张量 y = tf.matmul(x,w) y with tf.Session() as sess: print(sess.run(y))
5、神经网络的参数是指神经元线上的权重W,用变量表示,一般会先随机生成这些参数
随机种子如果去掉,每次生成的随机数将不一致。
标准差、均值、随机种子如果没有特殊要求,是可以不写的
tf.random_normal也可以用生成常量的函数来替换
6、神经网络的实现过程
①准备数据集,提取特征,作为输入喂给神经网络(Neural Network,NN)
②搭建神经网络结构,从输入到输出(先搭建计算图,再用会话执行)
(NN前向传播算法——>计算输出)
③大量特征喂给神经网络,得到大量输出,将每一次输出与标准答案的差反向传回神经网络,调整神经网络的参数,直到模型达到要求,即迭代优化神经网络参数
(NN反向传播算法——>优化参数训练模型)
④使用训练好的模型预测和分类(将新数据送入前向传播网络便可以实现预测和分类了)
前向传播搭建网络结构,反向传播构建网络参数
①②③是训练过程,④是使用过程
7、前向传播
用tensorflow描述
8、代码实现实例①
#两层简单神经网络(全连接) import tensorflow as tf #定义输入和参数 x = tf.constant([[0.7, 0.5]]) #一组体积和重量,用一行两列的二维张量表示 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(sess.run(y))
代码实现实例②
#两层简单神经网络(全连接) import tensorflow as tf #定义输入和参数 #用placeholder实现输入定义 (sess.run中喂一组数据) x = tf.placeholder(tf.float32,shape=(1,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(sess.run(y,feed_dict={x:[[0.7,0.5]]}))
代码实现实例③
#两层简单神经网络(全连接) import tensorflow as tf #定义输入和参数 #用placeholder实现输入定义 (sess.run中喂多组数据) x = tf.placeholder(tf.float32,shape=(None,2)) #注意None 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(sess.run(y,feed_dict={x:[[0.7,0.5],[0.2,0.3],[0.3,0.4],[0.4,0.5]]})) print(sess.run(w1)) print(sess.run(w2))
9、反向传播
反向传播的目的是为了优化模型参数,在所有参数上用梯度下降的方法,使神经网络模型在训练数据上的损失函数最小
损失函数(loss):预测值y与已知答案y_的差距
损失函数的计算有很多方法,均方误差(MSE)是比较常用的方法之一
反向传播的训练方法:以减小loss值为优化目标
代码实现(这段代码要能背下来)
#导入模块,生成模拟数据集 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,y是输入 x = tf.placeholder(tf.float32, shape = (None,2)) #输入特征是32位浮点型,每个x有2个元素,体积和重量 y_ = tf.placeholder(tf.float32, shape = (None,1)) #每个y有1个元素,合格与否 #w1,w2是参数 #参数要匹配输入和输出 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) #生成会话,训练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]})#每轮从X的 #数据集和Y的标签中,抽取相应的从start到end个特征和标签,汇入神经网络, #用sess.run()执行训练过程 if i%500 ==0: 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))
10、梳理神经网络搭建的八股
搭建神经网络的八股:准备、前传、反传、迭代