为了账号安全,请及时绑定邮箱和手机立即绑定

TensorFlow 核心

标签:
Python

下面主要介绍 Low Level APIs

TensorFlow Core Walkthrough

一般地,TensorFlow 编程由以下两个独立的部分组成:

  • 通过 tf.Graph 建立计算图 (Building the computational graph (a tf.Graph).)
  • 使用 tf.Session 运行计算图(Running the computational graph (using a tf.Session).)
import numpy as np
import tensorflow as tf

Graph 与 Session

A computational graph is a series of TensorFlow operations arranged into a graph. The graph is composed of two types of objects.

  • tf.Operation (or “ops”): The nodes of the graph. Operations describe calculations that consume and produce tensors.
  • tf.Tensor: The edges in the graph. These represent the values that will flow through the graph. Most TensorFlow functions return tf.Tensors.

计算图是由一系列 TensorFlow 的运算 (ops) 按照一定的顺序排列构成的。在一个 tf.Graph 中包含两种类型的对象:

  • tf.Operation (or “ops”): 图的节点(nodes). 节点描述了如何 对 Tensor 的输入和输出进行计算;
  • tf.Tensor: 图的边(edges). 边代表了流经计算图的值。

大多数 TensorFlow 函数均返回 tf.Tensors.

重要: tf.Tensors 并不存储 values, 而它仅仅是处理计算图中元素的一个 handle.

a = tf.constant(3.0, dtype=tf.float32)
b = tf.constant(4.0)  # also tf.float32 implicitly
total = a + b
print(a)
print(b)
print(total)
Tensor("Const:0", shape=(), dtype=float32)
Tensor("Const_1:0", shape=(), dtype=float32)
Tensor("add:0", shape=(), dtype=float32)

上面说的不是很好理解,我说下自己的理解:

  • tf.Tensor 可以理解为一个符号,比如数学中的未知元 xx (仅仅是一个代表, 它可以是数组,字符串等)
  • tf.Operation 可以理解为 xx 的方程,比如 x7+3x5+1x^7 + 3x^5 + 1 (只要你可以定义一个合理的运算规则, 若 xx 是字符串,该方程也可能成立)

比如,当你传入 x=1x=1,则会输出运算的结果 x7+3x5+1=10x^7 + 3x^5 + 1 = 10;当没有值传递给 xx 时,它们仅仅是一串符号而已。

换句话说,tf.Graph 是一个定义了各种 tf.Tensor 的依赖关系 (tf.Operation) 抽象计算图,而 tf.Session 可以看作是 tf.Graph 的一个实例(具象化)。

Datasets

对于一些简单的实验,使用 tf.placeholder 即可 feed 数据。但是,对于数据量比较大或者实验比较复杂,则使用迭代器是一个很好的选择:

  • To get a runnable tf.Tensor from a Dataset you must first convert it to a tf.data.Iterator, and then call the Iterator’s tf.data.Iterator.get_next method.

  • The simplest way to create an Iterator is with the tf.data.Dataset.make_one_shot_iterator method. For example, in the following code the next_item tensor will return a row from the my_data array on each run call:

my_data = [
    [0, 1, ],
    [2, 3, ],
    [4, 5, ],
    [6, 7, ],
]
slices = tf.data.Dataset.from_tensor_slices(my_data)
next_item = slices.make_one_shot_iterator().get_next()
next_item
<tf.Tensor 'IteratorGetNext:0' shape=(2,) dtype=int32>

注意,当此迭代器 Costume 尽所有数据时,你再运行 .get_next() 会报错,为此,TensorFlow 提供了一个异常处理机制:tf.errors.OutOfRangeError, 下面是一个使用的例子:

while True:
    try:
        print(sess.run(next_item))
    except tf.errors.OutOfRangeError:
        break

如果 Dataset 依赖于节点的状态,那么你需要在使用迭代器之前对其进行初始化:

r = tf.random_normal([10, 3])
dataset = tf.data.Dataset.from_tensor_slices(r)
iterator = dataset.make_initializable_iterator()
next_row = iterator.get_next()

sess.run(iterator.initializer)
while True:
    try:
        print(sess.run(next_row))
    except tf.errors.OutOfRangeError:
        break

详细见datasets

Layers

使用 tf.layers 将需要训练的参数投入到计算图中是一个很好的选择。

下面我们使用 tf.layers 创建一个线性模型:

x = tf.constant([[1], [2], [3], [4]], dtype=tf.float32)
y_true = tf.constant([[0], [-1], [-2], [-3]], dtype=tf.float32)

linear_model = tf.layers.Dense(units=1)

y_pred = linear_model(x)
loss = tf.losses.mean_squared_error(labels=y_true, predictions=y_pred)

optimizer = tf.train.GradientDescentOptimizer(0.01)
train = optimizer.minimize(loss)

init = tf.global_variables_initializer()

sess = tf.Session()
sess.run(init)
for i in range(100):
    _, loss_value = sess.run((train, loss))
    print(loss_value)

print(sess.run(y_pred))
点击查看更多内容
4人点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消