Tensorflow 学习笔记--搭建神经网络

一 、基本概念
    1.基于 w Tensorflow 的 的 NN : 用张量表示数据,用计算图搭建神经网络,用会话执
行计算图,优化线上的权重(参数),得到模型。
   2. 张量:张量就是多维数组(列表),用“阶”表示张量的维度。
                 0 阶张量称作标量,表示一个单独的数;
                       举例 S=123
                1 阶张量称作向量,表示一个一维数组;
                       举例 V=[1,2,3]
                2 阶张量称作矩阵,表示一个二维数组,它可以有 i 行 j 列个元素,每个元素可 以用行号和列号共同索引到;
                        举例 m=[[1, 2, 3], [4, 5, 6], [7, 8, 9]]
                数据类型:T Tw ensorflow 的数据类型有 tf.float32 、2 tf.int32 等。

   3.计算图( Graph ): 搭建神经网络的计算过程,是承载一个或多个计算节点的一张图,只搭建网络,不运算。

                 举例

                      在第一讲中我们曾提到过,神经网络的基本模型是神经元,神经元的基本模型其

                      实就是数学中的乘、加运算。我们搭建如下的计算图:

                                                  


                       x1、x2 表示输入,w1、w2 分别是 x1 到 y 和 x2 到 y 的权重,y=x1*w1+x2*w2。

        4.会话( Session ): 执行计算图中的节点运算 。
             语法如下:
                        with tf.Session() as sess:
                                 print sess.run(y y) )
              举例          

import tensorflow as tf          #引入模块
x=tf.constant([[1.0,2.0]]) #定义一个 2 阶张量等于[[1.0,2.0]]
w=tf.constant([[3.0],[4.0]])
y=tf.matmul(x,w) #实现 xw 矩阵乘法
with tf.Session() as sess:
print(sess.run(y)) #执行会话并打印出执行后的结果


结果: [[11.]]


二、神经网络的参数
√ 神经网络的参数: 是指神经元线上的权重 w , 用变量表示 , 一般会先随机生成
这些参数 。生成参数的方法 是 让 w 等于 tf.Variable ,把生成的方式写在括号里 。
神经网络中常用的生成随机数/ / 数组 的函数有:
tf.random_normal( ( ) 生成正态分布随机数
tf.truncated_normal() 生成去掉过大偏离点的正态分布随机数
tf.random_uniform() 生成均匀分布随机数
tf.zeros 表示生成全 0 0 数组
tf.ones 表示生成全 1 1 数组
tf.fill 表示生成全定值数组
tf.constant 表示生成直接给定值的数组

举例
① w=tf.Variable(tf.random_normal([2,3],stddev=2, mean=0, seed=1)),表
示生成正态分布随机数,形状两行三列,标准差是 2,均值是 0,随机种子是 1。

三 、 神经网络的搭建
当我们知道张量、计算图、会话和参数后,我们可以讨论神经网络的实现过程了。
√ 神经网络的实现过程 :
1 1 、准备数据集,提取特征,作为输入喂给神经网络( Neural Network , NN )
2 2 、搭建 NN 结构,从输入到输出(先搭建计算图,再用会话执行)
(  NN 前向传播算法 计算输出)
3 3 、大量特征数据喂给 NN ,迭代优化  NN 参数
( NN 反向传播算法 优化参数训练模型 )
4 4 、使用训练好的模型预测和分类
由此可见,基于神经网络的机器学习主要分为两个过程,即训练过程和使用过程。
训练过程是第一步、第二步、第三步的循环迭代,使用过程是第四步,一旦参数
优化完成就可以固定这些参数,实现特定应用了。
很多实际应用中,我们会先使用现有的成熟网络结构,喂入新的数据,训练相应
模型,判断是否能对喂入的从未见过的新数据作出正确响应,再适当更改网络结
构,反复迭代,让机器自动训练参数找出最优结构和参数,以固定专用模型。
四、 前向传播
√ 前向传播就是搭建模型的计算过程, 让模型具有推理能力, , 可以针对一组输入
给出相应的输出

举例
假如生产一批零件,体积为 x1,重量为 x2,体积和重量就是我们选择的特征,
把它们喂入神经网络,当体积和重量这组数据走过神经网络后会得到一个输出。
假如输入的特征值是:体积 0.7 重量 0.5


由搭建的神经网络可得,隐藏层节点 a11=x1* w11+x2*w21=0.14+0.15=0.29,同
理算得节点 a12=0.32,a13=0.38,最终计算得到输出层 Y=-0.015,这便实现了
前向传播过程。

#coding:utf-8
import tensorflow as tf
#定义输入和参数
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]]}))

 tf.placeholder 给输入占位

tf.global_variables_initializer() 汇总所有待优化变量

五、反向传播
√ 反向传播 :训练 模型参数 ,在所有参数上用梯度下降,使 N NN 模型在训练数据
上的损失函数最小。
√ 损失 函数(l l oss) ) : 计算 得到的 预测值 y y 与已知答案 y_ 的差距 。
损失函数的计算有很多方法,均方误差 MSE 是比较常用的方法之一。
√ 均方误差 M M SE : 求前向传播计算结果与已知答案之差的平方再求平均 。
用 用 w tensorflow 函数表示为 :
loss_mse = tf.reduce_mean(tf.square(y_ - - y))
√ 反向传播训练 方法: 以减小 s loss 值为优化目标 ,有 梯度下降 、m momentum 优化
器 、m adam 优化器等优化方法。
这三种优化方法用 tensorflow 的函数可以表示为:
train_step=tf.train .GradientDescentOptimizer(learning_rate).minimize(loss)
train_step=tf.train.MomentumOptimizer(learning_rate, momentum).minimize(loss)
train_step=tf.train.AdamOptimizer(learning_rate).minimize(loss)

 代码

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

猜你喜欢

转载自www.cnblogs.com/dxmx/p/9241337.html