tensorflow从入门到搭建学习模型

0、安装tensorflow

  • 安装方法并不困难,只需要按照tensorflow官网https://www.tensorflow.org/install/(中文显示)的指导完成就行。有各个操作系统下的安装指导。
  • 大致分为以下步骤

1、安装python3(更推荐直接安装包括了python3基本库以及多个科学计算库"numpy、sklearn等"的Anaconda)
2、在Anaconda里面再下载安装tensorflow(34MB左右大小)
3、tensorflow分为普通版和GPU版,若有GPU则应安装GPU版。

1、从名字理解tensorflow

  • tensor
    即张量的意思,也可以理解为我们常见的矩阵,但每一个tensor是一个实例对象。矩阵里面有很多由同一个基本数据类型组成的数据元素。所以tensor可以理解为tensorflow这种学习框架最常用的一种数据类型。
  • flow
    即流动的意思。
  • tensor+flow
    意为矩阵形式的数据在流动,流动就会产生变化。所以tensorflow的目的就是让矩阵形式的数据经过一系列矩阵变换,得到我们想要的矩阵。

2、tensor是怎么flow的?数据在哪里流动?数据流动过程中怎么发生变化?

  • graph

    图,地图,流程图,计算图。类似现实中的黄河流域图,在图中能看到多个节点和路线。有多个地方有水流入黄河主干也有多个地方有水流出。黄河的水在经过各个节点后颜色有变化,黄河的源头在青藏高原,水很清澈,在流经兰州后变黄,然后在流经银川到陕西、山西、河南洛阳这一带水特别浑浊污染严重,最后流入海洋的水也早已经不是源头的清水。
    黄河流域图.jpg
tensorflow的数据流动过程图.gif

tensor数据就是在类似下面这样的图中流动。
计算图
图中tensor如何发生变化?
  • w、x和b就是3个不同的tensor矩阵数据,作为输入节点——input tensor
  • MatMul、Add和ReLU,是3个计算节点,分别代表3个对矩阵的不同的操作,就是这些操作使得tensor数据发生变化——operator
  • C是由3个输入矩阵经过一系列变化后的输出数据——output tensor

3、我们要怎么运行tensorflow?

tensorflow的运行流程主要有2步,分别是构建模型和运行模型。

3.1、构建模型
  • 在构建模型阶段,我们需要通过代码构建一个图来描述我们的模型。所谓图,可以理解为流程图,就是将数据的输入节点->中间处理节点->输出节点整个流程用代码表示出来。并为每个节点命名,以便我们可以通过名字来访问这些节点。
  • 例如,要构建下图中的模型,那表达式就是

Y=W*X+b ————W为权重矩阵,b为偏差
C=ReLU(Y) ————激活函数ReLU:yi=max(0,yi),即矩阵Y中负数全替换为0

计算流程图Graph
  • 构建模型的代码如下:
import tensorflow as tf
import numpy as np

# 计算图,不加这一行也会提供一个默认图
myGraph = tf.get_default_graph()

# 多个tensor数据节点
X = tf.placeholder(name="input", shape=[2, 1], dtype=tf.int32)
W = tf.get_variable(name="weight", shape=[2, 2], dtype=tf.int32,
               initializer=tf.constant_initializer([[-1, 1], [-1, -1]]))
b = tf.get_variable(name="bias", shape=[2, 1], dtype=tf.int32,
               initializer=tf.constant_initializer([1, 1]))

# 多个operation操作节点
Y = tf.matmul(W, X) + b
C = tf.nn.relu(Y)

上面的模型Y=W*X+b 就是构成神经网络的基础——神经元。函数f(⋅)也被称为是神经元的激活函数。一定是带有激活函数的才是一个神经元。
神经元

上面的一层神经网络模型
一层神经网络
  • 一般构建两层就可以认为是一个神经网络,更多层就可以认为是深度神经网络也就是深度学习。

