第四周、机器学习-常用库函数

一、TensorFlow基础

TensorFlow是Google开源的机器学习库,基于DistDelief进行研发的第二代人工智能系统,用来帮助我们快速的实现DL和CNN等各种算法公式。其名字本身描述了它自身的执行原理:Tensor(张量)意味着N维数组,Flow(流)意味着基于数据流图的计算。

数据流图中的图就是我们所说的有向图。我们知道,在图这种数据结构中包含两种基本元素:节点和边。这两种元素在数据流图中有各自的作用。节点用来表示要进行的数学操作,另外,任何一种操作都有输入/输出,因此它也可以表示数据的输入的起点/输出的终点。边表示节点与节点之间的输入/输出关系,一种特殊类型的数据沿着这些边传递。这种特殊类型的数据在TensorFlow被称之为tensor,即张量,所谓的张量通俗点说就是多维数组。当我们向这种图中输入张量后,节点所代表的操作就会被分配到计算设备完成计算。

下图是TensorFlow设计图中数据的流向,他会帮助你更好的认识TensorFlow工作过程:

TensorFlow Graph

到现在,我们只是认识了TensorFlow。接下来通过TensorFlowd的四个特性,来说明我们为什么要使用TensorFlow:

灵活性: 非严格的“神经网络”库。这意味这我们的计算只要能够表示为数据流图,就能够使用。

可移植性:底层核心采用C++编译,可以运行在台式机、服务器、手机移动等设备上,提供对分布式的支持,能够快速构建深度学习集群。

多语言支持:前端支持Python,C/C++,Java以及Go,以及非官方支持的Scala,但是目前对Python接口支持最好。

高效:提供对线程、队列、异步操作支持,同时支持运行在CPU和GPU上,能够充分发挥硬件潜力.

可以说正是由于以上四个特性,使得TensorFlow的使用逐渐流行开来。其中我认为TensorFlow最关键的一点是允许我们将计算的过程描述为一张图(Graph),我将其称这张图为”计算图”,能让我们很容易的操作其中的网络结构。


TensorFlow使用Graph来描述计算任务。图中的节点被称之为op,一个op可以接受0或多个tensor作为输入,也可产生0或多个tensor作为输出。任何一个Graph要想运行,都必须借助上下文Session。通过Session启动Graph,并将Graph中的op分发到CPU或GPU上,借助Session提供执行这些op。op被执行后,将产生的tensor返回。借助Session提供的feed和fetch操作,我们可以为op赋值或者获取数据。计算过程中,通过变量(Variable)来维护计算状态。

下表说明TensorFlow中常用的库函数:


TensorFlow常用库函数

二、TensorFlow理论与实践

TensorFlow程序的基本过程通常分为两步:构建阶段和执行阶段。在构建阶段,我们组织多个op,最终形成Graph。在执行阶段,使用会话执行op。

import tensorflow as tf

# 定义‘符号’变量,也称为占位符

a = tf.placeholder("int32")

b = tf.placeholder("int32")

# 构造一个op节点

y = tf.multiply(a, b)

# 建立会话

sess = tf.Session()

# 运行会话,输入数据,并计算节点,同时打印结果

print(sess.run(y, feed_dict={a: 3, b: 3}))

# 任务完成, 关闭会话.

sess.close()

1.构建阶段

构造阶段的主要目的是为了构建一张计算图。构建图的第一步是创建源op,源op不需要任何输入,源op的输出被传递给其他op作为输入,例如常量(Constant)。

op:接受(流入)零个或多个输入,返回(流出)零个或多个输出。

数据类型主要分为tensor,variable,constant。

tensor:多维array或list

# 创建tensor,指定类型、名称

tensor_name=tf.placeholder(type, shape, name)

variable:通常可以将一个统计模型中的参数表示为一组变量。例如,你可以将一个神经网络的权重当作一个tensor存储在变量中。在训练图的重复运行过程中去更新这个tensor

# 创建变量

name_variable = tf.Variable(value, name)

# 初始化单个变量

init_op=variable.initializer()

# 初始化所有变量

init_op=tf.initialize_all_variables()

# 更新操作

update_op=tf.assign(variable to be updated, new_value)

简单示例

这里我们来创建一个包含三个op的图,其中两个constant op,一个matmul op。

import tensorflow as tf

# 创建作为第一个常量op,该op会被加入到默认的图中

# 1*2的矩阵,构造器的返回值代表该常量op的返回值

matrix_1 = tf.constant([[3., 3.]])

# 创建第二个常量op,该op会被加入到默认的图中

# 2*1的矩阵

matrix_2 = tf.constant([[2.], [2.]])

# 创建第三个op,为矩阵乘法op,接受matrix_1和matrix_2作为输入,product代表乘法矩阵结果

product = tf.matmul(matrix_1, matrix_2)

到现在我们已经创建好了包含三个op的图。下面我们要通启动该图,执行运算。

2.执行阶段

Session

