零基础入门机器学习-tensorflow(三)

数字极客2019-04-27 15:49:10

上一篇《零基础入门机器学习-tensorflow(二)》介绍了Python的基本使用,现在就用Python来实际操作学习一下tensorflow吧。


什么是tensorflow?

TensorFlow™ 是一个采用数据流图(data flow graphs),用于数值计算的开源软件库。其用途不仅限于机器学习,只是这种结构非常适合用于机器学习,所以我们现在说到机器学习,大概第一个就会提到tensorflow。


第一个tensorflow程序 — Hello world!

先看下代码:

# 引入tensorflow库

import tensorflow as tf


# 创建一个操作(常量)

a = tf.constant('Hello world!')


# 启动会话(Session)

sess = tf.Session()


# 运行Graph

print(sess.run(a))


# 关闭会话

sess.close()

代码头部先引入tensorflow库,然后创建了一个常量a,稍后我会介绍在tensorflow中创建常量或变量的方法。


与传统编程方式不同的是,在tensorflow中真正运行代码的部分放置在会话(Session)中,虽然在会话前定义了常量a,但是并没有真正去运行,所以需要在Session中显式的通过Session.run去运行一下,比如上述代码的print(sess.run(a))。会话结束后使用Session.close()关闭。以上是一个完整的tensorflow程序,再复杂的tensorflow程序结构也是如此。


01

常量定义

# 引入tensorflow库

import tensorflow as tf


# 创建常量

a = tf.constant("这是字符串")

b = tf.constant(4, dtype=tf.int32)

c = tf.constant(0.12, dtype=tf.float32)

d = tf.constant([1, 2, 3, 4], dtype=tf.int32)


with tf.Session() as sess:    

    print(sess.run(a))    

    print(sess.run(b))    

    print(sess.run(c))    

    print(sess.run(d))

上面的例子中,创建了4个常量,第一个常量a是字符串,在定义时没有定义类型,系统会自动分配为字符串类型;第2、3个常量分别是整型和浮点型,在tensorflow中使用dtype定义类型时最好统一使用tensorflow的数据类型;第4种常量是一个一维数组,也称为张量。


在这个例子中,还看到了使用会话的另一种方法,使用效果是完全一样的。


02

变量定义

# 引入tensorflow库

import tensorflow as tf


# 创建变量

a = tf.Variable("这是一个变量")

b = tf.Variable(6, tf.int32)


# 初始化变量

init = tf.initialize_all_variables()


with tf.Session() as sess:    

    sess.run(init)    

    print(sess.run(a))    

    print(sess.run(b))

创建变量的方法和常量类似,区别在于,使用变量前需要初始化,上例中的init即初始化过程。


03

placeholder

# 引入tensorflow库

import tensorflow as tf


# 创建placeholer

a=tf.placeholder(tf.float32)

b=tf.placeholder(tf.float32)

c=tf.add(a,b)


with tf.Session() as sess:    

    print(sess.run(c, feed_dict={a:10, b:5}))

这个例子计算a+b的结果,其中a和b是2个placeholder,在定义时仅指定了数据类型,并没有赋值,placeholder在计算时才会赋值,未计算前只是占位。


feed_dict={a:10, b:5} 是为placeholder赋值的方法,因为c是a+b的结果,为了打印c,需要先为a和b赋值,这种使用方法在tensorflow中非常常见。


图与会话

这是一张简化的数据流图,可以看到,其中蓝色圆点是数据,好比上例中的a和b,蓝色带箭头的线是数据流动的方向,绿色部分是运算处理,所有这些数据、流和运算模块组成了一张类似流程图的图形,对应上例,就是在会话前的所有定义工作,在定义过程中,所有数据均不参与运算,仅仅是把图画好,为后续会话提供计算素材。


现在来看会话就比较好理解了,会话就是让图运行起来,以得到最后的结果。下面是一张真实的tensorflow数据流图:


什么是tensor?

张量(tensor)是所有深度学习框架中最核心的组件,因为tensorflow中几乎所有的所有运算和优化算法都是基于张量进行的。


01

张量的阶

在TensorFlow中,张量的维数来被描述为阶,但是张量的阶和矩阵的阶并不是同一个概念.张量的阶(有时是关于如顺序或度数或者是n维)是张量维数的一个数量描述。



经常用到的矩阵就是一种2阶张量,也是tensorflow中运用最多的一种张量,下面就是一个2阶张量的定义:


M = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]


02

张量的形状

张量可以用我们所说的形状来描述:用列表(或元祖)来描述我们的张量的每个维度的大小,例如:


  • 一个 n 维度的张量可以表示为:(D_0, D_1, D_2, …, D_n-1)

  • 一个 * W x H * 大小的张量(一般我们成为矩阵):(W, H)

  • 一个尺度是 W 的张量(一般我们称之为向量):(W, )

  • 一个简单的标量(或者与之等价的):()或者(1, )


# 引入tensorflow库

import tensorflow as tf


# 创建张量

my_tensor = tf.constant(0., shape=[2,3,5])


with tf.Session() as sess:    

    print(sess.run(my_tensor))

这个例子中定义了一个3阶张量,3个维度包含的元素分别是2、3、5,最后打印出来如下:

[[[0. 0. 0. 0. 0.] 

[0. 0. 0. 0. 0.] 

[0. 0. 0. 0. 0.]]


[[0. 0. 0. 0. 0.] 

[0. 0. 0. 0. 0.] 

[0. 0. 0. 0. 0.]]]


数字极客

公众号ID:digital-geek

关注