tensorflow函数学习

标签(空格分隔): tensorflow 深度学习


一、一些函数

1 tf.nn.softmax

help(tf.nn.softmax)
logits = np.array([[1, 2, 7],
                   [3, 5, 2],
                   [6, 1, 3],
                   [8, 2, 0],
                   [3, 6, 1]], dtype=np.float32)
sess=tf.Session()
sess.run(tf.nn.softmax(logits=logits, dim=-1))

# -----输出:
softmax(logits, dim=-1, name=None)   Computes softmax activations.
    
    For each batch `i` and class `j` we have
    
        softmax = exp(logits) / reduce_sum(exp(logits), dim)
    
    Args:
      logits: A non-empty `Tensor`. Must be one of the following types: `half`,
        `float32`, `float64`.
      dim: The dimension softmax would be performed on. The default is -1 which
        indicates the last dimension.
      name: A name for the operation (optional).
    
    Returns:
      A `Tensor`. Has the same type as `logits`. Same shape as `logits`.
    Raises:
      InvalidArgumentError: if `logits` is empty or `dim` is beyond the last
        dimension of `logits`.
        
array([[  2.45611509e-03,   6.67641265e-03,   9.90867496e-01],
       [  1.14195190e-01,   8.43794703e-01,   4.20100652e-02],
       [  9.46499169e-01,   6.37746137e-03,   4.71234173e-02],
       [  9.97193694e-01,   2.47179624e-03,   3.34521203e-04],
       [  4.71234173e-02,   9.46499169e-01,   6.37746137e-03]], dtype=float32)

输入一个张量,默认对张量的最后一维进行softmax计算,以二维矩阵为例,针对第一行
math.exp(1)/(math.exp(1)+math.exp(2)+math.exp(7)) = 2.456e-03
math.exp(2)/(math.exp(1)+math.exp(2)+math.exp(7)) = 6.676e-03
math.exp(7)/(math.exp(1)+math.exp(2)+math.exp(7)) = 9.908e-01
可以看到,softmax返回一个概率向量,且和为1,类似于概率归一化。
softmax能够放大占比重较大的项

2 tf.nn.sigmoid

help(tf.nn.sigmoid)
logits = np.array([[1, 2, 7],
                   [3, 5, 2],
                   [6, 1, 3],
                   [8, 2, 0],
                   [3, 6, 1]], dtype=np.float32)
sess=tf.Session()
sess.run(tf.nn.sigmoid(logits))

# -----输出:
sigmoid(x, name=None)
    Computes sigmoid of `x` element-wise.
    
    Specifically, `y = 1 / (1 + exp(-x))`.
    
    Args:
      x: A Tensor with type `float32`, `float64`, `int32`, `complex64`, `int64`,
        or `qint32`.
      name: A name for the operation (optional).
    
    Returns:
      A Tensor with the same type as `x` if `x.dtype != qint32`
        otherwise the return type is `quint8`.
    
    @compatibility(numpy)
    Equivalent to np.scipy.special.expit
    @end_compatibility

array([[ 0.7310586 ,  0.88079703,  0.999089  ],
       [ 0.95257413,  0.99330717,  0.88079703],
       [ 0.99752742,  0.7310586 ,  0.95257413],
       [ 0.99966466,  0.88079703,  0.5       ],
       [ 0.95257413,  0.99752742,  0.7310586 ]], dtype=float32)

针对第一行,计算公式如下:
1/(1+math.exp(-1))=0.73
1/(1+math.exp(-2))=0.88
1/(1+math.exp(-7))=0.99

3 tf.clip_by_value(A, min,max)

输入一个张量A,把A中的每一个元素的值都压缩在min和max之间。小于min的让它等于min,大于max的元素的值等于max。常和对数函数一起使用,因为log(0)是nan,最好映射到非常小的值

import tensorflow as tf;  
import numpy as np;  
  
A = np.array([[1,1,2,4], [3,4,8,5]])  
  
with tf.Session() as sess:  
    print sess.run(tf.clip_by_value(A, 2, 5)) 

#---输出
[[2 2 2 4]
 [3 4 5 5]]

