TensorFlow入門(一)基本的な使い方


転載を歓迎しますが、必ず原文の出所と作者の情報を明記してください。
TensorFlow入門(一)基本的な使い方
refer to:http://wiki.jikexueyuan.com/project/tensorflow-zh/get_started/baic_usage.net author:huang yongye@date:2017-02-25
この例は主にtenssorflowの中国語文書に基づいてtenssorflowの基本的な使い方を学びます。文書の説明に従って、主に存在するいくつかの問題:
  • 1.Session()とInteractiveSession()の使い方です。後者はTensor.eval()とOperation.run()を使ってSession.runに取って代わられます。ここではTensor.eval()を使うことが多く、すべての表現はTensorと見なされます。
  • .また、tfの表現におけるすべての変数または定数は、tfのタイプであるべきである。
  • .変数を宣言したら、sess.run(tf.global variables suinitializer()またはx.initializer.run()の方法で初期化しなければなりません。
  • 例一:平面フィッティング
    この例ではマシン学習の汎用プロセスが見られます。1.データを準備する->2.構造モデル(解の目的関数を設定する)->3.解凍モデル
    import tensorflow as tf
    import numpy as np
    
    # 1.    :   NumPy      (phony data),    100   .
    x_data = np.float32(np.random.rand(2, 100)) #     
    y_data = np.dot([0.100, 0.200], x_data) + 0.300
    
    # 2.        
    b = tf.Variable(tf.zeros([1]))
    W = tf.Variable(tf.random_uniform([1, 2], -1.0, 1.0))
    y = tf.matmul(W, x_data) + b
    
    # 3.    
    #       :      
    loss = tf.reduce_mean(tf.square(y - y_data))
    #          
    optimizer = tf.train.GradientDescentOptimizer(0.5)
    #      :       
    train = optimizer.minimize(loss)
    
    
    ############################################################
    #      tf         
    # 1.     :tf      ,       ,         
    init = tf.global_variables_initializer()
    
    
    #   tensorflow GPU       
    config  = tf.ConfigProto()
    config.gpu_options.allow_growth = True
    # 2.    (graph)
    sess = tf.Session(config=config)
    sess.run(init)
    
    # 3.  ,                  (train op),    
    for step in xrange(0, 201):
        sess.run(train)
        if step % 20 == 0:
            print step, sess.run(W), sess.run(b)
    
    #          W: [[0.100 0.200]], b: [0.300]
    0 [[ 0.27467242  0.81889796]] [-0.13746099]
    20 [[ 0.1619305   0.39317462]] [ 0.18206716]
    40 [[ 0.11901411  0.25831661]] [ 0.2642329]
    60 [[ 0.10580806  0.21761954]] [ 0.28916073]
    80 [[ 0.10176832  0.20532639]] [ 0.29671678]
    100 [[ 0.10053726  0.20161074]] [ 0.29900584]
    120 [[ 0.100163    0.20048723]] [ 0.29969904]
    140 [[ 0.10004941  0.20014738]] [ 0.29990891]
    160 [[ 0.10001497  0.20004457]] [ 0.29997244]
    180 [[ 0.10000452  0.20001349]] [ 0.29999167]
    200 [[ 0.10000138  0.2000041 ]] [ 0.29999748]
    
    例二:二つの数の合計
    input1 = tf.constant(2.0)
    input2 = tf.constant(3.0)
    input3 = tf.constant(5.0)
    
    intermd = tf.add(input1, input2)
    mul = tf.multiply(input2, input3)
    
    with tf.Session() as sess:
        result = sess.run([mul, intermd])  #       op
        print result
        print type(result)
        print type(result[0])   
    [15.0, 5.0]
    <type 'list'>
    <type 'numpy.float32'>
    
    1.変数、定数
    1.1 tenssorflowでカウンタを実現し、主にサイクル中に加算を起動してカウントを実現するよう設計しました。
    #     ,    0
    state = tf.Variable(0, name="counter")
    
    #      op ,       state    1
    one = tf.constant(1) #     1     
    new_value = tf.add(state, 1)
    update = tf.assign(state, new_value)
    
    
    #      ,    update op
    with tf.Session() as sess:
        #       ,      ‘   ’ 
        sess.run(tf.global_variables_initializer())
        #   state     
        print sess.run(state)
        for _ in range(3):
            sess.run(update)  #         state    1
            print sess.run(state)
    0
    1
    2
    3
    
    1.2 tfを使って、一組の数の合計を実現し、平均を再計算する。
    h_sum = tf.Variable(0.0, dtype=tf.float32)
    # h_vec = tf.random_normal(shape=([10]))
    h_vec = tf.constant([1.0,2.0,3.0,4.0])
    #   h_vec         h_sum  ,      10       
    #      
    h_add = tf.placeholder(tf.float32)
    #       
    h_new = tf.add(h_sum, h_add)
    #    h_new   op
    update = tf.assign(h_sum, h_new)
    
    with tf.Session() as sess:
        sess.run(tf.global_variables_initializer())
        #      
        print 's_sum =', sess.run(h_sum)
        print "vec = ", sess.run(h_vec)
    
        #     
        for _ in range(4):
            sess.run(update, feed_dict={h_add: sess.run(h_vec[_])})
            print 'h_sum =', sess.run(h_sum)
    
    # print 'the mean is ', sess.run(sess.run(h_sum) / 4) #     4     ,      tf       
        print 'the mean is ', sess.run(sess.run(h_sum) / tf.constant(4.0))
     s_sum = 0.0
    vec =  [ 1.  2.  3.  4.]
    h_sum = 1.0
    h_sum = 3.0
    h_sum = 6.0
    h_sum = 10.0
    the mean is  2.5
    
    1.3一つの変数だけでカウンタを実現する
    上のカウンターはTensorFlowの公式文書の例ですが、太っている感じがしますので、以下にもっと簡単な変数を定義して、1つのプラス1の操作(op)だけを書きました。forサイクルで実現できます。
    #      assign()       ,    sess.run()    state       0.0
    state = tf.Variable(0.0, tf.float32)
    #    assign      state  。
    add_op = tf.assign(state, state+1)
    
    sess.run(tf.global_variables_initializer())
    print 'init state ', sess.run(state)
    for _ in xrange(3):
        sess.run(add_op)
        print sess.run(state)
    init state  0.0
    1.0
    2.0
    3.0
    
    これは私たちが普段カウンターを実現する方法とほぼ同じです。私たちが重点的に理解するのは、TensorFlowにおいてtf.assign(ref,value)の方式でvalue値をref変数に割り当てることである。このように、サイクル毎にref変数は定義時の初期化操作をしません。
    2.InteractiveSession()の使い方
    InteractiveSession()は主に一つの変数によって保持されることを避けることである。
    a = tf.constant(1.0)
    b = tf.constant(2.0)
    c = a + b
    
    #            
    with tf.Session():
        print c.eval()
    
    sess = tf.InteractiveSession()
    print c.eval()
    sess.close()
    3.0
    3.0
    
    a = tf.constant(1.0)
    b = tf.constant(2.0)
    c = tf.Variable(3.0)
    d = a + b
    
    sess = tf.InteractiveSession()
    sess.run(tf.global_variables_initializer())
    
    ###################
    #        
    # print a.run() 
    # print d.run()
    
    ####################
    
    #        
    print a.eval()   
    print d.eval()
    
    # run()       
    x = tf.Variable(1.2)
    # print x.eval() #      ,   
    x.initializer.run()  # x.initializer          op, op   run()   
    print x.eval()
    
    sess.close()
    1.0
    3.0
    1.2
    
    2.1どのようにtf.InteractiveSession()を使って上記1.2の中の平均的な操作を完成しますか?
    h_sum = tf.Variable(0.0, dtype=tf.float32)
    # h_vec = tf.random_normal(shape=([10]))
    h_vec = tf.constant([1.0,2.0,3.0,4.0])
    #   h_vec         h_sum  ,      10       
    #      
    h_add = tf.placeholder(tf.float32)
    #       
    h_new = tf.add(h_sum, h_add)
    #    h_new   op
    update = tf.assign(h_sum, h_new)
    
    sess = tf.InteractiveSession()
    sess.run(tf.global_variables_initializer())
    print 's_sum =', h_sum.eval()
    print "vec = ", h_vec.eval()
    print "vec = ", h_vec[0].eval()
    
    
    for _ in range(4):
        update.eval(feed_dict={h_add: h_vec[_].eval()})
        print 'h_sum =', h_sum.eval()
    sess.close()
    s_sum = 0.0
    vec =  [ 1.  2.  3.  4.]
    vec =  1.0
    h_sum = 1.0
    h_sum = 3.0
    h_sum = 6.0
    h_sum = 10.0
    
    3.変数にfeedを使う
    これらのfeedを使用して値を付与する必要がある操作は、tf.placceholder()によって説明され、プレースホルダを作成することができる。以下の例では、session.run([output],…)とsession.run(output,...)の違いが見られます。前者はoutputのタイプなどの詳細情報を出力していますが、後者は簡単な結果のみを出力します。
    input1 = tf.placeholder(tf.float32)
    input2 = tf.placeholder(tf.float32)
    output = tf.multiply(input1, input2)
    
    with tf.Session() as sess:
        print sess.run([output], feed_dict={input1:[7.0], input2:[2.0]})
    [array([ 14.], dtype=float32)]
    
    with tf.Session() as sess:
        result = sess.run(output, feed_dict={input1:[7.0], input2:[2.0]})
        print type(result)
        print result
    <type 'numpy.ndarray'>
    [ 14.]
    
    with tf.Session() as sess:
        result = sess.run(output, feed_dict={input1:7.0, input2:2.0})
        print type(result)
        print result
    <type 'numpy.float32'>
    14.0
    
    with tf.Session() as sess:
        print sess.run([output], feed_dict={input1:[7.0, 3.0], input2:[2.0, 1.0]})
    [array([ 14.,   3.], dtype=float32)]
    
    with tf.Session() as sess:
        print sess.run(output, feed_dict={input1:[7.0, 3.0], input2:[2.0, 1.0]})
    [ 14.   3.]
    
    本論文のコード:https://github.com/yongyehuang/Tensorflow-Tutorial