接触机器学习也有相当长的时间了,对各种学习算法都有了一定的了解,一直都不愿意写博客(借口是没时间啊),最近准备学习深度学习框架tensorflow,决定还是应该把自己的学习一步一步的记下来,方便后期的规划。当然,学习一个新东西,第一步就是搭建一个平台,这个网上很多相关博客,不过,还是会遇到很多坑的,坑咋们不怕,趟过就好了。下面就以一个逻辑回归拟合二维数据为例来入门介绍吧。(参考书:深度学习之Tensorflow入门原理与进阶实践)

  学习都是有一定套路的,深度学习一般情况下:准备数据、搭建模型、迭代训练及使用模型。当然,Tensorflow开发也是有套路的:

      (1)定义Tensorflow输入节点

      (2)定义“学习参数”等变量

      (3)定义“运算”(定义正向传播模型 、定义损失函数)

      (4)优化函数、优化目标(反向传播)

      (5)初始化所有变量

      (6)迭代更新参数直至最优解

      (7)测试模型

      (8)使用模型

  在tensorflow中,将中间节点及节点间的运算关系(OPS)定义在内部的一个“图”上,全通过一个“会话(session)”进行图中OPS的具体运算。“图”是静态的,无论做任何运算,它们只是将关系搭建在一起,并不会做任何运算;而“会话”是动态的,只有启动会话后才会将数据流向图中,并按照图中的关系进行运算,并将最终的结果从图中流出。构建一个完整的图一般需要定义3种变量:输入结点(网络的入口)、学习参数(连接各个节点的路径)、模型中的节点。在实际训练中,通过动态的会话将图中的各个节点按照静态的规则运算起来,每一次的迭代都会对图中的学习参数进行更新调整,通过一定次数的迭代运算之后,最终所形成的图便是所需要的“模型”。而在会话中,任何一个节点都可以通过会话的run函数进行计算,得到该节点的真实数据。

  模型内部的数据有正向和反向:正向,是数据从输入开始,依次进行个节点定义的运算,一直运算到输出,是模型最基本的数据流向,在模型的训练、测试、使用的场景中都会用到的。反向,只有在训练场景下才会用到,反项链式求导的方法,即先从正向的最后一个节点开始,计算此时结果值与真实值的误差,形成一个关于学习参数表示误差的方程,然后,对方程中的每个参数求导,得到其梯度修正值,同时反向推出上一层的误差,这样就将该层节点的误差按照正向的相反方向传到上一层,并接着计算上一层的修正值,如此反复下去进行传播,直到传到正向的第一个节点。

  1、准备数据  

    这里采用y=2x直线为主体,加入一些干扰噪声     

  1. """准备数据"""
  2. train_X= np.linspace(-1,1,100)
  3. train_Y= 2*train_X + np.random.randn(*train_X.shape)*0.3
  4. plt.plot(train_X,train_Y,'ro',label="Original Data")
  5. plt.legend()
  6. plt.show()

                        

  2、搭建模型

    模型的搭建分两个方向:正向与反向

    (1)正向搭建模型

      神经网络大多是由多个神经元组成的,此处为了简单,采用单个神经元的网络模型。

      

      计算公式为:z=w*xT + b (其中,w是矩阵,xT是矩阵x的转置)w={w1,w2,...wi} xT={x1,x2.....xi}   i=1,2,....n  z表示输出结果,x为输入数据,w为权重,b为偏执值。

      模型每次的"学习"过程本质上就是调整w,b的值,以获得更适合的值。

  1. """建立模型"""
  2.  
  3. #占位符
  4. X=tf.placeholder("float")
  5. Y=tf.placeholder("float")
  6. #模型参数
  7. W=tf.Variable(tf.random_normal([1]),name="weight")
  8. b=tf.Variable(tf.zeros([1]),name="bias")
  9. #前向
  10. z=tf.multiply(X,W)+b

    (2)反向搭建模型

      在神经网络的训练过程中数据流向是有两个方向的,即先通过正向生成一个值,然后对比其与实际值的差距,再通过反向过程将里面的参数进行调整,接着再次正向生成预测值并与真实值进行对比,这样循环下去,直到将参数调整到合适值为止。

  1. #生成值与真实值的平方差
  2. cost= tf.reduce_mean(tf.square(Y-z))
  3. #学习率
  4. learning_rate= 0.01
  5. #梯度下降
  6. optimizer= tf.train.GradientDescentOptimizer(learning_rate).minimize(cost)

    学习率代表调整参数的速度,这个值越大,表明调整的速度越大,相应的精确度越低,值越小,表明调整的精度越高,但学习速度越慢。GradientDescentOptimizer函数是一个封装好的梯度下降算法。

  3、迭代训练模型

    在tensorflow中,任务是通过Session来进行的,通过sess.run()来进行网络节点的运算,通过feed机制将真实数据加载到占位符对应的位置。

  1. """训练模型"""
  2. init= tf.global_variables_initializer()
  3. training_epochs=20
  4. display_step=2
  5.  
  6. with tf.Session() as sess:
  7. sess.run(init)
  8. plotdata={"batchsize":[], "loss":[]}
  9.  
  10. def moving_average(a, w=10):
  11. if len(a)<w:
  12. return a[:]
  13. return [val if idx <w else sum(a[(idx-w):idx])/w for idx, val in enumerate(a)]
  14.  
  15. for epoch in range(training_epochs):
  16. for (x,y) in zip(train_X, train_Y):
  17. sess.run(optimizer, feed_dict={X: x, Y:y })
  18.  
  19. if epoch % display_step == 0:
  20. loss = sess.run(cost, feed_dict={ X: train_X, Y: train_Y })
  21. print ("Epoch:", epoch+1, " cost=", loss, "W=", sess.run(W), " b=",sess.run(b))
  22. if not (loss == "NA"):
  23. plotdata["batchsize"].append(epoch)
  24. plotdata["loss"].append(loss)
  25.  
  26. print( "Finished.")
  27. print( "cost=", sess.run(cost, feed_dict={ X:train_X, Y:train_Y }), "W=", sess.run(W), "b=", sess.run(b))
  28.  
  29. """训练模型可视化"""
  30. plt.plot(train_X, train_Y, "ro", label="Original Data")
  31. plt.plot(train_X, sess.run(W)*train_X +sess.run(b), label="FittedLine")
  32. plt.legend()
  33. plt.show()
  34.  
  35. plotdata["avgloss"]= moving_average(plotdata["loss"])
  36. plt.figure(1)
  37. plt.subplot(211)
  38. plt.plot(plotdata["batchsize"], plotdata["avgloss"], "b--")
  39. plt.xlabel("Minibatch number")
  40. plt.ylabel("Loss")
  41. plt.title("Minibatch run vs.Training loss")
  42.  
  43. plt.show()

