tensorflow学习二:概念知识和一个帮助理解的demo
2017-10-31 20:35
411 查看
该博客首先从Tensorflow的计算模型,数据模型和运行模型三个角度进行介绍,这样可以对tensorflow有一个直观的了解.然后是神经网络的计算流程,并通过Tensorflow实现这些计算.
计算图:由节点和他们之间的边组成,每个计算都是计算图上的节点,节点之间的边描述了计算之间的依赖关系.
第一个阶段: 定义计算图中所有的计算.下面的这段代码是定义计算的过程,
第二个阶段: 执行计算图中所有的计算,
第二个用途:张量可以用来获取计算结果,也就是得到真实的数字.虽然张量本身没有存数具体的数据,但是可以通过会话(session)得到具体的数字.如上面的例子可以通过tf.Session().run(result)得到计算结果.
第一种:需要明确的调用会话生成函数和关闭会话函数这种模式的代码流程如下:
第二种:通过Python的上下文管理器来使用会话这种模式的代码流程如下:
这里有最常使用的两个参数:
allow_soft_placement:为True的时候,以下条件成立一个,GPU上的计算可以放到CPU上执行:
1.运算无法在GPU 上执行
2.没有GPU资源(如指定在第二个,但只有一个GPU)
3.运算输入包含对CPU运算结果的引用
log_device_placement:为True的时候,日志中将会记录每个节点被安排在那个设备上便于调试,设为False可以减少日志的量.
主要是三个步骤:
1. 定义神经网络的结构和前向传播的输出结果
2. 定义损失函数以及选择反向传播的优化算法
3. 生成会话(tf.Session)并且在训练数据上反复运行反向传播优化算法
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)并且在训练数据上反复运行反向传播优化算法
相关文章推荐
- 一个小Demo,帮助你理解ioc容器是怎么进行依赖注入的
- 帮助大家学习对接口和反射理解,另外帮我解惑下其中的一个问题
- http的基础知识帮助减少代码量和复杂度的一个Demo
- smarty学习基础篇----仿照samrty模版写一个自己的简单smarty模版 帮助自己理解smarty
- FFMPEG理解一个偶然遇到了ffmpeg,看起来不多,而且通用性很强,算是一个扎实的技术。 研究了两天了,万事开头难啊。 主要是新手学习一个东西的时候,没有宏观的概念,如果猛地往某个细节去钻,往往碰
- 一个demo,帮助您加深理解和记忆android activity 生命周期
- MiniFlow,帮助理解TensorFlow关键概念--图
- tensorflow学习(2):tensorflow中基本概念的理解
- 一个很简单的泛型类型List的示例,帮助理解泛型的概念。
- 努力做一个知识的积累、学习和创造者
- 理解 NAT 知识的 4 个概念:Inside local,Inside global,Outside local,Outside global
- Spring学习笔记:概念理解
- Jquery的知识学习积累,内附自己做的一个网站案例
- 【Android】Android开发点击查看手机电量的小功能。学习广播的一个小技能小Demo
- 私有继承的一个例子,帮助加强理解
- javascript系列学习----对象相关概念理解
- 一个程序员应该具备的基础知识和概念
- Tensorflow 入门学习3 Hello TensorFlow 建立一个隐藏层的神经网络实现回归分析
- Spring学习笔记——概念理解
- Tensorflow学习: 乘法demo