通过博客:初学深度学习(一)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}))