TensorFlow之重要概念的基础操作


tensorflow为什么要这样取名,tensor:张量,flow:流动。在我们的tensorflow里面,变量就是张量,张量在不断的流动。其实就相当于我们日常生活中的流程图一般。这就引申出Graph这个概念。

Graph

图描述了计算的过程,可以通过tensorboard图形化流程结构。

在这里插入图片描述

我们看到上面这个图,我们暂且称为流程图吧,流程图先是a+b=d,a*b=c,然后d+c=e。很简单的一个流程。对应的在我们tensorflow里面的代码实现是

import tensorflow as tf
a = tf.constant(1, name='input_a')
b = tf.constant(2, name='input_b')
c = tf.multiply(a, b, name='multiply_c')
d = tf.add(a, b, name='add_d')
e = tf.add(d, c, name='add_e')
sess = tf.Session()
sess.run(e)
writer = tf.summary.FileWriter('graph', sess.graph)

tf.constant就是一个变量的声明,这个变量在图中的名字是input_a,然后multiply和add就很好理解了。
可以从上图看到,我们这个代码的目的就如图一样,几个加乘步骤,tensor张量在这张图里顺着每个分支流动,很好理解的其实。
最后我们要完成这个操作还需要创建会话,在会话中运行。下面介绍会话。

Session

我们搭建了图这个框架,但是并没有运行。图是在Session的上下文执行。
会话会将图每个步骤分发到诸如cpu或gpu之类的设备执行。
具体的几个关键步骤可以分为:

创建关闭

sess = tf.Session()
# 中间部分代码省略
sess.close()
# 或者
with tf.Session() as Sess:

比较常见的2种创建会话方式如上。其中一种是创建会话后需要关闭,但是with就比较方便了,with xx as 安全打开还能命名,有点类似我们文件处理的,这样创建会话就不用关闭了。

注入机制

注入机制实际上就是完成计算图这个作用。注入机制就相当于在会话里面对图进行运行一样的。比如说上文的a+b,a*b,这些都属于注入机制,很好理解,就是把这些张量给注入会话,在会话中运行。

with tf.Session() as Sess:
    a = tf.placeholder(dtype=tf.float32)
    b = tf.placeholder(dtype=tf.float32)
    add = a + b
    add_val = sess.run(add, feed_dict={a:1, b:2})
    print(add_val)

就比如说这样,在session这个会话里进行操作。a,b表示占位符,就相当于你去占座一样的。然后呢在feed_dict里面给这个a,b赋值,这时候空位a,b就有值了,然后add呢就对应到后面的fetch,fetch后面给大家讲解。

指定设备

运行代码可以在gpu也可以在cpu。你可以指定设备来运行。
很容易,下面就是用0号cpu来运行。with呢就是用的意思,用-设备-cpu-0号,意思很简单。注意都在会话里运行。

a = tf.placeholder(dtype=tf.float32)
b = tf.placeholder(dtype=tf.float32)
with tf.Session() as Sess:
    with tf.device('/cpu:0'):
        add = a + b
        add_val = sess.run(add, feed_dict={a:1, b:2})
        print(add_val)

Tensor

对于一个计算图,所有节点之间传递的数据,我们都叫tensor,我们的网络就是一个计算图。网络中的数据就叫tensor,tensor其实也可以理解为一个数组。上面的a,b,c等等都称为张量。
tensor表现形式有tf.constant(),tf.Variable(),tf.placeholder(),tf.SparseTensor(),最后一个相当于是稀疏矩阵,我们就重点掌握前三个就可以了。

cons = tf.constant(value=[1, 2], dtype=tf.float32, shape=(1, 2), name='testconst', verify_shape=False)
X = tf.placeholder(dtype=tf.float32, shape=[144, 10], name='X')
#X = tf.placeholder(dtype=tf.float32, shape=[None, None], name='X')

W = tf.Variable(tf.zeros([3, 10], tf.float32), dtype=tf.float32, name='W')

constant就是常量,可以是一些定值,那Variable顾名思义就是会变的,是需要学习的。占位符如果知道维度就可以协商shape,不知道维度就可以写上None。
如果要用变量就需要初始化,具体例子在fetch。

Operation

Operation是对应计算图里面的计算节点,输入输出均为tensor,通过调用Session.run(tensor),tensor.eval()这两个办法可以获取该tensor的值。

Feed

注入的节点通常就是占位符。通过feed为计算图注入值很多都关于占位符。还是上面例子。

with tf.Session() as Sess:
    a = tf.placeholder(dtype=tf.float32)
    b = tf.placeholder(dtype=tf.float32)
    add = a + b
    add_val = sess.run(add, feed_dict={a:1, b:2})
    print(add_val)

a,b就是占位符,是没有确定的tensor,通过搭建这个加法运算,ab取值未知,那就可以是placeholder,加法就是一个operation,feed就是赋值,a就是1,b就是2.注意feed是个字典。有了feed的值之后,那么实际的值就有了,通过run来执行c这步相加的operation。
通过fetch来获取计算结果。

Fetch

fetch可以是一个单独的tensor或者是一个list,如果获取多个tensor就可以使list。举个例子

x = tf.placeholder(tf.float32, shape=(1, 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)) 

a = tf.matmul(x, w1)
y = tf.matmul(a, w2)
with tf.Session() as sess:
    init_op = tf.global_variables_initializer()
    sess.run(init_op)
    print(sess.run(y, feed_dict={x: [[0.7, 0.5]]}))

首先是不知道x的值那就是占位符,定义2个变量w1,w2.a这个tensor的操作是x与w1矩阵相乘,同理y。创建会话,首先变量进行初始化,没初始化是没办法运行的,global_variables_initializer很明显,它的意思是全局-变量-初始化。然后呢run一下变量就有值了。但是y这个fetch还没有值,因为y需要x,x的值靠这里feed。这样y这个fetch就可以去run下,就有值了。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值