——两层神经网络,隐藏层就是指除输入层和输出层外的所有中间层,中间层的数据一般是不用关心的,所以叫隐藏层(或隐含层,类似黑盒子)。一般输入层数据X都认为是一个神经元,而x1,x2,x3,xn这些只是一个输入X的不同维度的数据,或者不当做神经元。中间隐含层的每层多个圆表示多个神经元。
两层神经网络图.jpg

——普通的多层神经网络又叫多层感知机
多层感知机.jpg

——卷积神经网络,某些神经元的输入信息只和部分前一层输出神经元有关。
卷积神经网络图.jpg

——循环神经网络,某些神经元的输入信息,不仅包括前一层的输出,还包括它自身先前状态。也就是引入了时间上的循环,有记忆功能。
循环神经网络.jpg
3.2运行模型
  • 模型也可以理解为模板,是抽象的。只能在给这个模板输入不同的X,得到不同的Y和C时,才能称为一次模板的实现。为了区分不同的模板实现,tensorflow引入了session来控制。
  • session即会话的意思,常用在网络通信协议中表示一个会话控制对象,session 对象存储特定用户会话所需的属性及配置等信息。
  • 如果不使用session,直接打印tensor只能看到对象信息,看不到具体的数据,如下代码打印结果:
    未使用session
  • 在session内run运行这些tensor节点才能看到具体的数据,而且所有的operation操作节点也必须在session内run才能执行。
import tensorflow as tf
import numpy as np

# 计算图,不加这一行也会提供一个默认图
myGraph = tf.get_default_graph()

# 多个tensor
hello = tf.constant("hello world !")
X = tf.placeholder(name="input", shape=[2, 1], dtype=tf.int32)
W = tf.get_variable(name="weight", shape=[2, 2], dtype=tf.int32,
                  initializer=tf.constant_initializer([[-1, 1], [-1, -1]]))
b = tf.get_variable(name="bias", shape=[2, 1], dtype=tf.int32,
                  initializer=tf.constant_initializer([1, 1]))

# 操作operation
Y = tf.matmul(W, X) + b
C = tf.nn.relu(Y)

print("打印tensor:")
print(hello)
print(X)
print(W)

# 开始运行计算图
sess = tf.Session()
# 必须先初始化所有变量,并分配内存
sess.run(tf.global_variables_initializer())
print(sess.run(hello))
print("W=", sess.run(W))
# 注意,用tensorflow产生的tensor只是一个类实例对象,
# 必须在执行run之后才能变成实际的矩阵
# x_matrix = tf.ones(shape=[2, 1], dtype=tf.int32)
x_matrix = np.reshape([1, 1], (2, 1))
print("X=\n",x_matrix)
print("b=\n", sess.run(b))
# 给定输入值
x_input = myGraph.get_tensor_by_name("input:0")
print("Y=W*X+b=\n", sess.run(Y, feed_dict={x_input: x_matrix}))
print("C=ReLU(Y)=\n", sess.run(C, feed_dict={X: x_matrix}))

sess.close()
  • 输出结果如下:
    使用session
矩阵运算

4、怎么用tensorflow来做一个机器学习模型?

主要分为以下四个步骤:
  • 前向传播:模型训练,得到输出结果与实际结果的误差(损失)值loss

1、构建模型
2、设计损失函数loss

  • 反向传播:目的是通过优化函数,如梯度下降法去反向调整模型的变量——权重矩阵W和偏置b,使得loss函数取得最小值

设计优化函数

  • 训练模型:用更新的W和b再次进行训练,得到新的loss。设计循环重复进行训练,希望得到满意的loss,当然也可能模型设计的有问题得不到loss最小值。
  • 保存和使用模型:也就是保存变量W和b的值。在用于预测时加载这个模型,就可以得到分类结果。
代码如下:
import tensorflow as tf
import numpy as np

# 计算图,不加这一行也会提供一个默认图
myGraph = tf.get_default_graph()

# 训练得到的模型保存的地址
model_path = "D:/src/ML_DL/models/model.ckpt"

# 多个tensor
hello = tf.constant("hello world !")
X = tf.placeholder(name="input", shape=[2, 1], dtype=tf.float32)
W = tf.get_variable(name="weight", shape=[2, 2], dtype=tf.float32,
                initializer=tf.constant_initializer([[1, 1], [1, 1]]))
