您的位置:首页 > 其它

tensorflow学习二:概念知识和一个帮助理解的demo

2017-10-31 20:35 411 查看
该博客首先从Tensorflow的计算模型,数据模型和运行模型三个角度进行介绍,这样可以对tensorflow有一个直观的了解.然后是神经网络的计算流程,并通过Tensorflow实现这些计算.

1.Tensorflow基本概念

  计算模型,数据模型和运行模型三方面介绍

1.1.Tensorflow的计算模型 - 计算图

计算图的概念

tensorflow中, Tensor就是张量,可以简单的理解为多维的数组的概念,表明了数据类型;Flow就是流,直观的表达了张量之间通过计算转化的过程.

计算图:由节点和他们之间的边组成,每个计算都是计算图上的节点,节点之间的边描述了计算之间的依赖关系.

计算图的使用

两个阶段

第一个阶段: 定义计算图中所有的计算.下面的这段代码是定义计算的过程,

import tensorflow as tf
a = tf.constant([1.0, 2.0], name = 'a')
b = tf.constant([2.0, 3.0], name = 'b')
result = a + b


第二个阶段: 执行计算图中所有的计算,

1.2.Tensorflow的数据模型 - 张量

张量的概念

在Tensorflow中所有的数据都是通过张量的形式来表示,可以将它理解为多维的数组,第n维的张量可以理解为一个n维的数组,但张量在Tensorflow中不直接采用数组的形式,只是对Tensorflow中运算结果的引用.张量中没有真正保存数字,而是得到这些数字的计算过程

import tensorflow as tf
a = tf.constant([1.0, 2.0], name = 'a')
b = tf.constant([2.0, 3.0], name = 'b')
result = tf.add(a, b, name = 'add')
print result

#输出:
#Tensor("add : 0", shape = (2,), dtype = float32)
#输出的编号从0开始,result就是输出的第一个结果


张量的使用

第一个用途:对中间计算结果的引用 将中间结果赋值给张量可以大大的提高代码的可读性,也不许要多次重复的运算相同的中间结果.

第二个用途:张量可以用来获取计算结果,也就是得到真实的数字.虽然张量本身没有存数具体的数据,但是可以通过会话(session)得到具体的数字.如上面的例子可以通过tf.Session().run(result)得到计算结果.

1.3.Tensorflow的运行模型 - 会话

Tensorflow中的会话(session)来执行定义号的计算,会话拥有并管理Tensorflow程序运行时的所有的资源,Tensorflow使用会话的模式有两种:

第一种:需要明确的调用会话生成函数和关闭会话函数这种模式的代码流程如下:

#创建会话
sess = tf.Session()
#运行,得到张量中的结果
sess.run(...)
#关闭会话,释放资源
sess.close()


第二种:通过Python的上下文管理器来使用会话这种模式的代码流程如下:

#创建会话并通过Python的上下文管理器来管理会话
with tf.Session() as sess:
#使用这个创建好的会话来计算关系的结果
sess.run()
#不需要调用Session.close()函数来关闭会话,上下文结束时资源会自动的释放.


通过ConfigProto Protocol Buffer来配置需要生成的对话

具体的配置方法:

config = tf.ConfigProto(allow_soft_placement = true, log_device_placement = True)
sess1 = tf.InteractiveSession(config = config)
sess2 = tf.Session(config = config)


这里有最常使用的两个参数:

allow_soft_placement:为True的时候,以下条件成立一个,GPU上的计算可以放到CPU上执行:

1.运算无法在GPU 上执行

2.没有GPU资源(如指定在第二个,但只有一个GPU)

3.运算输入包含对CPU运算结果的引用

log_device_placement:为True的时候,日志中将会记录每个节点被安排在那个设备上便于调试,设为False可以减少日志的量.

2. Tensorflow实现神经网络

这里直接上一个demo,通过代码来熟悉Tensorflow训练网络模型的过程:

# -*- coding: utf-8 -*-

import tensorflow as tf

#Numpy是一个科学计算的工具包,通过Numpy工具包生成模拟数据集
from numpy.random import RandomState

#定义训练数据batch的大小
batch_size = 8

#定义神经网络的参数,这里沿用3.4.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))

#在shape的一个维度上使用None可以方便使用不大的batch的大小.在训练的时候需要把数据分成比较小的batch,但在测试的时候,可以一次性使用所有的数据
#当数据集比较小的时候这样比较方便测试,数据集比较大的时候,将大量的数据放入一个batch可能会导致内存的溢出
x = tf.placeholder(tf.float32, shape = (None, 2), name = 'x-input')
y_ = tf.placeholder(tf.float32, shape = (None, 1), name = 'y-input')

#定义神经网络的前向传播
a = tf.matmul(x, w1)
y = tf.matmul(a, w2)

#定义损失函数和反向传播算法
cross_entropy = -tf.reduce_mean(y_ * tf.log(tf.clip_by_value(y, 1e-10, 1.0)))
train_step = tf.train.AdamOptimizer(0.001).minimize(cross_entropy)

#通过随机数生成一个模拟数据集
rdm = RandomState(1)
dataset_size = 128
X = rdm.rand(dataset_size, 2)

Y = [[int(x1 + x2 < 1)] for (x1, x2) in X]

#创建一个会话来运行TensorFlow程序
with tf.Session() as sess:
init_op = tf.global_variables_initializer()
#初始化变量
sess.run(init_op)
print sess.run(w1)
print sess.run(w2)

#设定训练的轮数
STEPS = 10000
for i in range(STEPS):
#每次选取batch_size个样本进行训练
start = (i * batch_size) % dataset_size
end = min(start + batch_size, dataset_size)

#通过选取的样本训练神经网络并更新参数
sess.run(train_step, feed_dict = {x : X[start : end], y_ : Y[start : end]})

if i % 1000 == 0:
total_cross_entropy = sess.run( cross_entropy, feed_dict = {x : X, y_ : Y})
print ("After %d training steps,cross entropy on all data is %g" % (i, total_cross_entropy))

print sess.run(w1)
print sess.run(w2)


主要是三个步骤:

1. 定义神经网络的结构和前向传播的输出结果

2. 定义损失函数以及选择反向传播的优化算法

3. 生成会话(tf.Session)并且在训练数据上反复运行反向传播优化算法
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