Tensorflow框架搭建神经网络
一、张量、计算图、会话
1. 张量
多维数组(列表) 阶:张量的维数
维数 | 阶 | 名字 | 例子 |
---|---|---|---|
0-D | 0 | 标量 scalar | s=1 2 3 |
1-D | 1 | 向量 vector | v=[1,2,3] |
2-D | 2 | 矩阵 matrix | m=[[1,2,3],[4,5,6],[7,8,9]] |
n-D | n | 张量 tensor | t=[[[… (n个) |
张量可以表示0阶到n阶数组(列表)
2.计算图
import tensorflow as tf
a = tf.constant([1.0,2.0])
b = tf.constant([3.0,4.0])
result = a + b
print result
结果显示:
Tensor("add:0", shanpe=(2, ), dtype=float32)
计算图(Graph):搭建神经网络的计算过程,只搭建,不运算。
y
=
X
W
=
x
1
∗
w
1
+
x
2
∗
w
2
y=XW=x_1*w_1+x_2*w_2
y=XW=x1∗w1+x2∗w2
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", shanpe=(1, 1), dtype=float32)
3.会话(session)
执行计算图中的节点运算
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)
结果显示:
Tensor("matmul:0", shanpe=(1, 1), dtype=float32)
[[11.]]
二、前向传播
1.参数
即线上的权重W,用变量表示,随机给初值。
tf.Variable(tf.random_normal([2,3], stddev=2, mean=0, seed=1))
# 正太分布 产生2*3矩阵 标准差 均值 随机种子
2.神经网络的实现过程:
- 准备数据集,提取特征,作为输入喂给神经网络(Neural Network. NN)
- 搭建NN结构,从输入到输出(先搭建计算图,再用会话执行)
(NN前向传播算法 —> 计算输出) - 大量特征数据喂给NN,迭代优化NN参数
(NN反向传播算法 —> 优化参数训练模型) - 使用训练好的模型预测和分类
3.前项传播 -> 搭建模型,实现推理(以全连接网络为例)
eg. 生产一批零件将体积x1和重量x2为特征输入NN,通过NN后输出一个数值。
- 变量初始化、计算图节点运算都要用会话(with结构)实现
with tf.Session() as sess:
sess.run()
- 变量初始化:在sess,run函数中用tf.global_variables_initializer()
init_op = tf.global_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.1, 0.2], [0.2, 0.3], [0.3, 0.4], [0.4, 0.5]]})
完整代码:
#-*-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(sess.run(y, feed_dict={x:[[0.7, 0.5],[0.2, 0.3], [0.3, 0.4], [0.4, 0.5]]}))
三、反向传播
- 反向传播 -> 训练模型参数,在所有参数上用梯度下降,使NN模型在训练数据上的损失函数最小。
- 损失函数(loss):预测值(y)与已知答案(y_)的差距
- 均方误差MSE
loss = tf.reduce_mean(tf.square(y_-y)) - 反向传播训练方法:以减小loss为优化目标
- 学习率:决定参数每次更新的幅度
四、完整神经网络搭建代码
#-*-coding:utf-8-*-
#-----------------------------------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]
#-----------------------------1前向传播:定义输入、参数和输出-------------------------------#
#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反向传播:定义损失函数、反向传播方法-------------------------------#
#2定义损失函数及反向传播方法
loss = tf.reduce_mean(tf.square(y - y_))
train_step = tf.train.GradientDescentOptimizer(0.001).minimize(loss)
#------------------------------------3生成会话,训练STEPS轮---------------------------------------#
#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 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))
注:参考中国大学MOOC曹健老师《人工智能实践:Tensorflow笔记》。
最后
以上就是执着乐曲最近收集整理的关于Tensorflow框架搭建神经网络Tensorflow框架搭建神经网络的全部内容,更多相关Tensorflow框架搭建神经网络Tensorflow框架搭建神经网络内容请搜索靠谱客的其他文章。
发表评论 取消回复