zoukankan      html  css  js  c++  java
  • Tensorflow入门

      在看《Tensorflow:实战Google深度学习框架》,自己在网上买了书,PDF下载地址:http://download.csdn.net/download/nsguf/10113564。

      Tensorflow计算模型--计算图,这篇文章可以让新手对Tensorflow有一些基本的了解。最开始我看到名字时,我以为就是使用其他语言直接调用即可,而Tensorflow对python的接口做的相对较好,所以之前我对python也进行了一定的学习,等我再来看tensorflow的时候发现,好像对python的要求并不是很高,大部分是Tensorflow自己的调用方法,比如声明变量,直接用tf.Variable()方法即可;还有一个感触就是Tensorflow有自己的一些方法去对变量进行计算,和NumPy有点像。好,现在开始学习。

      首先来个小例子,可以对Tensorflow有一个最初的了解,基本没有用到python。

    #Tensorflow中的所有计算都会被转化为计算图上的节点,而节点之间的边描述了
    #计算之间的依赖关系
    import tensorflow as tf #先引用包
    print(tf.__version__)#查看版本
    hello=tf.constant('Hello')#一个计算,计算结果为一个张量,保存在变量hello中
    a=tf.constant([1.0,2.0],name='a')
    b=tf.constant([2.0,3.0],name='b')
    g=tf.Graph()#获取整个图
    print(a.graph is tf.get_default_graph())#a.graph用于查看张量a所属的计算图
    

      

    #==============================================================================
    # with g.device('/gpu:0'):#指定计算运行的设备
    #     result=a+b
    #==============================================================================
    result=a+b#a和b的类型必须一样,否则会报错,所以建议在创建变量时,在后边添加dtype=tf.float32
    print(result)
    print(result.get_shape())#获取维度
    #tf.InteractiveSession()加载它自身作为默认构建的session,tensor.eval()和operation.run()取决于默认的session.
    #换句话说:InteractiveSession 输入的代码少,原因就是它允许变量不需要使用session就可以产生结构。
    #会话总结
    #==============================================================================
    # sess=tf.InteractiveSession()#方法一,这是官网上给的方法
    # print(result.eval())
    # sess.close()
    #==============================================================================
    #==============================================================================
    # sess=tf.Session()#方法二,close方法必须调用,否则造成内存泄漏
    # print(sess.run(result))#该方法与下行结果相同
    # print(result.eval(session=sess))#在方法一中,则无需指定session
    # sess.close()
    #==============================================================================
    #==============================================================================
    # with tf.Session() as sess:#改编方法二、利用上下文管理器解决close的调用,
    #     print(sess.run(result))
    #==============================================================================
    #==============================================================================
    # sess=tf.Session()#Tensorflow会自动生成一个默认的计算图,若没有特殊指定,则运算自动加入,但tensorflow不会自动生成默认的会话
    # with sess.as_default():#指定默认会话
    #     print(result.eval())
    #==============================================================================
    
    #使用ConfigProto可以对会话进行配置,且对上述两种方法都可
    config=tf.ConfigProto(allow_soft_placement=True,
                          log_device_placement=True)#第一个参数表示当在某些不能在GPU上运算的情况下,自动调整到CPU上,第二个参数表示日志中将会记录每个节点在哪个设备上以方便调试,默认都为false
    sess1=tf.InteractiveSession(config=config)
    sess2=tf.Session(config=config)
    
    with sess1.as_default():
        print(result.eval())
    

      最后的输出是:

    1.2.1
    Tensor("add_15:0", shape=(2,), dtype=float32)
    (2,)
    [ 3.  5.]

      从上面例子可以看出,好像用的都是Tensorflow自己的接口。下面再看一个例子,三层简单传播网络的前向传播算法。三层便代表图中的输入层、隐藏层、输出层;除了输入层,其他的神经元都是多个输入一个输出,在该算法中,输出=输入取值的加权和,其实也就相当于矩阵乘法,有兴趣的可以去看看这本书。tf有自己的矩阵乘法接口:tf.matmul(x,w1),代码如下:

    w1=tf.Variable(tf.random_normal([2,3],stddev=1,seed=1))#声明变量的方法,声明了之后类型不可变,shape可变,使用validate_shape=False参数,但是使用罕见
    w2=tf.Variable(tf.random_normal([3,1],stddev=1,seed=1))
    x=tf.constant([[0.7,0.9]])
    #定义向前传播的神经网络
    a=tf.matmul(x,w1)#矩阵乘法
    y=tf.matmul(a,w2)
    #==============================================================================
    # sess=tf.Session()
    # sess.run(w1.initializer)#创建的变量都要初始化,给变量赋值
    # sess.run(w2.initializer)
    # print(sess.run(y))#只需run最后结果即可
    # sess.close()
    #==============================================================================
    with tf.Session() as sess:
        #sess.run(w1.initializer)
        #sess.run(w2.initializer)
        tf.global_variables_initializer().run()#初始化所有变量,和上面方法结果一样
        print(sess.run(y))#只需run最后结果即可
    

      上述的x是默认的常量,如果需要后面输入怎么办呢?将x的取值换成x=tf.placeholder(tf.float32,shape=(1,2),name='input'),然后在最后run(y)的时候加上参数feed_dict={x: [[0.7,0.9]]}即可,代码如下:

    #利用placeholder增加输出
    w1=tf.Variable(tf.random_normal([2,3],stddev=1,seed=1))#声明变量的方法,stddev:标准差,mean:平均值,seed:随机数种子
    w2=tf.Variable(tf.random_normal([3,1],stddev=1,seed=1))
    x=tf.placeholder(tf.float32,shape=(1,2),name='input')
    #定义向前传播的神经网络
    a=tf.matmul(x,w1)#矩阵乘法
    y=tf.matmul(a,w2)
    with tf.Session() as sess:
        tf.global_variables_initializer().run()
        print(sess.run(y, feed_dict={x: [[0.7,0.9]]}))
    

      其中要注意的是,placeholder中的shape参数值需要和run中的feed_dict中x的值得shape一致,否则报错。如果需要传入多个值也可以,直接将shape和x的值换掉,如下:

    w1=tf.Variable(tf.random_normal([2,3],stddev=1,seed=1))#声明变量的方法,stddev:标准差,mean:平均值,seed:随机数种子
    w2=tf.Variable(tf.random_normal([3,1],stddev=1,seed=1))
    x=tf.placeholder(tf.float32,shape=(3,2),name='input')
    #定义向前传播的神经网络
    a=tf.matmul(x,w1)#矩阵乘法
    y=tf.matmul(a,w2)
    with tf.Session() as sess:
        tf.global_variables_initializer().run()
        print(sess.run(y, feed_dict={x: [[0.7,0.9],[0.1,0.4],[0.5,0.8]]}))
    

      最后给出几个方法给参考:

    print(tf.all_variables())#获取计算图上所有的变量
    print(tf.trainable_variables())#获取需要优化的参数
    
    #Tensorflow随机数生成函数
    tf.random_normal()#正态分布  主要参数:平均值,标准差,取值类型
    tf.truncated_normal()#正态分布,若随机值偏离平均值超过两个标准差,则重新随机 主要参数:平均值,标准差,取值类型
    tf.random_uniform()#均匀分布 主要参数:最小最大取值,取值类型
    tf.random_gamma()#Gamma分布 主要参数:形状参数alpha、尺度参数beta、取值类型
    #常数生成函数和NumPy很像
    tf.zeros([2,3],tf.int32)#全0
    tf.ones([2,3],tf.int32)#全1
    tf.fill([2,3],9)#全填满后边的参数9
    tf.constant([1,2,3])#给定值
    

      都去试一下吧,加深印象。

    文章来源:NSGUF,欢迎分享,转载请保留出处
  • 相关阅读:
    BZOJ 3160 万径人踪灭
    BZOJ 2160 拉拉队排练
    模板 manacher算法
    [Tjoi2016&Heoi2016]求和
    [HZOI 2015]疯狂的机器人
    [BZOJ3456]城市规划
    BZOJ 4372 烁烁的游戏
    洛谷3794 签到题IV
    BZOJ 3730 震波
    BZOJ 4916 神犇和蒟蒻
  • 原文地址:https://www.cnblogs.com/NSGUF/p/7464321.html
Copyright © 2011-2022 走看看