TensorFlow学习笔记(1)-基础笔记

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/kabuto_hui/article/details/86139889

1. 计算图的概念

  TensorFlow 程序通常被组织成一个构建阶段和一个执行阶段。 在构建阶段, op 的执行步骤 被描述成一个图。在执行阶段, 使用会话执行执行图中的 op。
  TensorFlow的名字中已经说明了它最为重要的两个特点:Tensor和Flow。其中Tensor意思是张量,可以被简单的理解为多维数组或者矩阵。Flow就是“流”的意思,直观的表达了张量之间通过计算相互转化的过程。
  下面的程序显示了TensorFlow程序的构建阶段和执行阶段,其中执行阶段在一个Session(会话)中被执行。

import tensorflow as tf
# 构建阶段
a = tf.constant([1.0, 2.0], name='a')
b = tf.constant([3.0, 4.0], name='b')
op_add = a + b

# 执行阶段
with tf.Session() as sess:
    print(sess.run(op_add))

输出:[4. 6.]

  可以看到,我们首先定义了两个常量,然后操作是将着两个常量相加,然后在Session中通过run()来执行这个操作。这里值得注意的是,我们使用了with关键字。with是一种上下文管理协议,它把流程中的try,except,和finally关键字和资源分配释放的相关代码都省去了,直接简化为try-except-finally处理流程。这么说可能不好理解,如果我们不使用with关键字,则我们的执行过程将表示为:

# 启动一个会话
sess = tf.Session()
# 执行操作
result = sess.run(op_add)
print(result)
# 关闭会话
sess.close()

  可以看到,不使用with关键字,我们将在使用后关闭会话这条语句。如果直接把操作放在with下边,我们就不用关心资源的分配与释放问题了。
  在实现上, TensorFlow 将图形定义转换成分布式执行的操作, 以充分利用可用的计算资源(如 CPU 或 GPU). 一般你不需要显式指定使用 CPU 还是 GPU, TensorFlow 能自动检测. 如果检测到 GPU, TensorFlow 会尽可能地利用找到的第一个 GPU 来执行操作.
  如果机器上有超过一个可用的 GPU, 除第一个外的其它 GPU 默认是不参与计算的. 为了让 TensorFlow 使用这些 GPU, 你必须将 op 明确指派给它们执行. with…Device 语句用来指派特定的 CPU 或 GPU 执行操作:

with tf.Session() as sess:
  with tf.device("/gpu:1"):
    a = tf.constant([1.0, 2.0], name='a')
    b = tf.constant([3.0, 4.0], name='b')
    op_add = a + b
    print(sess.run(op_add))

设备用字符串进行标识. 目前支持的设备包括:
“/cpu:0”: 机器的 CPU.
“/gpu:0”: 机器的第一个 GPU, 如果有的话.
“/gpu:1”: 机器的第二个 GPU, 以此类推.

2. 常量与变量

  在TensorFlow中,常量用tf.constant()来定义,变量用tf.Variable()来定义。这些常量、变量就是我们所说的张量。一个张量中主要包含三个部分:name(名字), shape(维度),type(类型)。我们在定义常量或者变量的时候,最好指定数据类型,类型不匹配会报错。用dtype=''来设置,主要的数据类型有14种:

实数:tf.float32, tf.float64
整数:tf.int8, tf.int16, tf.int32, tf.int64, tf.uint128
布尔型:tf.bool
复数:tf.complex64, tf.complex128

  在tensorflow中,变量在操作前必须初始化,而常量则不用。

import tensorflow as tf

# 构建阶段-设置变量
a = tf.Variable([1.0, 2.0], name='a')
b = tf.Variable([3.0, 4.0], name='b')
op_init = tf.global_variables_initializer()  # 初始化操作
op_add = a + b   						     # 执行操作

# 执行阶段
with tf.Session() as sess:
	sess.run(op_init)        # 初始化所有变量
    print(sess.run(op_add))

3. 交互式使用

  tensorflow中调用会话 Session 来启动图, 并调用 Session.run() 方法执行操作。为了便于使用诸如 IPython 之类的 Python 交互环境, 可以使用 InteractiveSession 代替 Session 类, 对于张量(主要指的是变量)可以使用 Tensor.eval() ,对于执行操作可以使用 Operation.run() 方法,代替 Session.run()。这样可以避免使用一个变量来持有会话。

import tensorflow as tf
sess = tf.InteractiveSession()

a = tf.Variable([1, 2], name='a', dtype=tf.int32)  # 定义变量
b = tf.constant([3, 4], name='b', dtype=tf.int32)  # 定义常量
op_add = a + b   # 定义操作

# 初始化变量
a.initializer.run()
# 执行操作
print(op_add.eval())

4. Fetch & Feed

  为了取回操作的输出内容, 可以在使用 Session 对象的 run() 调用 执行图时, 传入一些 tensor, 这些 tensor 会帮助你取回结果。

import tensorflow as tf

# 构建阶段-设置变量
a = tf.Variable([1.0, 2.0], name='a')
b = tf.Variable([3.0, 4.0], name='b')
op_init = tf.global_variables_initializer()  # 初始化操作
op_add = a + b   						     # 执行操作
op_sub = a - b

# 执行阶段
with tf.Session() as sess:
    sess.run(op_init)
    print(sess.run([op_add, op_sub]))

一个run中可以传入多个操作(Tensor)。
  上述示例在计算图中引入了 tensor, 以常量或变量的形式存储. TensorFlow 还提供了 feed 机制, 该机制 可以临时替代图中的任意操作中的 tensor 可以对图中任何操作提交补丁, 直接插入一个 tensor。feed使用一个 tensor 值临时替换一个操作的输出结果. 你可以提供 feed 数据作为 run() 调用的参数. feed 只在调用它的方法内有效, 方法结束, feed 就会消失.。最常见的用例是将某些特殊的操作指定为 “feed” 操作, 标记的方法是使用 tf.placeholder() 为这些操作创建占位符。

import tensorflow as tf

input1 = tf.placeholder(tf.types.float32)
input2 = tf.placeholder(tf.types.float32)
output = tf.mul(input1, input2)

with tf.Session() as sess:
  print sess.run([output], feed_dict={input1:[7.], input2:[2.]})

# 输出:
# [array([ 14.], dtype=float32)]

先用tf.placeholder声明,再在run中的feed_dict传入真实的值。这种方法可以实现一系列的迭代过程。

参考资料:

TensorFlow基本用法

猜你喜欢

转载自blog.csdn.net/kabuto_hui/article/details/86139889
今日推荐