b = tf.get_variable(name="bias", shape=[2, 1], dtype=tf.float32,
                initializer=tf.constant_initializer([0, 0]))
target = tf.placeholder(name="lables", shape=[2, 1], dtype=tf.float32)


# 1、构建模型
Y = tf.matmul(W, X) + b
# 2、损失函数,简单设计为均方误差的求和
err = 0.5*(Y - target)**2
loss = tf.reduce_sum(err)
# 3、优化函数,梯度下降法去求使得loss函数有最小值的最优的W和b
# 参数0.1是学习率,可以控制每次下降的速度
back_transfer = tf.train.GradientDescentOptimizer(0.1).minimize(loss)

# 提供输入值x和对应的目标值
x_matrix = np.reshape([0.9, 1.1], (2, 1))
target_matrix = np.reshape([1, 1], (2, 1))
accuracy = (1-loss)*100.0
# 查看系统自动分配的tensor名字,如果自己不设定name的话
print(Y)

# 开始运行计算图
sess = tf.Session()
# 必须先初始化所有变量,并分配内存
sess.run(tf.global_variables_initializer())
print(sess.run(hello))
for i in range(20):
    print("=======第%d次训练====================" % (i+1))
    print("W=\n", sess.run(W))
    print("X=\n", x_matrix)
    print("b=\n", sess.run(b))
    x_input = myGraph.get_tensor_by_name("input:0")
    print("Y=W*X+b=\n", sess.run(Y, feed_dict={x_input: x_matrix}))
    print("target=\n", target_matrix)
    print("err = 0.5*(Y - target)**2=\n", sess.run(err, 
                    feed_dict={X: x_matrix, target: target_matrix}))
    print("loss=\n", sess.run(loss, 
                    feed_dict={X: x_matrix, target: target_matrix}))
    acc = sess.run(accuracy, 
                    feed_dict={X: x_matrix, target: target_matrix})
    print("预测准确度= %", acc)
    # 可以在适当的时候保存模型,并结束训练
    if acc > 99.5:
        saver = tf.train.Saver()
        saver.save(sess, model_path)
        break

    # 执行反向传递,根据梯度下降法来更新变量——权重W和偏差b
    sess.run(back_transfer, feed_dict={X: x_matrix, target: target_matrix})

sess.close()

程序运行结果:

Tensor("add:0", shape=(2, 1), dtype=float32)
b'hello world !'
=======第1次训练====================
W=
 [[1. 1.]
 [1. 1.]]
X=
 [[0.9]
 [1.1]]
b=
 [[0.]
 [0.]]
Y=W*X+b=
 [[2.]
 [2.]]
target=
 [[1]
 [1]]
err = 0.5*(Y - target)**2=
 [[0.5]
 [0.5]]
loss=
 1.0
预测准确度= % 0.0
=======第2次训练====================
W=
 [[0.91 0.89]
 [0.91 0.89]]
X=
 [[0.9]
 [1.1]]
b=
 [[-0.1]
 [-0.1]]
Y=W*X+b=
 [[1.6980001]
 [1.6980001]]
target=
 [[1]
 [1]]
err = 0.5*(Y - target)**2=
 [[0.24360205]
 [0.24360205]]
loss=
 0.4872041
预测准确度= % 51.279594
=======第3次训练====================
W=
 [[0.84718    0.81321996]
 [0.84718    0.81321996]]
X=
 [[0.9]
 [1.1]]
b=
 [[-0.16980001]
 [-0.16980001]]
Y=W*X+b=
 [[1.4872038]
 [1.4872038]]
target=
 [[1]
 [1]]
err = 0.5*(Y - target)**2=
 [[0.11868379]
 [0.11868379]]
loss=
 0.23736759
预测准确度= % 76.263245
=======第4次训练====================
W=
 [[0.8033317 0.7596275]
 [0.8033317 0.7596275]]
X=
 [[0.9]
 [1.1]]
b=
 [[-0.2185204]
 [-0.2185204]]