首先我们需要创建一个Session对象。在不传参数的情况下,该Session的构造器将启动默认的图。之后我们可以通过Session对象的run(op)来执行我们想要的操作。


会话相关操作

简单示例

# 创建会话

sess = tf.Session()

# 赋值操作

sess.run([output], feed_dict={input1:value1, input2:value1})

# 用创建的会话执行操作

sess.run(op)

# 取值操作

# 关闭会话

sess.close()

结合构建阶段和执行阶段完整示例如下:

import tensorflow as tf

# 创建作为第一个常量op,该op会被加入到默认的图中

# 1*2的矩阵,构造器的返回值代表该常量op的返回值

matrix_1 = tf.constant([[3., 3.]])

# 创建第二个常量op,该op会被加入到默认的图中

# 2*1的矩阵

matrix_2 = tf.constant([[2.], [2.]])

# 创建第三个op,为矩阵乘法op,接受matrix_1和matrix_2作为输入,product代表乘法矩阵结果

product = tf.matmul(matrix_1, matrix_2)

# 获取sess

sess = tf.Session()

# 来执行矩阵乘法op

result = sess.run(product)

# 输出矩阵乘法结果

print("result:",result)

# 任务完毕,关闭Session

sess.close()

除了通过Session的close()的手动关闭外,也可以使用with代码块:

with tf.Session() as sess:

    result=sess.run(product)

    print("result:",result)

输出结果:

result:[[ 12.]]

3.构建数据结构

在TensorFlow中,用tensor来表示其所使用的数据结构,简单点理解tensor就是一个多维数组.任何一个物体,我们都可以用几个特征来描述它.每个特征可以划分成一个维度.比如:一小组图像集表示为一个四维浮点数数组, 这四个维度分别是 [batch, height,width, channels].


数据相关操作

Variables

TensorFlow使用Variables来维护图执行过程中的状态信息.下面我们演示一个计数器:

import tensorflow as tf

#创建一个变量,初始化为0

state = tf.Variable(0, name="counter")

#创建一个常量

one = tf.constant(1)

#加法计算

new_value = tf.add(state, one)

#更新变量值

update = tf.assign(state, new_value)

init_op = tf.initialize_all_variables()

sess = tf.Session()

sess.run(init_op)

print(sess.run(state))

for _ in range(10):

    sess.run(update)

    print(sess.run(state))

输出结果:

0

1

2

3

4

5

6

7

8

9

10

Fetch

为了获取操作输出的内容,可以在使用Session对象的run(op)时,传入一些tensor,这些tensor用来取回我们想要的结果。

import tensorflow as tf

value_1 = tf.constant(3.0)

value_2 = tf.constant(2.0)

value_3 = tf.constant(5.0)

# 2.0+5.0

temp_value=tf.add(value_2,value_3)

# 3.0+(2.0+5.0)

result=tf.add(value_1,temp_value)

sess = tf.Session()

print(sess.run([temp_value,result]))

Feed

我们可以通过TensorFlow对象的placeholder()为变量创建指定数据类型占位符,在执行run(op)时通过feed_dict来为变量赋值。

import tensorflow as  tf

input_1 = tf.placeholder(tf.float32)

input_2 = tf.placeholder(tf.float32)

output = tf.add(input_1, input_2)

with tf.Session() as sess:

# 通过feed_dict来输入,outpu表示输出

print(sess.run([output],feed_dict={input_1:[7.],input_2:[2.]}))

placeholder

TensorFlow提供一种占位符操作,在执行时需要为其提供数据.这有点类似我们编写sql语句时使用?占位符一样,你可以理解为预编译.

占位符操作

input_value = tf.placeholder(tf.float32,shape=(1024,1024))

4.模型保存和恢复

在tensorflow中最简单的保存与加载模型的方式是通过Saver对象。

保存模型

import tensorflow as tf

def save_model():

v1 = tf.Variable(tf.random_normal([1, 2]), name="v1")

v2 = tf.Variable(tf.random_normal([2, 3]), name="v2")

init_op = tf.global_variables_initializer()

saver = tf.train.Saver()

with tf.Session() as sess:

    sess.run(init_op)

    saver_path = saver.save(sess, "./model.ckpt")

    print("model saved in file: ", saver_path)

加载模型

用同一个Saver对象来恢复变量,注意,当你从文件恢复变量是,不需要对它进行初始化,否则会报错。

import tensorflow as tf

def load_model():

v1 = tf.Variable(tf.random_normal([1, 2]), name="v1")

v2 = tf.Variable(tf.random_normal([2, 3]), name="v2")

saver = tf.train.Saver()

with tf.Session() as sess:

saver.restore(sess,"./model.ckpt")

print("mode restored")

有兴趣的读者可以继续学习训练模型,移植到移动设备教程。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,830评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,992评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,875评论 0 331
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,837评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,734评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,091评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,550评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,217评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,368评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,298评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,350评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,027评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,623评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,706评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,940评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,349评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,936评论 2 341

推荐阅读更多精彩内容