标签(空格分隔): 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σ)之外则重新进行选择。这样保证了生成的值都在均值附近。
- 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(可选),使用正则匹配
- 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都执行了
- 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])
- 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]])