Y=W*X+b=
 [[1.3400683]
 [1.3400683]]
target=
 [[1]
 [1]]
err = 0.5*(Y - target)**2=
 [[0.05782324]
 [0.05782324]]
loss=
 0.115646474
预测准确度= % 88.43535
=======第5次训练====================
W=
 [[0.7727255 0.72222  ]
 [0.7727255 0.72222  ]]
X=
 [[0.9]
 [1.1]]
b=
 [[-0.25252724]
 [-0.25252724]]
Y=W*X+b=
 [[1.2373676]
 [1.2373676]]
target=
 [[1]
 [1]]
err = 0.5*(Y - target)**2=
 [[0.0281717]
 [0.0281717]]
loss=
 0.05634339
预测准确度= % 94.36566
=======第6次训练====================
W=
 [[0.75136244 0.69610953]
 [0.75136244 0.69610953]]
X=
 [[0.9]
 [1.1]]
b=
 [[-0.276264]
 [-0.276264]]
Y=W*X+b=
 [[1.1656828]
 [1.1656828]]
target=
 [[1]
 [1]]
err = 0.5*(Y - target)**2=
 [[0.01372539]
 [0.01372539]]
loss=
 0.027450787
预测准确度= % 97.25492
=======第7次训练====================
W=
 [[0.73645097 0.6778844 ]
 [0.73645097 0.6778844 ]]
X=
 [[0.9]
 [1.1]]
b=
 [[-0.2928323]
 [-0.2928323]]
Y=W*X+b=
 [[1.1156465]
 [1.1156465]]
target=
 [[1]
 [1]]
err = 0.5*(Y - target)**2=
 [[0.00668705]
 [0.00668705]]
loss=
 0.013374109
预测准确度= % 98.66259
=======第8次训练====================
W=
 [[0.7260428 0.6651633]
 [0.7260428 0.6651633]]
X=
 [[0.9]
 [1.1]]
b=
 [[-0.30439693]
 [-0.30439693]]
Y=W*X+b=
 [[1.0807211]
 [1.0807211]]
target=
 [[1]
 [1]]
err = 0.5*(Y - target)**2=
 [[0.00325795]
 [0.00325795]]
loss=
 0.0065159025
预测准确度= % 99.34841
=======第9次训练====================
W=
 [[0.7187779 0.656284 ]
 [0.7187779 0.656284 ]]
X=
 [[0.9]
 [1.1]]
b=
 [[-0.31246904]
 [-0.31246904]]
Y=W*X+b=
 [[1.0563436]
 [1.0563436]]
target=
 [[1]
 [1]]
err = 0.5*(Y - target)**2=
 [[0.0015873]
 [0.0015873]]
loss=
 0.0031745962
预测准确度= % 99.68254

Process finished with exit code 0
反向传播,梯度下降法优化函数推导过程
反向传播数学推导1
反向传播数学推导2

上图中η为学习率,控制每次下降的速度

第9次训练就结束了

保存的模型

5、使用训练好的模型做预测

使用保存好的模型
代码如下:
import tensorflow as tf
import numpy as np

# 测试刚才保存的模型的变量是不是我们最后训练得到的
sess = tf.Session()
saver = tf.train.import_meta_graph("D:/src/ML_DL/models/model.ckpt.meta")
saver.restore(sess, tf.train.latest_checkpoint("D:/src/ML_DL/models/"))
graph2 = tf.get_default_graph()
weight = graph2.get_tensor_by_name("weight:0")
bias = graph2.get_tensor_by_name("bias:0")
print("weight=\n", sess.run(weight))
print("bias=\n", sess.run(bias))
# 输入相同的X值,查看输出Y是否与之前的一样
input_x = graph2.get_tensor_by_name("input:0")
x_value = np.reshape([0.9, 1.1], (2, 1))
output_y = graph2.get_tensor_by_name("add:0")
print("Y=\n", sess.run(output_y, feed_dict={input_x: x_value}))
sess.close()

更详细的总结博客:https://blog.csdn.net/ztf312/article/details/72722184

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

推荐阅读更多精彩内容