《深度学习之TensorFlow入门、原理与进阶实战》—3.1.3 迭代训练模型

举报
华章计算机 发表于 2019/05/31 13:50:23 2019/05/31
【摘要】 本书摘自《深度学习之TensorFlow入门、原理与进阶实战》一书中的第3章,第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次左右趋近平稳。

image.png

图3-3  可视化模型 图3-4  可视化训练loss


【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。