TensorFlow学习心得(1):入门概念与程序结构

相信很多朋友入门机器学习使用的第一个框架就是TensorFlow了,但是很多小白(比如作者)对于TF的认识还停留在TFboys的阶段。那么我们今天就来简单地了解一下TensorFlow的概念和程序结构。

1. Tensor

首先我们来看看什么是Tensor。在官网的文档中,Tensor被翻译成”张量“,它的定义如下:

张量是对矢量和矩阵向潜在的更高维度的泛化,TensorFlow 在内部将张量表示为基本数据类型的n维数组。

这是一个相当抽象的概念。其实,在TensorFlow之中,我们使用Tensor来表示数据。或者可以这么表达:TensorFlow所有的数据都是一个n维的数组,只是我们给它起了个名字叫做张量(Tensor)。

TensorFlow 在内部将张量表示为基本数据类型的 n维数组。那么在一个数组里边,我们总得知道我们的存进去的数据究竟是什么类型。
在这里插入图片描述不少朋友看到这张图应该会感到比较亲切。TF的数据类型和大多数编程语言基本一致。接下来,我们简单看一看几种特殊的TF数据类型。

特殊的张量有一下几种:

  • tf.Variable— 变量
  • tf.constant— 常量
  • tf.placeholder—占位符
  • tf.SparseTensor—稀疏张量

常量就是常量的意思,一经创建就不会被改变。(相信大家还是能够理解的)

在TensorFlow中,创建常量的方式十分简单:

a = tf.constant(2)
b = tf.constant(3)

而变量也挺好理解的(就将编程语言的概念跟这里类比就好了)。一般来说,我们在训练过程中的参数一般用变量进行存储起来,因为我们的参数会不停的变化。

在TensorFlow创建变量有两种方式:

  1. 使用Variable类来创建

tf.random_normal 方法返回形状为(1,4)的张量。它的4个元素符合均值为100、标准差为0.35的正态分布。

W = tf.Variable(initial_value=tf.random_normal(shape=(1, 4), mean=100, stddev=0.35), name="W")
b = tf.Variable(tf.zeros([4]), name="b")
  1. 使用get_variable的方式来创建
my_int_variable = tf.get_variable("my_int_variable", [1, 2, 3], dtype=tf.int32,
  initializer=tf.zeros_initializer)

值得注意的是:当我们创建完变量以后,我们每次使用之前,都需要为其进行初始化!

tf.global_variables_initializer()

同样地,在TensorFlow占位符也是这么一个概念,可能需要等到运行的时候才把某些变量确定下来,于是我们就有了占位符。在TensorFlow使用占位符也很简单:

文件名需要等到运行的时候才确定下来。

train_filenames = tf.placeholder(tf.string, shape=[None])

当我们运行的时候,可以通过feed_dict将占位符具体的值给确定下来。

feed_dict={train_filenames: training_filenames}

上面的东西说白了在编程语言中都是有的,只是语法变了而已。

2. Flow

我们将Flow翻译成中文:流,所以现在是Tensor流?

其实,在TensorFlow中,使用graph)来表示计算任务。其实TensorFlow默认会给我们一张空白的图,一般我们会叫这个为“数据流图”。

数据流图由有向边和节点组成,在使用TensorFlow的时候我们会在图中创建各种的节点,而Tensor会在这些节点中流通。所以,就叫做TensorFlow

那有人就会好奇,我们执行什么操作会创建节点呢?在TensorFlow中,节点的类型可以分为三种:

  • 存储节点:有状态的变量操作,通常用于存储模型参数
  • 计算节点:无状态的计算和控制操作,主要负责算法的逻辑或流程的控制
  • 数据节点:数据的占位符操作,用于描述图外输入的数据

看到这里的同学,可能就反应过来了:原来在上面创建的变量、常量和占位符在TensorFlow中都会生成一个节点!对于这类的操作Operation(行为)一般大家会简说成op。

所以,op就是在TensorFlow中所执行的一个操作统称而已(有可能是创建变量的操作、也有可能是计算的操作)。

在TensorFlow的常见的op有以下:
在这里插入图片描述相信不少小伙伴或多或少地了解了其中每个操作的确切含义。其实说白了就是TensorFlow会给我们一张空白的数据流图,我们往这张数据流图填充(创建节点),从而实现想要效果。

因此,TensorFlow使用数据流图来表示计算任务,使用Tensor来表示数据,Tensor在数据流图中流动。在TensorFlow中”创建节点、运算“等行为统称为op。

3. Session

TensorFlow程序通常被组织成一个构建阶段和执行阶段. 在构建阶段, op的执行步骤被描述成一个图. 在执行阶段, 使用会话执行执行图中的op。

注意:因为是有向边,所以只有等到之前的入度节点们的计算状态完成后,当前节点才能执行操作。
说白了,就是当我们在编写代码的时候,实际上就是在将TensorFlow给我们的空白图描述成一张我们想要的图。但我们想要运行出图的结果,那就必须通过session来执行。

Fetch就时候可以在session.run的时候传入多个op(tensor),然后返回多个tensor(如果只传入一个tensor的话,那就是返回一个tensor)。

我们来简单总结一下:TensorFlow 是一个编程系统, 使用图来表示计算任务.。图中的节点被称之为 op (operation 的缩写)。一个 op 获得 0 个或多个 Tensor, 执行计算, 产生 0 个或多个 Tensor。每个 Tensor 是一个类型化的多维数组。

4. 程序结构

介绍了这么多关于TF的基本概念,接下来我们就通过一个栗子了解一下TensorFlow 与其他编程语言的不同之处。

首先TensorFlow程序分为两个独立的部分,分为任何拟创建神经网络的蓝图的构建及其执行。起初这对于传统程序员来说看起来很麻烦,但是正是图定义和执行的分开设计让 TensorFlow 能够多平台工作以及并行执行,TensorFlow 也因此更加强大。举个小例子:

import tensorflow as tf

# 创建数据流图:y = a + b,其中a和b为存储节点。
a = tf.Variable(1.0)
b = tf.Variable(1.0)
y = tf.add(a + b)

# 如果不使用session来运行,那上面的代码只是一张图。我们通过session运行这张图,得到想要的结果
with tf.Session() as sess:
    print(sess.run(y))

计算图的构建非常简单。添加变量和操作,并按照逐层建立神经网络的顺序传递它们(让张量流动)。

在本例子中,计算图由三个节点组成,目的也很明确,即为计算 a+b 之值。

接下来,为了使这个图生效,首先需要使用 tf.Session() 定义一个会话对象 sess。然后使用 Session 类中定义的 run 方法运行它,如下所示:

run(fetches,feed_dict=None,options=None,run_metadata)

运算结果的值在 fetches 中提取。在示例中,提取的张量为 y。run 方法将导致在每次执行该计算图的时候,都将对与 y 相关的张量和操作进行赋值。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值