**
一 sort argsort排序
**
tf.sort( )按照升序或者降序对张量进行排序
tf.argsort( )按照升序或者降序对张量进行排序,但返回的是索引
In [4]: a = tf.range(5)
In [5]: a
Out[5]: <tf.Tensor: id=3, shape=(5,), dtype=int32, numpy=array([0, 1, 2, 3, 4], dtype=int32)>
In [7]: a = tf.random.shuffle(a) #打乱张量的顺序
In [8]: a
Out[8]: <tf.Tensor: id=5, shape=(5,), dtype=int32, numpy=array([1, 2, 0, 3, 4], dtype=int32)>
In [9]: tf.sort(a,direction='DESCENDING') #按照降序进行排列
Out[9]: <tf.Tensor: id=15, shape=(5,), dtype=int32, numpy=array([4, 3, 2, 1, 0], dtype=int32)>
In [10]: tf.sort(a,direction='ASCENDING') #按照升序进行排列
Out[10]: <tf.Tensor: id=29, shape=(5,), dtype=int32, numpy=array([0, 1, 2, 3, 4], dtype=int32)>
In [11]: idx_d = tf.argsort(a,direction = 'DESCENDING')#按照降序排列,并返回索引
In [12]: idx_d
Out[12]: <tf.Tensor: id=40, shape=(5,), dtype=int32, numpy=array([4, 3, 1, 0, 2], dtype=int32)>
In [13]: idx_a = tf.argsort(a,direction = 'ASCENDING') #按照升序排列,并返回索引
In [14]: idx_a
Out[14]: <tf.Tensor: id=52, shape=(5,), dtype=int32, numpy=array([2, 0, 1, 3, 4], dtype=int32)>
In [15]: tf.gather(a,idx_a)
Out[15]: <tf.Tensor: id=55, shape=(5,), dtype=int32, numpy=array([0, 1, 2, 3, 4], dtype=int32)>
In [16]: tf.gather(a,idx_d)
Out[16]: <tf.Tensor: id=58, shape=(5,), dtype=int32, numpy=array([4, 3, 2, 1, 0], dtype=int32)>
In [17]: a = tf.random.uniform([3,3],minval=1,maxval=10,dtype=tf.int32)
In [18]: a
Out[18]:
<tf.Tensor: id=63, shape=(3, 3), dtype=int32, numpy=
array([[1, 7, 5],
[4, 5, 4],
[6, 9, 5]], dtype=int32)>
In [19]: tf.sort(a,direction='ASCENDING')
Out[19]:
<tf.Tensor: id=76, shape=(3, 3), dtype=int32, numpy=
array([[1, 5, 7],
[4, 4, 5],
[5, 6, 9]], dtype=int32)>
In [20]: tf.sort(a,direction='DESCENDING')
Out[20]:
<tf.Tensor: id=86, shape=(3, 3), dtype=int32, numpy=
array([[7, 5, 1],
[5, 4, 4],
[9, 6, 5]], dtype=int32)>
In [21]: idx_a = tf.argsort(a,direction='ASCENDING')
In [22]: idx_a
Out[22]:
<tf.Tensor: id=99, shape=(3, 3), dtype=int32, numpy=
array([[0, 2, 1],
[0, 2, 1],
[2, 0, 1]], dtype=int32)>
In [23]: idx_d = tf.argsort(a,direction='DESCENDING')
In [24]: idx_d
Out[24]:
<tf.Tensor: id=110, shape=(3, 3), dtype=int32, numpy=
array([[1, 2, 0],
[1, 0, 2],
[1, 0, 2]], dtype=int32)>
**
二 top_k函数
**
tf.math.top_k( )返回前k个最大值
In [27]: a = tf.random.uniform([3,3],minval=0,maxval=10,dtype=tf.int32)
In [28]: a
Out[28]:
<tf.Tensor: id=119, shape=(3, 3), dtype=int32, numpy=
array([[3, 2, 5],
[1, 6, 5],
[8, 0, 6]], dtype=int32)>
In [29]: res = tf.math.top_k(a,2)#前2个最大值
In [30]: res.indices #前2个最大值索引
Out[30]:
<tf.Tensor: id=123, shape=(3, 2), dtype=int32, numpy=
array([[2, 0],
[1, 2],
[0, 2]], dtype=int32)>
In [31]: res.values #前2个最大值
Out[31]:
<tf.Tensor: id=122, shape=(3, 2), dtype=int32, numpy=
array([[5, 3],
[6, 5],
[8, 6]], dtype=int32)>
In [32]: res
Out[32]:
TopKV2(values=<tf.Tensor: id=122, shape=(3, 2), dtype=int32, numpy=
array([[5, 3],
[6, 5],
[8, 6]], dtype=int32)>, indices=<tf.Tensor: id=123, shape=(3, 2), dtype=int32, numpy=
array([[2, 0],
[1, 2],
[0, 2]], dtype=int32)>)
**
三 top_k预测准确度
**
import tensorflow as tf
def accuracy(output,target,topk=(1,)):
maxk = max(topk)#返回topk的最大值
batch_size = target.shape[0]
pred = tf.math.top_k(output,k=maxk).indices#返回maxk个最大的索引
pred = tf.transpose(pred)#转置
target_ = tf.broadcast_to(target,shape=pred.shape)
correct = tf.equal(pred,target_)
res = []#返回maxk个精确度
for k in topk:
correct_k = correct[:k,:]#只需要前k行的数据即可
correct_k = tf.reduce_sum(tf.cast(correct_k,dtype=tf.float32))#对预测准确的进行计数
acc = float(correct_k/batch_size)
res.append(acc)
return res
import tensorflow as tf
from top_k_a import *
output = tf.constant([[0.1,0.2,0.7],[0.3,0.4,0.3],[0.9,0.04,0.06]])
target = tf.constant([2,0,1])
res = accuracy(output,target,topk=(1,2,3))
print(res)
[0.3333333432674408, 0.6666666865348816, 1.0]