tensorflow2.x 张量排序

Sort/argsort

Sort : 对某一维度上的完全排序,返回一个排序后的 tensor
argsort :对某一维度上的完全排序,返回一个排序后tensor所对应的位置(索引)
参数:
direction:降序DESCENDING、升序ASCENDING
axis : 维度

# tf.sort() /  tf.argsort()
a = tf.random.shuffle(tf.range(5))#tf.random.shuffle()得到的是一个打乱后的tensor序列
print(a)
print(tf.sort(a, direction='DESCENDING'))#direction升序/降序,这里是降序
print(tf.argsort(a, direction='DESCENDING'))
idx = tf.argsort(a,direction='DESCENDING')
print(tf.gather(a, idx))#对索引进行收集,返回的是排序后的tensor
a = tf.random.uniform([3,3],maxval=10,dtype=tf.int32)
print(a)#均匀分布,为一个三行三列的 tensor
print(tf.sort(a))#默认是升序排列 行排列
print(tf.sort(a,axis=0))# 列排列
print((tf.argsort(a)))
tf.math.top_k()

tf.math.top_k()
参数:input, k=1, sorted=True, name=None
k 代表前k个,True表示正序

返回值为两个序列,一个values,对应排序后的前k个数的值;一个indices,对应排序后前k个数对应的索引

#tf.math.top_k()
a = tf.random.uniform([3,8],maxval=10,dtype=tf.int32)
print(a)
res = tf.math.top_k(a,k=2)#k默认为1,可以不写k=,直接写2,对饮排序后的前两个
print(res)
'''注意:a的值每次运行是不一样的
TopKV2(values=<tf.Tensor: shape=(3, 2), dtype=int32, numpy=
array([[9, 9],
       [9, 8],
       [5, 4]])>, indices=<tf.Tensor: shape=(3, 2), dtype=int32, numpy=
array([[3, 5],
       [3, 6],
       [6, 1]])>)
'''
print(res.indices)# indices 返回最大的和次大的对应的索引

print(res.values)# values 返回最大的和次大的值



top-k accuracy

???

# top-k accuracy
prob = tf.constant([[0.1,0.2,0.7],[0.2,0.7,0.1]])
target = tf.constant([2,0])
k_b = tf.math.top_k(prob,3).indices
print(k_b)
k_b = tf.transpose(k_b,[1,0])#转置
print(k_b)
target = tf.broadcast_to(target,[3,2])#扩张
print(target)

def accuracy(output,target,topk=(1,)) :
    maxk = max(topk)
    batch_size = target.shape[0]
    
    pred = tf.math.top_k(output,maxk).indices
    pred = tf.transpose(pred,perm=[1,0])
    target_ = tf.broadcast_to(target,pred.shape)
    correct = tf.equal(pred,target_)
    
    res = []
    for k in topk:
        correct_k = tf.cast(tf.reshape(correct[:k],[-1]),dtype=tf.float32)
        correct_k = tf.reduce_sum(correct_k)
        acc = float(correct_k / batch_size)
        res.append(acc)
        
    return res  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值