美文网首页我爱编程
tensorflow从入门到搭建学习模型

tensorflow从入门到搭建学习模型

作者: XDgbh | 来源:发表于2018-05-22 20:51 被阅读32次

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

相关文章

网友评论

    本文标题:tensorflow从入门到搭建学习模型

    本文链接:https://www.haomeiwen.com/subject/kqrcjftx.html