《深度学习之TensorFlow入门、原理与进阶实战》—3.1.3 迭代训练模型
3.1.3 迭代训练模型
迭代训练的代码分成两步来完成:
1.训练模型
建立好模型后,可以通过迭代来训练模型了。TensorFlow中的任务是通过session来进行的。
下面的代码中,先进行全局初始化,然后设置训练迭代的次数,启动session开始运行任务。
代码3-1 线性回归(续)
24 #初始化所有变量
25 init = tf.global_variables_initializer()
26 #定义参数
27 training_epochs = 20
28 display_step = 2
29
30 #启动session
31 with tf.Session() as sess:
32 sess.run(init)
33 plotdata={"batchsize":[],"loss":[]} #存放批次值和损失值
34 #向模型输入数据
35 for epoch in range(training_epochs):
36 for (x, y) in zip(train_X, train_Y):
37 sess.run(optimizer, feed_dict={X: x, Y: y})
38
39 #显示训练中的详细信息
40 if epoch % display_step == 0:
41 loss = sess.run(cost,feed_dict={X:train_X,Y:train_Y})
42 print ("Epoch:", epoch+1,"cost=", loss,"W=",sess.run(W),
"b=", sess.run(b))
43 if not (loss == "NA" ):
44 plotdata["batchsize"].append(epoch)
45 plotdata["loss"].append(loss)
46
47 print (" Finished!")
48 print ("cost=", sess.run(cost, feed_dict={X: train_X, Y: train_Y}),
"W=", sess.run(W), "b=", sess.run(b))
上面的代码中迭代次数设置为20次,通过sess.run来进行网络节点的运算,通过feed机制将真实数据灌到占位符对应的位置(feed_dict={X: x, Y: y}),同时,每执行一次都会将网络结构中的节点打印出来。
运行代码,输出信息如下:
Epoch: 1 cost= 0.714926 W= [ 0.71911603] b= [ 0.40933588]
Epoch: 3 cost= 0.114213 W= [ 1.63318455] b= [ 0.17000227]
Epoch: 5 cost= 0.0661118 W= [ 1.88165665] b= [ 0.0765276]
Epoch: 7 cost= 0.0633376 W= [ 1.94610846] b= [ 0.05182607]
Epoch: 9 cost= 0.0632785 W= [ 1.96277654] b= [ 0.0454303]
Epoch: 11 cost= 0.0633072 W= [ 1.96708632] b= [ 0.04377643]
Epoch: 13 cost= 0.0633176 W= [ 1.96820116] b= [ 0.04334867]
Epoch: 15 cost= 0.0633205 W= [ 1.96848941] b= [ 0.04323809]
Epoch: 17 cost= 0.0633212 W= [ 1.9685632] b= [ 0.04320973]
Epoch: 19 cost= 0.0633214 W= [ 1.96858287] b= [ 0.04320224]
Finished!
cost= 0.0633215 W= [ 1.96858633] b= [ 0.04320095]
可以看出,cost的值在不断地变小,w和b的值也在不断地调整。
2.训练模型可视化
上面的数值信息理解起来还是比较抽象。为了可以得到更直观的表达,下面将模型中的两个信息可视化出来,一个是生成的模型,另一个是训练中的状态值。具体代码如下:
代码3-1 线性回归(续)
49 #图形显示
50 plt.plot(train_X, train_Y, 'ro', label='Original data')
51 plt.plot(train_X, sess.run(W) * train_X + sess.run(b), label
='Fittedline')
52 plt.legend()
53 plt.show()
54
55 plotdata["avgloss"] = moving_average(plotdata["loss"])
56 plt.figure(1)
57 plt.subplot(211)
58 plt.plot(plotdata["batchsize"], plotdata["avgloss"], 'b--')
59 plt.xlabel('Minibatch number')
60 plt.ylabel('Loss')
61 plt.title('Minibatch run vs. Training loss')
62
63 plt.show()
这段代码中引入了一个变量和一个函数,可以在代码的最顶端定义它们,见如下代码:
plotdata = { "batchsize":[], "loss":[] }
def moving_average(a, w=10):
if len(a) < w:
return a[:]
return [val if idx < w else sum(a[(idx-w):idx])/w for idx, val in
enumerate(a)]
现在所有的代码都准备好了,运行程序,生成如图3-3和图3-4所示两幅图。
图3-3中所示的斜线,是模型中的参数w和b为常量所组成的关于x与y的直线方程。可以看到是一条几乎y=2x的直线(W=1.96858633接近于2,b=0.04320095接近于0)。
在图3-4中可以看到刚开始损失值一直在下降,直到6次左右趋近平稳。
图3-3 可视化模型 图3-4 可视化训练loss
- 点赞
- 收藏
- 关注作者
评论(0)