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
    评论
导数在数学中是一个非常重要的概念,其在机器学习和深度学习中也扮演着至关重要的角色。TensorFlow作为一款流行的深度学习框架,在其2.x版本中提供了丰富的导数计算函数,本文将对TensorFlow 2.x中的导数计算进行详细的解析。 首先,TensorFlow中导数计算的核心就是“tf.GradientTape”函数,该函数记录执行的操作,并自动构建一个对应的计算图。在计算图中,我们可以根据需要定义一系列输入张量或者变量,并用这些对象进行复杂的计算。之后,再通过“tape.gradient”函数来计算导数。比如,在线性回归的例子中,我们可以将设计矩阵X和标签向量y作为输入张量,然后定义参数张量w,并对其进行计算。最后,我们用“tape.gradient”函数对w进行求导,即可得到损失对其的梯度。 除了上述基本实现之外,TensorFlow 2.x中还提供了丰富的导数计算函数,比如“tf.gradients”函数、自动微分工具“tf.autodiff”、高阶导数函数“tf.hessians”、方向导数函数“tf.custom_gradient”等等。这些函数可以根据用户的需要实现对导数的计算、控制求导的方式、实现高阶导数计算等等。在实际使用中,我们可以根据具体的需求选择使用不同的导数计算函数,比如在求解梯度下降法的过程中,我们可以根据需要计算一阶或二阶导数,也可以选择自动微分工具来实现快速又可靠的导数计算。 总之,TensorFlow 2.x中的导数计算是一个非常重要的功能,在深度学习的应用中起着至关重要的作用。通过使用不同的导数计算方法,我们可以实现对复杂模型参数的优化、实现高阶导数计算、实现特殊的导数控制等等功能。因此,熟练掌握TensorFlow 2.x中的导数计算函数是每一位深度学习从业者必备的能力。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值