zoukankan      html  css  js  c++  java
  • tensorflow

    今天我们通过tensorflow来实现一个简单的小例子:

    假如我定义一个一元一次函数y = 0.1x + 0.3,然后我在程序中定义两个变量 Weight 和 biases 怎么让我的这两个变量自己学习然后最终学习的成果就是让Weight  ≈ 0.1和 biases ≈ 0.3. 开始吧!

     1 import tensorflow as tf
     2 import numpy as np
     3 
     4 # create data
     5 x_data = np.random.rand(100).astype(np.float32)
     6 y_data = x_data*0.1 + 0.3
     7 
     8 ### create tensorflow structure start ###
     9 
    10 Weights = tf.Variable(tf.random_uniform([1], -1.0, 1.0))
    11 biases = tf.Variable(tf.zeros([1]))
    12 y = Weights*x_data + biases
    13 loss = tf.reduce_mean(tf.square(y-y_data))
    14 optimizer = tf.train.GradientDescentOptimizer(0.5)
    15 train = optimizer.minimize(loss)
    16 
    17 ### create tensorflow structure end ###
    18 
    19 sess = tf.Session()
    20 init = tf.global_variables_initializer() #very important if you define Variable
    21 sess.run(init)
    22 for step in range(201):
    23     sess.run(train)
    24     if step % 20 == 0:
    25         print(step, sess.run(Weights), sess.run(biases))

    接下来是运行结果图:

    注意:我用的是python3.6版本,是在window下运行的。

    我给大家介绍一下这个程序的流程吧:

    首先我们需要用到tensorflow 和 numpy 模块所以要导入它们到我们的程序里面,大家习惯上给tensorflow重新命名为tf,numpy命名为np.  如果大家没有这两个版块的话网上有很多教程的...

    导入版块成功以后呢,我们就开始构建数据类型了! 因为我们定义的是一元一次函数所以说我们需要自变量x, 和因变量y。 我们定义x_data为x, y_data为y

    1 x_data = np.random.rand(100).astype(np.float32)
    2 y_data = x_data*0.1 + 0.3

    x_data = np.random.rand(100).astype(np.float32) 的意思是我们为x_data这个变量赋值,赋值的范围呢是100以内的随机数,这些随机数的类型是float32,因为在tensorflow里面数据类型大多都是默认为float32的。

    y_data = x_data*0.1 + 0.3 就是给了y_data随xdata变化而变化的函数关系式。

    接下来就是最重要的了定义Weights,biases这两个变量:

    Weights = tf.Variable(tf.random_uniform([1], -1.0, 1.0))
    biases = tf.Variable(tf.zeros([1]))
    y = Weights*x_data + biases

    tensorflow 里面有:placeholder(占位符) 和 Variable变量 这两个可以容纳我们需要传入的值我们之所以选择Variable 是因为Variable 在运算的过程中是可以改变的,我们就是需要Weights和biases这两个变量通过不断的学习而改变自身的值最后得到相对准确的值 所以选择Variable.

    Weights = tf.Variable(tf.random_uniform([1], -1.0, 1.0))  产生一个-1到1之间均匀的随机数(因为不断学习最后的值会趋近于0.1) 维度为1即一维数组也可以理解为含有一个数的列表或者就只是代表一个数

    biases = tf.Variable(tf.zeros([1]))  初始值为1 维度为一

    1 y = Weights*x_data + biases

    这里的y是因为要让Weights 和 biases 学习而构建出来的 满足的函数关系式和y_data一样

    loss = tf.reduce_mean(tf.square(y-y_data))
    optimizer = tf.train.GradientDescentOptimizer(0.5)
    train = optimizer.minimize(loss)

    这步很重要,也是tensorflow学习的经典 叫做 反向传播 首先我们定义损失函数loss 因为相同x 和相同函数关系但是y和y_data的值不一样 我们通过计算(y-y_data)^2 这个表达式 然后求平均得到一个衡量标准就是要学习的y 与 正确的y_data 之间的差别loss. 然后我们构造一个优化器optimizer,optimizer = tf.train.GradientDescentOptimizer(0.5) 可以理解为这个优化器的学习效率为0.5 (0,1)之间选择,可以自己更改值来试试^_^。有了loss 有了优化器optimizer,我们干嘛呢,我们需要通过优化器来减小我们的误差(loss) 。我们称减小误差这个步骤叫做训练过程 这也是train = optimizer.minimize(loss)这句话的含义了通过减小loss从而反向修正Weights和biases的值使之更为合理

    结构什么的都构建好了我们就可以开始核心部分了:

    sess = tf.Session()
    init = tf.global_variables_initializer() #very important if you define Variable
    sess.run(init)
    for step in range(201):
        sess.run(train)
        if step % 20 == 0:
            print(step, sess.run(Weights), sess.run(biases))

    首先开启一个Session会话,习惯上用sess = tf.Session() 用sess简化tf.Session()。

    请记住程序中定义了Variable的话呢我们必须初始化它 Weights 和 biases 为 Variable变量

    在window下使用tensorflow的初始化语句为tf.global_variables_initializer()

    在linux下使用tensorflow的初始化语句为tf.initialize_all_variable()

    初始化变量以后就开始运行这些定义的变量,要通过Session会话里面的run()函数。

    我们可以假设学习200次(你可以用for循环定义任何你喜欢的次数),每次学习的内容其实就是减小误差也就是每次都运行我们定义的train方法

    然后每隔20次输出一次我们变量Weights和biases的值,值得注意的是输出的时候也要通过Session会话来运行这两个Variable 从而显示此时Weights和biases的值 也就是我们最开始说的y = ax +b 中 a 和 b 的值

    可以从结果看到 Weights的值为0.099999 biases的值为0.30000007 都是非常接近于0.1 和0.3 的值的,这代表什么呢?学习成果啦~~^_^

    最后请谅解:

    我是第一次写这样的文章,好吧是第一次写文章,有不对的地方或者大家不清楚的地方我们可以一起探讨!

    然后有些地方其实解释的也不是很详细(一些函数的用法这篇文章没有细讲)因为我最近在做c#的一个项目所以没有时间和大家一起学习和探讨一些tensorflow基础的函数,等过段时间我会完善一些函数的解释还有就是和大家一起学习一些好玩儿的东西。

    最后希望大家都能互相帮助互相进步 ^_^。

  • 相关阅读:
    了解 DICOM 基本协议与其相关
    C# PropertyInfo 反射实体部分字段
    ref(引用参数) 和 out(输出参数) 区别
    Linq Where Expression<Func<T,bool>> 查询条件
    随笔规范
    C# 集合分析
    C# 几种常用的数据类型
    关于 C# 方法参数的理解
    打算开始写博客了
    有趣的算法、逻辑面试题
  • 原文地址:https://www.cnblogs.com/Oliva/p/8796503.html
Copyright © 2011-2022 走看看