Tensorflow框架(人工智能实践笔记)

基于TensorFlow的NN: 用张量表示数据,用计算图搭建神经网络,用会话执行计算图,优化线上的权重(参数),得到模型。
张量(Tensor):多维数组(列表)
阶: 张量的维数

n阶 张量 名字及例子
0 标量,s=123
1 向量,v=[1,2,3]
2 矩阵,m=[[1,2,3],[4,5,6],[7,8,9]]
n 张量 ,t=[[[…n个

张量可以表示0阶到n阶数组(列表)

未来会常用vim编辑器,为了方便,我们先修改vim的配置文件:

vim ~/.vimrc写入:
set ts=4 使tab键等效为4个空格
set nu  使vim显示行号

TensorFlow的数据类型:tf.float32、tf.int32…

import tensorflow as tf  导入tensorflow模块
a = tf.constant([1.0,2.0])      定义常数
b=tf.constant([3.0,4.0])
result = a+b
print result

显示:

Tensor("add:0",shape=(2,),dtype=float32)
 表示:“节点名:第0个输出”,维度=一维数组长度为2,数据类型

结果截图:
Tensorflow框架(人工智能实践笔记)
计算图:(Graph)搭建神经网络的计算,只搭建,不运算(只描述运算过程)
Tensorflow框架(人工智能实践笔记)
y=XW=x1w1+x2w2

import tensorflow as tf
x = tf.constant([[1.0,2.0]])    两行一列
w=tf.constant([[3.0],[4.0]])    一行两列

y=tf.matmul(x,w)
print y

显示:

Tensor("matmul:0",shape(1,1),dtype=float32)  结果shape一行一列

结果截图:
Tensorflow框架(人工智能实践笔记)
以上得到的只是图,不是结果,如果想得到结果就要用到会话了。
会话:(Session)执行计算图中的节点运算。

with tf.Sessiion() as sess:
    print sess.run(y)     
   注:print前是四个空格

例如:

import tensorflow as tf
x = tf.constant([[1.0,2.0]])    两行一列
w=tf.constant([[3.0],[4.0]])    一行两列
y=tf.matmul(x,w)
print y
with tf.Session() as sess:
    print sess.run(y)   

结果截图:
Tensorflow框架(人工智能实践笔记)
若提示非程序的错误,可屏蔽,将TensorFlow的提示等级降低:

vim ~/.bashrc
进去后在尾部加上:   export TF_CPP_LOG_LEVEL=2
保存退出后:source ~/.bashrc   刚才的配置文件生效

**

前向传播

**
参数:线上权重,一般会先随机生成。

w=tf.Variable(tf.random_normal([2,3],stddev=2,mean=0,seed=1))
              正态分布 产生2 * 3矩阵   标准差为2   均值为0  随机种子

随机种子如果去掉,每次生成的随机数就不一致。
后三项如果没有特殊要求可以省略。

tf.truncated_normal()   去掉过大偏离值的正态分布(如果随机出来的数据偏离平均值超过两个标准差将会被重新生成)
tf.random_uniform()   平均分布
也可生成常数:
tf.zeros 全0数组   tf.zeros([3,2],int32)生成[[0,0],[0,0],[0,0]]
tf.ones 全1数组   tf.ones([3,2],int32)生成[[1,1],1,1],1,1]]
tf.fill 全定值数组  tf.fill([3,2],6)生成[6,6],[6,6].[6,6]
tf.constant 直接给值      tf.constant([3,2,1])

神经网络的实现过程
1.准备数据集,提取特征,作为输入给神经网络。
2.搭建NN结构,从输入到输出(先搭建计算图,在用会话执行)
(NN前向传播算法–>计算输出)
3.大量特征数据给NN,迭代优化NN参数
(NN反向传播算法–>优化参数训练模型)
4.使用训练好的模型测试和分类

前向传播 :输入进网络得到输出。
X是输入为1 * 2 的矩阵
Tensorflow框架(人工智能实践笔记)
a是第一层计算结果。
变量初始化、计算图节点运算都要用会话(with结构)实现

with tf.Session() as sess:
    sess.run()

变量初始化:在sess.run函数中用tf.global_variables_initializer()

init_op = tf.gloabal_variables_initializer()
sess.run(init_op)

计算图节点运算:在sess.run函数中写入带运算的节点

sess.run(y)

用tf.placeholder占位,在sess.run函数中用feed_dict喂数据

喂一组数据
x = tf.placeholder(tf.float32,shape=(1,2))   两个输入特征
sess.run(y,feed_dict={x:[[0.5,0.6]]})

喂多组数据:
x = tf.placeholder(tf.float32,shape=(None,2))
sess.run(y,feed_dict={x:[[0.5,0.6],[0.2,0.3],[0.3,0.4],[0.4,0.5]]})

举例
例1:

#coding:utf-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"y in tf is:\n",sess.run(y)

结果截图:
Tensorflow框架(人工智能实践笔记)
例2:向神经网络喂入一组数据

#coding:utf-8
#两层简单神经网络(全连接)
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"y in tf is:\n",sess.run(y,feed_dict={x:[[0.7,0.5]]})

结果截图:
Tensorflow框架(人工智能实践笔记)
例3:向神经网络喂入n组数据

#coding:utf-8
#两层简单神经网络(全连接)
import tensorflow as tf

#定义输入和输出参数
#用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"result is:\n",sess.run(y,feed_dict={x:[[0.7,0.5],[0.2,0.3],[0.3,0.4],[0.4,0.5]]})
    print"w1:\n",sess.run(w1)
    print"w2:\n",sess.run(w2)

结果截图:
Tensorflow框架(人工智能实践笔记)

反向传播

反向传播 :训练模型参数,在所有参数上梯度下降,使NN模型在训练数据上的损失函数最小。
损失函数:(loss)预测值y与已知答案y_的差距
Tensorflow框架(人工智能实践笔记)

loss = tf.reduce_mean(tf.square(y_-y))

反向传播训练方法:以减小loss值为优化目标

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导入模块,生成模拟数据集
#numpy模块是python的科学计算模块
#BATCH是一次喂入神经网络多少数据,不宜过大
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
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轮
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,feed_dict={x:X,y_:Y})
             print("After %d training steps,loss on all data is %g" % (i,total_loss))
     #输出训练后的权重
     print "\n"
     print "w1:\n",sess.run(w1)
     print "w2:\n",sess.run(w2)

结果截图:
Tensorflow框架(人工智能实践笔记)
Tensorflow框架(人工智能实践笔记)

搭建神经网络八股:准备、前传、反传、迭代
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:)
上一篇:随机梯度下降法实例


下一篇:人工智能实践:Tensorflow笔记学习记录(一)