结果:

Epoch: 1 cost= 0.9754149 W= [0.58673507] b= [0.4007497]
Epoch: 3 cost= 0.15794739 W= [1.648151] b= [0.11324686]
Epoch: 5 cost= 0.09357372 W= [1.9356339] b= [0.00494289]
Epoch: 7 cost= 0.08987887 W= [2.0101867] b= [-0.02363242]
Epoch: 9 cost= 0.08980431 W= [2.029468] b= [-0.03103093]
Epoch: 11 cost= 0.089843966 W= [2.0344524] b= [-0.03294369]
Epoch: 13 cost= 0.08985817 W= [2.0357416] b= [-0.03343845]
Epoch: 15 cost= 0.08986214 W= [2.0360765] b= [-0.03356693]
Epoch: 17 cost= 0.08986315 W= [2.0361621] b= [-0.03359992]
Epoch: 19 cost= 0.08986344 W= [2.0361862] b= [-0.03360903]
Finished.
cost= 0.0898635 W= [2.0361903] b= [-0.03361049]

         

   可以清楚看到,cost的值在不断变小,w和b的值也在不断地调整。最后,趋于得到一条回归直线。

  4、使用模型

    模型训练郝红阳,使用起来就简单了

    如:print("x=2,z=",sess.run(z, feed_dict={X:2 }))即可。

  tensorflow中定义输入节点的方法:

      (1)、通过占位符定义(一般情况下使用)如:

          X=tf.placeholder("float")

          Y=tf.placeholder("float")

      (2)、通过字典类型定义(一般用于输入比较多的情况下)如:

        inputdict = {

              'x' : tf.placeholder("float),

              'y' : tf.placeholder("float")

             }

      (3)直接定义*(一般很少用):将定义好的变量直接放到OP节点中参与输入运算进行训练。

  完整代码: 

  1. # -*- coding: utf-8 -*-
  2. """
  3. Spyder Editor
  4.  
  5. @Author:wustczx
  6. """
  7.  
  8. import tensorflow as tf
  9. import numpy as np
  10. import matplotlib.pyplot as plt
  11.  
  12. """准备数据"""
  13. train_X= np.linspace(-1,1,100)
  14. train_Y= 2*train_X + np.random.randn(*train_X.shape)*0.3
  15. plt.plot(train_X,train_Y,'ro',label="Original Data")
  16. plt.legend()
  17. plt.show()
  18.  
  19. """建立模型"""
  20. X=tf.placeholder("float")
  21. Y=tf.placeholder("float")
  22.  
  23. W=tf.Variable(tf.random_normal([1]),name="weight")
  24. b=tf.Variable(tf.zeros([1]),name="bias")
  25.  
  26. z=tf.multiply(X,W)+b
  27.  
  28. #生成值与真实值的平方差
  29. cost= tf.reduce_mean(tf.square(Y-z))
  30. #学习率
  31. learning_rate= 0.01
  32. #梯度下降
  33. optimizer= tf.train.GradientDescentOptimizer(learning_rate).minimize(cost)
  34.  
  35. """训练模型"""
  36. init= tf.global_variables_initializer()
  37. training_epochs=20
  38. display_step=2
  39.  
  40. with tf.Session() as sess:
  41. sess.run(init)
  42. plotdata={"batchsize":[], "loss":[]}
  43.  
  44. def moving_average(a, w=10):
  45. if len(a)<w:
  46. return a[:]
  47. return [val if idx <w else sum(a[(idx-w):idx])/w for idx, val in enumerate(a)]
  48.  
  49. for epoch in range(training_epochs):
  50. for (x,y) in zip(train_X, train_Y):
  51. sess.run(optimizer, feed_dict={X: x, Y:y })
  52.  
  53. if epoch % display_step == 0:
  54. loss = sess.run(cost, feed_dict={ X: train_X, Y: train_Y })
  55. print ("Epoch:", epoch+1, " cost=", loss, "W=", sess.run(W), " b=",sess.run(b))
  56. if not (loss == "NA"):
  57. plotdata["batchsize"].append(epoch)
  58. plotdata["loss"].append(loss)
  59.  
  60. print( "Finished.")
  61. print( "cost=", sess.run(cost, feed_dict={ X:train_X, Y:train_Y }), "W=", sess.run(W), "b=", sess.run(b))
  62.  
  63. """训练模型可视化"""
  64. plt.plot(train_X, train_Y, "ro", label="Original Data")
  65. plt.plot(train_X, sess.run(W)*train_X +sess.run(b), label="FittedLine")
  66. plt.legend()
  67. plt.show()
  68.  
  69. plotdata["avgloss"]= moving_average(plotdata["loss"])
  70. plt.figure(1)
  71. plt.subplot(211)
  72. plt.plot(plotdata["batchsize"], plotdata["avgloss"], "b--")
  73. plt.xlabel("Minibatch number")
  74. plt.ylabel("Loss")
  75. plt.title("Minibatch run vs.Training loss")
  76.  
  77. plt.show()

tensorflow白话篇的更多相关文章

  1. tensorflow进阶篇-5(反向传播2)

    上面是一个简单的回归算法,下面是一个简单的二分值分类算法.从两个正态分布(N(-1,1)和N(3,1))生成100个数.所有从正态分布N(-1,1)生成的数据目标0:从正态分布N(3,1)生成的数据标 ...

  2. tensorflow进阶篇-5(反向传播1)

    这里将讲解tensorflow是如何通过计算图来更新变量和最小化损失函数来反向传播误差的:这步将通过声明优化函数来实现.一旦声明好优化函数,tensorflow将通过它在所有的计算图中解决反向传播的项 ...

  3. 机器学习 - pycharm, tensorflow集成篇

    继续上篇的pyspark集成后,我们再来看看当今热的不得了的tensorflow是如何继承进pycharm环境的 参考: http://blog.csdn.net/include1224/articl ...

  4. tensorflow第一篇---numpy模块

    写在前面: 自学tensorflow半个月,博友们给了我很多帮助,这是我第一篇原创的博文,我想把之前的知识梳理一遍,我会分享我一些在学习过程中遇到的问题,我目前只有这些......... 在介绍ten ...

  5. 机器学习 - 开发环境安装pycharm + tensorflow集成篇

    继续上篇的pyspark集成后,我们再来看看当今热的不得了的tensorflow是如何继承进pycharm环境的 参考: http://blog.csdn.net/include1224/articl ...

  6. tensorflow安装篇

    安装虚拟机redhat7u4-64 镜像文件在http://www.linuxfly.org/post/659 更换yum 参考https://blog.csdn.net/xiaoyiaoyou/ar ...

  7. tensorflow进阶篇-4(损失函数2)

    Hinge损失函数主要用来评估支持向量机算法,但有时也用来评估神经网络算法.下面的示例中是计算两个目标类(-1,1)之间的损失.下面的代码中,使用目标值1,所以预测值离1越近,损失函数值越小: # U ...

  8. tensorflow进阶篇-4(损失函数1)

    L2正则损失函数(即欧拉损失函数),L2正则损失函数是预测值与目标函数差值的平方和.L2正则损失函数是非常有用的损失函数,因为它在目标值附近有更好的曲度,并且离目标越近收敛越慢: # L = (pre ...

  9. tensorflow基础篇-2

    #-*- coding:utf-8 -*- import tensorflow as tf sess=tf.Session() #整流水线单元relu print sess.run(tf.nn.rel ...

随机推荐

  1. ESP8266内置的定时器库--Ticker库

    Ticker的功能非常简单,就是规定时间后调用函数 总体上,根据功能可以把方法分为两大类: 定时器管理方法: 定时器启用方法: detach()     停止定时器 active()    定时器是否 ...

  2. JAVA笔记27-正则表达式(RegularExpressions)

    正则表达式是字符串的处理利器. 用途:字符串匹配(字符匹配).字符串查找.字符串替换 例如:IP地址是否正确.从网页中揪出email地址(如垃圾邮件).从网页中揪出链接等 涉及到的类:java.lan ...

  3. 集合比较器报错java.lang.IllegalArgumentException: Comparison method violates its general contract!

    Collections.sort(listMonthlyUsage, new Comparator<MonthlyUsageDto>() { //按照元素从小到大排序 @Override ...

  4. node.js入门学习(三)--npm

    一.npm介绍 1)npm:node package manager是node.js默认的以js编写的软件包管理系统 官网:www.npmjs.com 文档:docs.npmjs.com 2)提到np ...

  5. python常用类库总结

    个人学习总结,如有错误,请留言指正. 类库归类总结 类库关系

  6. python-opencv中的cv2.inRange函数

    本次目标是将一副图像从rgb颜色空间转换到hsv颜色空间,颜色去除白色背景部分 具体就调用了cv2的两个函数,一个是rgb转hsv的函数 具体用法 hsv = cv2.cvtColor(rgb_ima ...

  7. ASP.NET MVC3.0下载功能实现

    C#代码: #region 下载文件 /// <summary> /// 下载文件 /// </summary> /// <param name="url&qu ...

  8. cmd命令行的FTP使用

    进入ftp:ftp 打开连接:open 192.168.1.106 2121 用户名空:none 密码空:不用输入,直接回车 查询远程服务器当前路径:pwd 显示远程服务器当前路径下的文件:dir 远 ...

  9. 初识linux命令

    1. type: 查看是外部命令/内部命令 外部命令 有存放地址信息 内部命令 is a shell builtin 2.file 查看文件的编码方式 file /sbin/ifconfig 编译执行 ...

  10. 解决CsvWriter:中文乱码、末尾行多一行空格(/r)、非第一列空字符串""显示null问题

    一:主要内容 解决CsvWriter存csv,csv文件打开后中文乱码问题 解决CsvWriter存csv,csv文件最后一行总是多一行空行的问题 解决CsvWriter存csv,csv文件不是第一列 ...