4 tf.one_hot(indices, depth, on_value=1, off_value=0)
将[2,1,0,0,1]转为其ont-hot编码矩阵

labels = np.array([[0, 0, 1],
                   [0, 1, 0],
                   [1, 0, 0],
                   [1, 0, 0],
                   [0, 1, 0]], dtype=np.float32)
classes = tf.argmax(labels, axis=1)                  #[2 1 0 0 1]
classes_one_hot=tf.one_hot(classes,3)           #与labels相同
print sess.run(classes)
print sess.run(classes_one_hot)

5 tf.reshape(data, shape)
更改数据的形状

initial = tf.truncated_normal([2,4], stddev=0.1)
reshaped=tf.reshape(initial,[-1,2])     #-1表示该维度由其他维度算出来的,这里可以推出是4
sess.run(initial)
sess.run(reshaped)
#---输出
array([[ 0.04542142,  0.05807167,  0.04512282, -0.00823399],
       [-0.04336055,  0.06470031,  0.17169526, -0.02920728]], dtype=float32)

array([[-0.13132362, -0.0573084 ],
       [ 0.14249204, -0.0505862 ],
       [ 0.01468951,  0.0189805 ],
       [-0.05596937, -0.04880321]], dtype=float32)

6 tf.stack()和tf.unstack()
tf.stack()这是一个矩阵拼接的函数,tf.unstack()则是一个矩阵分解的函数

a=tf.constant([1,2,3])
b=tf.constant([4,5,6])
c=tf.stack([a,b])
array([[1, 2, 3],
       [4, 5, 6]], dtype=int32)

d=tf.unstack(c,axis=0)
[array([1, 2, 3], dtype=int32), array([4, 5, 6], dtype=int32)]
e=tf.unstack(c,axis=1)       
[array([1, 4], dtype=int32), array([2, 5], dtype=int32), array([3, 6], dtype=int32)]

7 tf.truncated_normal与tf.random_normal
在tf.truncated_normal中如果x的取值在区间(μ-2σ,μ+2σ)之外则重新进行选择。这样保证了生成的值都在均值附近。

  1. add_to_collection、get_collection、add_n
    tf.add_to_collection:把变量放入一个集合,把很多变量变成一个列表
    tf.get_collection:从一个集合中取出全部变量,是一个列表
    tf.add_n:把一个列表的东西都依次加起来
with tf.name_scope("name1") as scope:
    a=tf.constant([11, 12],name="a")
    b = tf.constant([11, 13], name="b")
    tf.add_to_collection('losses', a)               #类似一个键值对,key='losses', value=[a]
    tf.add_to_collection('losses', b)               #key='losses',value=[a,b]

    xxx = tf.get_collection("losses",scope)          #[a, b]
    yyy = tf.get_collection("losses","name")         #[a, b]
    zzz = tf.get_collection("losses","name2")        #[]
    get_collection有两个参数,第一个是key,第二个scope(可选),使用正则匹配
  1. tf.group()
    创建一个操作,该操作可以对 TensorFlow 的多个操作进行组合执行,但没有输出。
a=tf.Variable(3)
add=tf.assign(a,a+1)               #a+1的op
add_2=tf.assign(a,a+2)             #a+2的op
sess.run(tf.group(add,add_2))      #执行a+1,a+2两个op,注意此时无返回
sess.run(a)                        #返回6,说明op都执行了
  1. tf.gather(data, indices)
    将data中由indices指定的元素取出
a                                   #二维示例                       
# array([[1, 2],          
        [3, 4],
        [5, 6]])
sess.run(tf.gather(a,[0,2]))     
# array([[1, 2],
        [5, 6]])

a                                   #一维示例
# array([1, 2, 4, 3])
sess.run(tf.gather(a,[0,2]))
# array([1, 4])
  1. tf.transpose()
>>> a                         #2×3
array([[1, 2],
       [3, 4],
       [5, 6]])
>>> sess.run(tf.transpose(a,[1,0]))     #第一阶和第0阶交换,3×2
array([[1, 3, 5],
       [2, 4, 6]])

你可能感兴趣的:(tensorflow函数学习)