LoginSignup
34
32

More than 5 years have passed since last update.

TensorFlowのAPIメモ(Python)

Posted at

行列計算も統計もよく分からん、numpyなんて使ったこと無い。なのでTensorFlowのAPIが理解できない。
・・・というわけで、よく分からないAPIを一つずつ動かしてみて、どんな動きをするのかを確認するメモ。
専門知識は全くありませんので、ツッコミ・コメントお待ちしています。
参考:公式のAPIリファレンス

お試し方法

Pythonの対話モードで下記を一つずつ試してみる。

>>> import tensorflow as tf
>>> sess = tf.Session()
>>> sess.run(<実行するAPI>)

API

tf.size(input, name=None)

>>> sess.run(tf.size([0,1,2]))
3
>>> sess.run(tf.size([[0,1,2]]))
3
>>> sess.run(tf.size([[0,1,2],[4,5,6]]))
6

要素の個数を返すらしい。

tf.expand_dims(input, dim, name=None)

>>> sess.run(tf.expand_dims([0,1,2,3], 1))
array([[0],
       [1],
       [2],
       [3]], dtype=int32)
>>> sess.run(tf.expand_dims([[0,1,2,3],[4,5,6,7]], 1))
array([[[0, 1, 2, 3]],

       [[4, 5, 6, 7]]], dtype=int32)
>>> sess.run(tf.expand_dims([[0,1,2,3],[4,5,6,7]], 2))
array([[[0],
        [1],
        [2],
        [3]],

       [[4],
        [5],
        [6],
        [7]]], dtype=int32)

dimで指定された次元(Rank)分をinputに追加するらしい。
inputのRankが1で、dimに1が指定されてたら、戻り値はRank2になる。

tf.range(start, limit=None, delta=1, name='range')

>>> sess.run(tf.range(5))
array([0, 1, 2, 3, 4], dtype=int32)
>>> sess.run(tf.range(1,5))
array([1, 2, 3, 4], dtype=int32)

指定された分の1次元配列(厳密にはTensor)を返す。

tf.concat(concat_dim, values, name='concat')

>>> sess.run(tf.concat(0, [[1,2,3], [10,20,30]]))
array([ 1,  2,  3, 10, 20, 30], dtype=int32)
>>> sess.run(tf.concat(1, [[[1,2,3],[4,5,6]], [[10,20,30],[40,50,60]]]))
array([[ 1,  2,  3, 10, 20, 30],
       [ 4,  5,  6, 40, 50, 60]], dtype=int32)

valuesで与えたTensor同士を繋げるらしい。
繋げる元となるTensor同士は[<Tensor1>,<Tensor2>]みたいな形で与える。

tf.pack(values, name='pack')

>>> sess.run(tf.pack([1,2]))
array([1, 2], dtype=int32)
>>> sess.run(tf.pack([1,5]))
array([1, 5], dtype=int32)
>>> sess.run(tf.pack([1,5,10]))
array([ 1,  5, 10], dtype=int32)

イマイチよく分からないけど、valuesで与えたTensorと同じものが返ってくる。公式リファレンスには、

tf.pack([x, y, z]) = np.asarray([x, y, z])

と書いてあり、np.asarray()は引数で与えた配列の参照を作る関数らしいが・・・

>>> a = [0,1,2]
>>> b = sess.run(tf.pack(a))
>>> b
array([0, 1, 2], dtype=int32)
>>> b[0] = 5
>>> b
array([5, 1, 2], dtype=int32)
>>> a
[0, 1, 2]

参照にはなっていないようだが・・・??

tf.sparse_to_dense(sparse_indices, output_shape, sparse_values, default_value=0, validate_indices=True, name=None)

>>> sess.run(tf.sparse_to_dense([0,1],[5], 1.0, 0.0))
array([ 1.,  1.,  0.,  0.,  0.], dtype=float32)
>>> sess.run(tf.sparse_to_dense([0,1],[3], 1.0, 0.0))
array([ 1.,  1.,  0.], dtype=float32)
>>> sess.run(tf.sparse_to_dense([0,2],[5], 1.0, 0.0))
array([ 1.,  0.,  1.,  0.,  0.], dtype=float32)
>>> sess.run(tf.sparse_to_dense([0,2],[5], 2.0, 0.0))
array([ 2.,  0.,  2.,  0.,  0.], dtype=float32)
>>> sess.run(tf.sparse_to_dense([0,2],[5], 2.0, 5.0))
array([ 2.,  5.,  2.,  5.,  5.], dtype=float32)

下記は公式リファレンスの説明。

# If sparse_indices is scalar
dense[i] = (i == sparse_indices ? sparse_values : >default_value)

# If sparse_indices is a vector, then for each i
dense[sparse_indices[i]] = sparse_values[i]

# If sparse_indices is an n by d matrix, then for each i in [0, n)
dense[sparse_indices[i][0], ..., sparse_indices[i][d-1]] = sparse_values[i]

>>> sess.run(tf.sparse_to_dense([3],[5], 0.1, 0.0))
array([ 0. ,  0. ,  0. ,  0.1,  0. ], dtype=float32)
>>> sess.run(tf.sparse_to_dense([0],[5], 0.1, 0.0))
array([ 0.1,  0. ,  0. ,  0. ,  0. ], dtype=float32)

sparse_indicesがスカラー(Rank0)の場合は、sparse_indicesで与えた数値のインデックスの箇所がsparse_valuesの値になる。

