[Tensorflow] TensorFlow之Hello World!(2)

TensorFlow入门的第一篇和大家聊了?graph图,op操作,node节点。对TensorFlow有了一个简单的认识,今天主要和大家分享的是TensorFlow中constant 常量, Variable变量,Placeholder占位符,Session启动图,fetches,feed等几个基本概念。

接下来我们通过一些简单的栗子分别来学习一下他们都是什么鬼。

# constant

# 导入模块

import tensorflow as tf

"""

怎么定义常量,常量的意思和我们平时理解的常量是一个意思,就是说它是固定的。 创建一个常量的函数是:

tf.constant(value, dtype=None, shape=None, name='Const', verify_shape=False)

其中除了value必须给以外,其他参数都是可选参数。

value:value的值必须为dtype类型,

shape: valued的形状,就是维度的意思

name:value的名字

verify_shape: 布尔值,True 或者False,是不是让tf来验证所给的value是不是shape辣么大的。

"""

# 接下来我们用函数constant建立几个常量

>>> constant_1 = tf.constant(3.0)

>>> print(constant_1)

Tensor("Const:0", shape=(), dtype=float32)

# 打印一下constant_1的类型,它是tf的Tensor类,张量!!!所以常量也叫张量常量。

>>> print(type(constant_1))

<class 'tensorflow.python.framework.ops.Tensor'>

>>> import numpy as np

>>> constant_2 = tf.constant(np.ones(5),dtype=tf.float32)

>>> constant_2

<tf.Tensor 'Const_1:0' shape=(5,) dtype=float32>

"""

接下来我们导入numpy模块,然后再定义几个常量,

"""

>>> import numpy as np

>>> np_array = np.array(range(15)).reshape(3,5)

# convert_to_tensor() 可以把numpy数组转化为tensor张量。

>>> tf_array = tf.convert_to_tensor(np_array)

>>> constant_3 = tf.constant(tf_array,dtype=tf.float32,shape=(3,5),name="constant_3")

# 然后我们用dir函数(很有用)看下constant_3都有那些方法,并且看看这些方法会输出什么。

>>> dir(constant_3)

['consumers',

'device',

'dtype',

'eval',

'get_shape',

'graph',

'name',

'op',

'set_shape',

'shape',

'value_index']

"""

按照顺序,consumers的意思是消费者,加s表示复数,意思就是说可以有很 个消费者。 那这里是什么意思呢?我们看到当我们调用consumers方法时, 返回值为一个空列表。而consumers的意思在整个程序中,使用constant_3的操作列表。当前无操作,所以返回值为空。

"""

>>> constant_3.consumers()

[]

"""

device比较好理解,设备的意思,意思是constant_3在哪个设备中使用, 还记得AlexNet吗?它使用了两个GPU。device就可以查看当前值在哪个GPU中使用。

"""

>>> constant_3.device

''

# dtype,数据类型,32位的浮点数。

>>> constant_3.dtype

tf.float32

>>>

"""

bound method 的意思是?直接理解不太好理解,我们换个套路, constant_3是constant类的一个实例,而eval是constant_3的一个方法, 这个方法是作用在一个类的实例上的,所以就叫做bound method

"""

>>> constant_3.eval

<bound method Tensor.eval of <tf.Tensor 'constant_3:0' shape=(3, 5) dtype=float32>>

# 当我们试图调用函数的时候,它报错了,这是为什么?因为 No default session is registered。因为我们还没有定义Session。

>>> constant_3.eval()

Traceback (most recent call last):

File "<pyshell#49>", line 1, in <module>

constant_3.eval()

File "C:\Python35\lib\site-packages\tensorflow\python\framework\ops.py", line 581, in eval

return _eval_using_default_session(self, feed_dict, self.graph, session)

File "C:\Python35\lib\site-packages\tensorflow\python\framework\ops.py", line 3783, in _eval_using_default_session

