初学深度学习(一)TensorFlow基本开发步骤之总结篇

通过博客:初学深度学习(一)TensorFlow基本开发步骤之准备数据and搭建模型(正向+反向)初学深度学习(一)TensorFlow基本开发步骤之迭代训练and使用模型
的介绍。

现在可以将tensorflow开发的基本步骤总结如下:

  • 定义tensorflow输入节点
  • 定义“学习参数”变量
  • 定义“运算”
  • 优化函数,优化目标
  • 初始化所有变量
  • 迭代更新参数到最优解
  • 测试模型
  • 使用模型

1、定义tensorflow输入节点的方法

tensorflow中有如下几种定义输入节点的方法:

  • 通过占位符来定义:通常使用此方式
  • 通过字典类型定义:一般用于输入比较多的情况、
  • 直接定义:很少使用、

(1)通过占位符来定义输入节点的实例

在博客:初学深度学习(一)TensorFlow基本开发步骤之准备数据and搭建模型(正向+反向)中就是通过占位符来定义输入节点的:

# X,Y为占位符
X = tf.placeholder("float") # 代表x的输入
Y = tf.placeholder("float") # 代表对应的真实值y

完整代码:

在这里插入代码片

(2)通过字典类型来定义输入节点的实例

通过字典类型来定义输入节点的方式和占位符比较像,只不过是堆积到了一起。

#占位符
inputdict = {
    
    
    'x':tf.placeholder("float"),
    'y':tf.placeholder("float")
}

(3)直接定义输入节点的实例

直接定义就是将定义好的python变量直接放到OP节点中参与输入的运算,将模拟数据的变量直接放到模型中进行训练。

2、定义“学习参数”的变量

“学习参数”的定义与输入的定义很像,分为直接定义通过字典类型定义两部分。
由于深度神经网络例的参数很多,所以一般使用第二种更多。

(1)直接定义“学习参数”

# 模型参数
W = tf.Variable(tf.random_normal([1]), name="weight") # w初始化为[-1,1]的随机数,形状为一维的数字
b = tf.Variable(tf.zeros([1]), name="bias") # b的初始化是0,形状为一维的数字
# 通过tf.Variable()函数对参数直接定义

(2)通过字典类型定义“学习参数”

# 模型参数
paradict = {
    
    
    'W':tf.Variable(tf.random_normal([1])) # w初始化为[-1,1]的随机数,形状为一维的数字
    'b':tf.Variable(tf.zeros([1])) # b的初始化是0,形状为一维的数字
}

3、定义“运算”

定义“运算”的过程是建立模型的核心过程,直接决定了模型的拟合效果

(1)定义正向传播模型

# 创建正向模型
# X,Y为占位符
X = tf.placeholder("float") # 代表x的输入
Y = tf.placeholder("float") # 代表对应的真实值y

# 模型参数
W = tf.Variable(tf.random_normal([1]), name="weight") # w初始化为[-1,1]的随机数,形状为一维的数字
b = tf.Variable(tf.zeros([1]), name="bias") # b的初始化是0,形状为一维的数字

# 前向结构
z = tf.multiply(X, W)+ b # x*w+b

如上所示(博客:初学深度学习(一)TensorFlow基本开发步骤之准备数据and搭建模型(正向+反向))使用的网络结构很简单,只有一个神经元。
后面会学到更多的更复杂的网络如:多层神经网络、卷积神经网络、循环神经网络等,它们都是由神经元以不同的组合方式组成的网络结构。

(2)定义损失函数

损失函数主要用来计算“输出值”与“真实值”之间的误差,是配合反向传播使用的。
为了在反向传播中可以找到最小值(对应最优解),要求函数必须是可导的。

4、优化函数,优化目标

有了正向结构和损失函数后,就是通过优化函数来优化学习参数了,这个过程也是在反向传播中完成的。

PS:

反向传播过程:就是沿着正向传播的结构向相反的方向将误差传递过去。

5、初始化所有变量

只有一行代码,但是是一个很关键的环节。
在session创建好了之后,第一件事就是需要初始化。
如在博客:初学深度学习(一)TensorFlow基本开发步骤之迭代训练and使用模型中:

# 初始化变量
init = tf.global_variables_initializer() # global_variables_initializer()函数初始化所有变量

注意:

使用tf.global_variables_initializer()函数初始化所有变量,必须在所有变量和OP定义完成后。这样才能保证定义的内容有效,否则,初始化之后定义的变量和OP都无法使用session中的run来进行算值。

6、迭代更新参数到最优解

在迭代训练的过程中,都需要建立一个session来完成。通常是使用with语法,可以在session结束后自行关闭。

如在博客:初学深度学习(一)TensorFlow基本开发步骤之迭代训练and使用模型中:

with tf.Session() as sess:
    sess.run(init) # 通过sess.进行网络节点的运算
    plotdata = {
    
    "batchsize":[],"loss":[]} # 存放批次值和损失值

在session中通过run来运行模型中的节点,在迭代训练的过程也是如此,只是run里面放的是优化操作的OP,同时需要在外层加上循环次数

如在博客:初学深度学习(一)TensorFlow基本开发步骤之迭代训练and使用模型中:

    # 向模型输入数据
    for epoch in range(training_epochs):
        for (x, y) in zip(train_X, train_Y):
            sess.run(optimizer, feed_dict={
    
    X: x, Y: y}) # 通过feed机制将真实数据灌到占位符(第二步创建模型时)对应的位置

真正的使用过程中会引入一个叫做MINIBATCH概念进行迭代训练,就是每次取一定量的数据同时放到网络里进行训练。

7、测试模型

测试模型并非神经网络的核心环节,即通过计算模型的正确率或错误率来描述模型的好坏。

如在博客:初学深度学习(一)TensorFlow基本开发步骤之迭代训练and使用模型中:

    print ("cost=", sess.run(cost, feed_dict={
    
    X: train_X, Y: train_Y}), "W=", sess.run(W), "b=", sess.run(b))

8、使用模型

使用模型与测试模型相似,就是将损失值节点换为输出节点即可。

如在博客:初学深度学习(一)TensorFlow基本开发步骤之迭代训练and使用模型中:

print ("x=0.2,z=", sess.run(z, feed_dict={
    
    X: 0.2}))

猜你喜欢

转载自blog.csdn.net/qq_45154565/article/details/109854289