TensorFlow常用まとめ


文書ディレクトリ
  • 1.計算図ノードとTensor
  • 2.tf.py_func使用
  • データサンプリング相関関数
  • tf.unique_with_count
  • tf.nn.topk

  • 1.計算図ノードとTensor
    TensorFlow計算図の各ノードは1つの計算を定義し、計算結果はTensorによって保存されるので、Tensorは計算図のノードに対応する計算結果に対応し、同時にTensorは3つの重要な属性を有し、name、dtype、shapeは、nameによって計算図の1つのTensorを一意に決定することができる.一方、Tensorはdtypeとshapeによってschemaを決定し、計算図が実行されるたびに、そのschemaに合致する値がTensorに与えられるだけである.
    2.tf.py_func使用
    tensorflowではtensorはプレースホルダにすぎないため、実行時にのみ本物の値が埋め込まれるため、Graphを構築する際にGraphを構築する際にoperationの演算結果に対してif elseエントリの判断ができないなど、Graphを構築する際に多くの限界があります.同時に、あるOperation計算結果をnumpyのarrayとして直接処理することはできません.この限界を補うためにtensorflowでtfを使用します.py_funcで補足します.tf.py_func関数解析:
    tf.py_func(func,inp,Tout,stateful=True,name)
    

    入力パラメータがnumpy array形式であり、出力もnumpy array,tfであるpython関数funcを定義する.py_funcはこの関数をoperationとしてパッケージし、Graphに埋め込むfunc:ユーザがカスタマイズしたpython関数、numpy arrayと入力し、出力もnumpy array inp:func関数で受信した入力はTensorのlist Tout:func関数の戻り値を指定してTensorに変換するデータ型
    実際のシーンで例を挙げる
    def np_random_choice_sample(self, sample_prob, candidate_num, choice_number):
            two_axis_tensor = tf.constant([[j+i*candidate_num for j in range(candidate_num)] for i in range(self.batch_size)], tf.int32)
            line_num, _ = two_axis_tensor.get_shape()
            result = []
            for i in range(self.batch_size):
                result.append(tf.py_func(np.random.choice, [two_axis_tensor[i], tf.constant(choice_number, tf.int32), tf.constant(False, tf.bool), sample_prob[i]], tf.int32))
            return tf.reshape(tf.concat(result, axis=0), [-1])
    

    まずTensor twoを宣言しますaxis_tensor、そしてnpを利用する.random.なぜならnp.random.choiceは4つの入力パラメータを受信し、ここで入力パラメータはいずれもtfである必要があることに注意する.Variableタイプは、list形式で入力され、入力パラメータが1つしかない場合もlist形式で入力する必要があります)と同時にToutは出力された結果のデータ型を指定します.もちろん、複数の値を返し、各値のデータ型が異なる場合はlistを使用して異なるデータ型を指定できます.
    もちろんfuncは、ユーザがカスタマイズした任意のnumpyデータ処理セットであってもよいが、funcで逆伝播を必要とする操作を行うことはできないことに注意してください.
    データサンプリング相関関数
    tf.unique_with_count
    1 Dの配列のうち、重複する要素のうち、重複しない部分の分布を観察するには、tfを用いることができる.unique_with_count
    # tensor 'x' is [1, 1, 2, 4, 4, 4, 7, 8, 8]
    y, idx, count = tf.unique_with_counts(x)
    y ==> [1, 2, 4, 7, 8]
    idx ==> [0, 0, 1, 2, 2, 2, 3, 4, 4]
    count ==> [2, 1, 3, 1, 2]
    

    tf.nn.topk
    与えられたTensorおよびk値は、与えられたtensorが多次元Tensorである場合、サンプリングのたびに最後の次元で行われる
    import numpy as np
    a = tf.convert_to_tensor(np.random.random([3,3]))
    
    #            5      ,          。
    b = tf.nn.top_k(a, 2)
    
    with tf.Session() as sess:
        print(sess.run(a))
        print(sess.run(b))
    
    [[0.24674883 0.10466478 0.15669153]
     [0.17753881 0.4964197  0.23149027]
     [0.85461829 0.77626046 0.81463996]]
    TopKV2(values=array([[0.24674883, 0.15669153],
           [0.4964197 , 0.23149027],
           [0.85461829, 0.81463996]]), indices=array([[0, 2],
           [1, 2],
           [0, 2]], dtype=int32))