raise ValueError("Cannot evaluate tensor using `eval()`: No default "

ValueError: Cannot evaluate tensor using `eval()`: No default session is registered. Use `with sess.as_default()` or pass an explicit session to `eval(session=sess)`

# 形状,大小。

>>> constant_3.get_shape()

TensorShape([Dimension(3), Dimension(5)])

# grapg是查看定义的图的函数,

>>> constant_3.graph

<tensorflow.python.framework.ops.Graph object at 0x0000021C8EF67A20>

# 名字,和我们定义的时候是一样的,constant_3,冒号0,表示这是第0个常量。

>>> constant_3.name

'constant_3:0'

# op,操作。

>>> constant_3.op

<tf.Operation 'constant_3' type=Const>

# value_index值索引。当前为第0个。

>>> constant_3.value_index

0

# tf中除了constant以外,有没有其他函数可以定义常量张量呢?

# 主要有:

"""

tf.zeros

tf.zeros_like

tf.ones

tf.ones_like

tf.fill

"""

# 这个留给大家自己去试试,玩的愉快哦!

# Variable

"""

When you train a model, you use variables to hold and update parameters.

Variables are in-memory buffers containing tensors. They must be explicitly

initialized and can be saved to disk during and after training. You can later

restore saved values to exercise or analyze the model.( tensorflow doc)

"""

"""

什么是变量呢,tf文档中这样解释,当你训练一个模型的时候,你可以用Variable来hold存储和update更新参数

Variable可以包含张量,in-memory buffers?暂时可以不用管,因为我们定义变量的时候,这些变量还没用,因为模型没有训练,可以理解为缓存。Variable是需要被初始化,并且在训练过程中可以保存到磁盘,并且变量是可以回收的。如果理解不了,不要紧,后面看一个完整的栗子,就明白了。

"""

>>> Variable_1 = tf.Variable(tf.random_normal([3, 4], stddev=0.01),name="Variable_1")

>>> print(type(Variable_1))

<class 'tensorflow.python.ops.variables.Variable'>

# Variable_1的数据类型是Variable。

>>> Variable_2 = tf.Variable(tf.zeros([4]), name="Variable_2")

# 然后大家可以按照constant中我们提到的方法去探索一下Variable有哪些新奇的东西。

# Placeholder

# Placeholder 的意思是占位符。它是个占位子的符号。占位子,

# 很好理解,每个人都帮被人占过位子吧,想一下占位子的过程,

# 你先占这,等你的伙伴来了以后,你就让给他去坐。

# Placeholder也一样,他为后面真实数据的输入占位子,后面数据

# 来了以后,他的位子就让给我们模型需要输入的数据。

# placeholder的第一个参数表示数据类型,第二个参数表示shape。第三个是name。

placeholder(dtype, shape=None, name=None)

>>> placeholder_1 = tf.placeholder(tf.float32, [3,4],name="placeholder_1")

>>> type(placeholder_1)

<class 'tensorflow.python.framework.ops.Tensor'>

# 可以看到placeholder也是张量。所以他的方法和常量基本是相同的。

>>> placeholder_1.get_shape().as_list()

[3, 4]

# Session

"""

A Session object encapsulates the environment in which Operation

objects are executed, and Tensor objects are evaluated

"""

"""

一个Session对象包括了环境中的被执行的操作op,以及需要计算的张量。

我们知道tf的设计是基于图计算的。这样就需要一个入口,来执行之前定义的一系列的变量和操作op。

Session的作用就是提供这样一个入口。一般定义Session有两种方法。

1. session = tf.InteractiveSession()

这样定义一般是在Ipython中交互式使用,一次定义,可以多次使用。

这里提到Ipython,多说一句,Ipython是一个很好用的工具,安装直接用pip这可以,建议大家去学习,使用。

2. 使用with语句,

with tf.Session() as session:

[接下来就是一系列操作]

第二种方法和第一种的区别在意这样定义的session使用完之后,就自动关闭了。不需要我们再次关闭,缺点是只能调用一次。

"""

# session.run()

函数定义:

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

# Runs operations and evaluates tensors in fetches.(tensorflow -doc)

# 当我们定义好op和node之后,我们通过定义Session来启动计算图。

# 而run方法可以计算我们启动好的图模型。run的对象必须在fetches里面。

# fetches 可以为计算图中的一个元素,也可以为多个元素,如果是多个元素的话,一般用列表表示。

# feed_dict是和fetches相对应的值,一般在深度学习中,我们会把数据作为feed。feed的类型为python字典。

>>> a = tf.constant(3)

>>> b = tf.constant(4)

>>> print(a+b)

Tensor("add_1:0", shape=(), dtype=int32)

# 这里定义两个常量a,b,我们想计算一下a+b的值,发现直接打印并没有输出7。

# 那怎么能输出7呢,在tf中,所有的tensor都需要run以后才能得到具体的值。

>>> sess = tf.InteractiveSession()

>>> print(sess.run(a+b))

7

# 这样我们就得到了7,run的第一个参数a+b,就是fetches。

# 接下来我们定义两个placeholder,然后定义一个乘法tf.multiply(),计算两个数的积。

>>> input_1 = tf.placeholder(tf.float32, name="input_1")

>>> input_2 = tf.placeholder(tf.float32, name="input_2")

>>> results = tf.multiply(input_1, input_2)

>>> with tf.Session() as session:

# 初始化

session.run(tf.global_variables_initializer())

# 计算5.0 * 6.0 = 30.0

print(session.run(results, feed_dict={input_1:[5.0], input_2:[6.0]}))

好,tf入坑系列就到这里了,后面会有更多关于tf的坑点带给大家,祝大家玩的开心!

[参考文献]

1. https://www.tensorflow.org/

2. https://blog.altoros.com/basic-concepts-and-manipulations-with-tensorflow.html

3.https://cs224d.stanford.edu/lectures/CS224d-Lecture7.pdf

本文为作者原创,如有雷同,必然是别人抄我的。

原文发布于微信公众号 - 机器学习和数学(ML_And_Maths)

原文发表时间:2017-05-17

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏云霄雨霁

关系代数

19400
来自专栏Fish

CUDA PTX ISA阅读笔记(二)

8. 第八章 指令集 这一章占了整个手册的一大半(百十来页吧),主要介绍各种指令,虽然页数很多,但是大多数指令都很简单。 8.1. 指令的形式和语义描述 这章就...

54750
来自专栏小樱的经验随笔

统计0到n之间1的个数[数学,动态规划dp](经典,详解)

问题描述 给定一个十进制整数N,求出从1到N的所有整数中出现”1”的个数。 例如:N=2时 1,2出现了1个 “1” 。 N=12时 1,2,3,4,5,6,...

36080
来自专栏逸鹏说道

博客园LaTex的测试,附带开启方法

单位矩阵是个方阵,从左上角到右下角的对角线(称为主对角线)上的元素均为1。其他全都为0,eg:

11130
来自专栏磐创AI技术团队的专栏

Tensorflow从入门到精通(二):附代码实战

1.Tensor介绍 Tensor(张量)是Tensorflow中最重要的数据结构,用来表示Tensorflow程序中的所有数据。Tensor本是广泛应用在物...

30470
来自专栏来自地球男人的部落格

[LeetCode] 120. Triangle

【原题】 Given a triangle, find the minimum path sum from top to bottom. Each step...

20570
来自专栏chenjx85的技术专栏

leetcode-79-单词搜索(用dfs解决)

单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。

41110
来自专栏iOS 开发杂谈

为什么数组都是从0开始编号

为什么数组都是从 0 开始编号,首先先了解一下数组的概念。 数组 Array 是一种线性表数据结构,是一组连续的内存空间,用来存储一组具有相同类型的数据。数组...

28430
来自专栏Java技术分享

泛形

一. 泛型概念的提出(为什么需要泛型)? 首先,我们看下下面这段简短的代码:

196100
来自专栏数据结构与算法

P1115 最大子段和

题目描述 给出一段序列,选出其中连续且非空的一段使得这段和最大。 输入输出格式 输入格式: 输入文件maxsum1.in的第一行是一个正整数N,表示了序列的长度...

30150

扫码关注云+社区

领取腾讯云代金券