>>> sess.run(tf.sparse_to_dense([0,1],[5], [0.1,0.2], 0.0))
array([ 0.1,  0.2,  0. ,  0. ,  0. ], dtype=float32)
>>> sess.run(tf.sparse_to_dense([1,2],[5], [0.1,0.2], 0.0))
array([ 0. ,  0.1,  0.2,  0. ,  0. ], dtype=float32)
>>> sess.run(tf.sparse_to_dense([0,2],[5], [0.1,0.2], 0.0))
array([ 0.1,  0. ,  0.2,  0. ,  0. ], dtype=float32)
>>> sess.run(tf.sparse_to_dense([0,2],[5],0.1, 0.0))
array([ 0.1,  0. ,  0.1,  0. ,  0. ], dtype=float32)

sparse_indices=[0,2]で、sparse_valuesが[0.1,0.2]だった場合、output[0]=0.1、output[2]=0.2となる。わかりにくい。sparse_valuesがスカラー値だった場合は入る値は同じ。
sparse_indicesが昇順じゃなかったり([1,0]とか)、同じ値が入っている([1,1]とか)とエラーになるらしい。

>>> sess.run(tf.sparse_to_dense([[0,1],[0,2]],[5,5],0.1, 0.0))
array([[ 0. ,  0.1,  0.1,  0. ,  0. ],
       [ 0. ,  0. ,  0. ,  0. ,  0. ],
       [ 0. ,  0. ,  0. ,  0. ,  0. ],
       [ 0. ,  0. ,  0. ,  0. ,  0. ],
       [ 0. ,  0. ,  0. ,  0. ,  0. ]], dtype=float32)

・・・まぁそういうことです。
このAPIの意味は理解出来ず。。。

tf.nn.softmax(logits, name=None)

>>> sess.run(tf.nn.softmax([[0.0,1.0]]))
array([[ 0.26894143,  0.7310586 ]], dtype=float32)
>>> sess.run(tf.nn.softmax([[0.0,1.0],[0.0,1.0]]))
array([[ 0.26894143,  0.7310586 ],
       [ 0.26894143,  0.7310586 ]], dtype=float32)
>>> sess.run(tf.nn.softmax([[1.0],[1.0]]))
array([[ 1.],
       [ 1.]], dtype=float32)
>>> sess.run(tf.nn.softmax([[0.0,1.0,2.0]]))
array([[ 0.09003057,  0.24472848,  0.66524094]], dtype=float32)
>>> sess.run(tf.nn.softmax([[0.0,1.0,2.0,10.0]]))
array([[  4.53770481e-05,   1.23347607e-04,   3.35293560e-04,
          9.99495983e-01]], dtype=float32)
>>> sess.run(tf.nn.softmax([[0.0,1.0,2.0],[1.0,1.0,1.0]]))
array([[ 0.09003057,  0.24472848,  0.66524094],
       [ 0.33333334,  0.33333334,  0.33333334]], dtype=float32)

logitsはRank2で、かつfloatである必要がある。
1つの次元内で足し合わせて全部1になるようなものを返す。

tf.nn.softmax_cross_entropy_with_logits(logits, labels, name=None)

>>> sess.run(tf.nn.softmax_cross_entropy_with_logits([[1.0]],[[1.0]]))
array([ 0.], dtype=float32)
>>> sess.run(tf.nn.softmax_cross_entropy_with_logits([[1.0,0.0]],[[1.0,1.0]]))
array([ 1.62652326], dtype=float32)
>>> sess.run(tf.nn.softmax_cross_entropy_with_logits([[1.0]],[[2.0]]))
array([ 0.], dtype=float32)
>>> sess.run(tf.nn.softmax_cross_entropy_with_logits([[1.0,0.0],[0.0,2.0]],[[1.0,1.0],[0.0,1.0]]))
array([ 1.62652326,  0.12692805], dtype=float32)
>>> sess.run(tf.nn.softmax_cross_entropy_with_logits([[1.0,2.0]],[[3.0,4.0]]))
array([ 5.19283152], dtype=float32)
>>> sess.run(tf.nn.softmax_cross_entropy_with_logits([[1.0,2.0]],[[4.0,3.0]]))
array([ 6.19283152], dtype=float32)

logitsとlabelsはfloatかつRank2である必要がある。
交差エントロピーを返すらしい。・・・が交差エントロピーが何であるかはイマイチよく理解できていない。多分「logitsとlabelsをSoftmaxした後、その2つがどれだけ近いか」を返しているんじゃないか・・・なぁ?

tf.nn.in_top_k(predictions, targets, k, name=None)

>>> sess.run(tf.nn.in_top_k([[0,2,1]],[1],1))
array([ True], dtype=bool)
>>> sess.run(tf.nn.in_top_k([[3,2,1]],[1],1))
array([False], dtype=bool)
>>> sess.run(tf.nn.in_top_k([[3,2,1]],[0],1))
array([ True], dtype=bool)
>>> sess.run(tf.nn.in_top_k([[3,2,1]],[0],2))
array([ True], dtype=bool)
>>> sess.run(tf.nn.in_top_k([[3,2,1]],[1],2))
array([ True], dtype=bool)
>>> sess.run(tf.nn.in_top_k([[3,2,1]],[2],2))
array([False], dtype=bool)
>>> sess.run(tf.nn.in_top_k([[3,2,1],[1,3,5]],[1,0],2))
array([ True, False], dtype=bool)

要は「一番大きい数字はどれか?」という話。
predictionsが[[3,2,1]]で、targetsが[0]だった場合、一番大きいのは0番目の「3」なので、正解となり、戻り値はTrueとなる。targetsが[1]や[2]だとFalseになる。
kは「大きさが~番目までならOK」という指定。kが2なら数字が2番目に大きい数字であってもTrueを返す。例えばpredictionsが[[3,2,1]]で、kが2であれば、targetsが[0](0番目の数字「3」)または[1](1番目の数字「2」)でTrueになる。

34
32
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
34
32