第五章、TensorFlow进阶(5.1-5.3)

5.1合并与分割

5.1.1合并

拼接:tf.concat(tensors,axis)
特点:①非合并维度的长度必须相同
②不会产生新的维度

a = tf.random.normal([4,35,8]) # 模拟成绩册 A
b = tf.random.normal([6,35,8]) # 模拟成绩册 B
tf.concat([a,b],axis=0) # 拼接合并成绩册

堆叠:tf.stack(tensors, axis)
特点:①所有待合并的张量 shape 完全一致
②会产生新的维度
axis:当axis ≥ 0时,在 axis之前插入;当axis < 0时,在 axis 之后插入新维度

a = tf.random.normal([35,8])
b = tf.random.normal([35,8])
tf.stack([a,b],axis=0)#shape=(2, 35, 8)
#末尾插入班级维度
a = tf.random.normal([35,8])
b = tf.random.normal([35,8])
tf.stack([a,b],axis=-1) # 在末尾插入班级维度

5.1.2分割

tf.split(x,num_or_size_splits,axis)
x参数:待分割张量
num_or_size_splits参数:10,平均切割10份;[2,4,2,2],切割四份,长度依次为2、4、2、2
axis:指定分割的维度索引号

5.2数据统计

5.2.1向量范数

三个范数的公式
tf.norm(x,ord)求解三个范数。ord 指定为 1、2 时计算 L1、L2 范数,指定为 np.inf 时计算∞ −范数。

5.2.2最值、均值、和、索引号

通过 tf.reduce_max、tf.reduce_min、tf.reduce_mean、tf.reduce_sum 函数可以求解张量
在某个维度上的最大、最小、均值、和,也可以求全局最大、最小、均值、和信息。
考虑 shape 为[4,10]的张量,其中,第一个维度代表样本数量,第二个维度代表了当前
样本分别属于 10 个类别的概率,需要求出每个样本的概率最大值为,可以通过
tf.reduce_max 函数实现:

x = tf.random.normal([4,10]) # 模型生成概率
tf.reduce_max(x,axis=1) # 统计概率维度上的最大值
#numpy=array([1.2410722 , 0.88495886, 1.4170984 , 0.9550192 ]

除了最大值还可以求最小值、均值,代码类似,不做赘述。
当不指定 axis 参数时,tf.reduce_*函数会求解出全局元素的最大、最小、均值、和等
数据。也就是说只输出一个值。

在求解误差函数时,通过 TensorFlow 的 MSE 误差函数可以求得每个样本的误差,需
要计算样本的平均误差,此时可以通过 tf.reduce_mean 在样本数维度上计算均值,实现如
下:

out = tf.random.normal([4,10]) # 模拟网络预测输出
y = tf.constant([1,2,2,0]) # 模拟真实标签
y = tf.one_hot(y,depth=10) # one-hot 编码
loss = keras.losses.mse(y,out) # 计算每个样本的误差
loss = tf.reduce_mean(loss) # 平均误差,在样本数维度上取均值

还有求和函数:tf.reduce_sum()

除了获取最值信息,有时还需要获取最值所在的索引号。

out = tf.random.normal([2,10])
out = tf.nn.softmax(out, axis=1) # 通过 softmax 函数转换为概率值

通过 tf.argmax(x, axis)和 tf.argmin(x, axis)可以求解在 axis 轴上,x 的最大值、最小值所
在的索引号,例如:

pred = tf.argmax(out, axis=1) # 选取概率最大的位置
# numpy=array([0, 0]

5.3张量比较

out = tf.random.normal([100,10])
out = tf.nn.softmax(out, axis=1) # 输出转换为概率
pred = tf.argmax(out, axis=1) # 计算预测值
# 模型生成真实标签
y = tf.random.uniform([100],dtype=tf.int64,maxval=10)

通过 tf.equal(a, b)(或 tf.math.equal(a, b),两者等价)函数可以比较这 2 个张量是否相等,即可获得代表每个样本是否预测正确的布尔类型张量。

out = tf.equal(pred,y) # 预测值与真实值比较,返回布尔类型的张量

tf.equal()函数返回布尔类型的张量比较结果,只需要统计张量中 True 元素的个数,即可知
道预测正确的个数。将Boolean型转为整型。

out = tf.cast(out,dtype=tf.float32)#将布尔型转为int型
correct = tf.reduce_sum(out)#统计TRUE的个数

除了相等的比较函数,还有其他的比较函数,如下图所示。
其他的比较函数

预测准确度计算代码

import  tensorflow as tf
import  os
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'
#全局设置tf.set_random_seed()函数,使用之后后面设置的随机数都不需要设置seed,而可以跨会话生成相同的随机数。
tf.random.set_seed(2467)#设置全局随机种子
def accuracy(output, target, topk=(1,)):
    maxk = max(topk)#topk = (1,2,3,4,5,6),maxk=6
    batch_size = target.shape[0]# batch_size的值为10
    # print(target.shape)#(10,)
    # 查找最后一个维度的 k 最大条目的值和索引。indices
    pred = tf.math.top_k(output, maxk).indices# 获得每个样本最符合的前maxk=6个类别的索引 (10,6)
    # print('pred1:',pred)
    # print('pred2:',tf.math.top_k(output, maxk))
    pred = tf.transpose(pred, perm=[1, 0])#本来的位置是[0,1],现在两列对调变为[1,0]。(6,10)
    target_ = tf.broadcast_to(target, pred.shape)# 将真实类别广播到相同大小的矩阵,方便比较  (6,10)
    # [10, b]
    correct = tf.equal(pred, target_) # 得到一个由True和False组成的(6,10)的矩阵
    res = []# 这是要返回的精确值
    for k in topk:
        #  计算前k行的所有1的和,所有预测对的值
        correct_k = tf.cast(tf.reshape(correct[:k], [-1]), dtype=tf.float32)#把correct[:k]变成一维向量,方便后面求和
        correct_k = tf.reduce_sum(correct_k)
        acc = float(correct_k* (100.0 / batch_size) )
        res.append(acc)

    return res
    
output = tf.random.normal([10, 6])
output = tf.math.softmax(output, axis=1)#归一化
target = tf.random.uniform([10], maxval=6, dtype=tf.int32)
print('prob原始数据:', output.numpy())
pred = tf.argmax(output, axis=1)#十个样本预测类别
print('pred预测类别:', pred.numpy())
print('label实际类别:', target.numpy())

acc = accuracy(output, target, topk=(1,2,3,4,5,6))
print('top-1-6 acc:', acc)


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值