三、tensorflow进阶

(一) 合并与分割

  • 合并
# 1.拼接 tf.concat(tensors,axis),拼接并不创建新的维度
# 注意地方是非拼接维度必须一致
a = tf.random.normal([4,32,32,3])
b = tf.random.normal([2,32,32,3])
c = tf.concat([a,b],axis=0)
# 2.堆叠 tf.stack(tensors,axis),可以增减新的维度
a = tf.random.normal([2,2])
b = tf.random.normal([2,2])
c = tf.stack([a,b],axis=0)
# out:shape=(2,2,2)
# 注意:需要所有合并的张量维度一致。
  • 分割
# tf.split(x,axis,num_or_size_split)
# num_or_size_split 表示分割方案
# 当它为单个数值时,表示分割份数,当它是列表时,列表的长度表示切割份数,列表中每个元素表示每份分割长度。
x = tf.random.normal([32,32,4])
tf.split(x,axis=0,num_or_size_split=8)
# 进行不等长切割
tf.split(x,axis=0,num_or_size_split=[9,8,2])

(二) 数据统计

  • 向量范数

L1范数: ∣ ∣ x ∣ ∣ 1 = Σ i ∣ x i ∣ ||x||_1=\Sigma_i{|x_i|} x1=Σixi
L2范数: ∣ ∣ x ∣ ∣ 2 = Σ i ∣ x i ∣ 2 ||x||_2=\sqrt{\Sigma_i{|x_i|^2}} x2=Σixi2
∞ \infty -范数: ∣ ∣ x ∣ ∣ ∞ = m a x i ∣ x ∣ i ||x||_\infty=max_i{|x|_i} x=maxixi

# 可用tf.norm(x,ord)来求范数
a = tf.ones([2,2])
l1 = tf.norm(a,ord=1)
l2 = tf.norm(a,ord=2)
l3 = tf.norm(a,ord=np.inf)
  • 最大最小值,均值,和
# 1.最大值与最小值
x = tf.random.normal([32,32])
tf.reduce_max(x,axis=1)
tf.reduce_min(x,axis=0)
# 2.均值
tf.reduce_mean(x,axis=1)
# 3.求和
tf.reduce_sum(x,axis=1)
# 4.返回最大值最小值的索引
tf.argmax(x,axis=1)
tf.argmin(x,axis=1)
  • 张量比较
c = tf.equal(a,b)
# 返回布尔型,需要转化为浮点型或者整型
out = tf.cast(c,tf.float32)
correct_sum = tf.reduce_sum(out)

(三) 填充与复制

  • 填充(padding)
tf.pad(x,padding)
# padding是包含多个[left padding,rigth padding]
# 例如:[0,0],[1,1],[2,2]分别表示第1维不填充,第2为左右起始处与结尾处各填充1单元,第3维表示左右起始处与结尾处个填充2单元
a = tf.constant([1,2,3,4,5.,6])
b = tf.constant([7,8,9])
c = tf.pad(b,[[0,3]])
#即表示b末尾处填充3个单元
  • 复制
x = tf.random.normal([3,32,32,4])
y = tf.tile(x,[2,3,2,1])
# 表示x第1维度复制1份,第2维度复制2份,第3维度复制1份,第4维度不复制。

(四) 数据限幅

  • 上限
tf.minimum(x,a)
  • 下限
tf.maximum(x,a)

*上下限

tf.clip_by_value(x,a,b)

(五) 高级操作

  • 根据索引号收集数据
a = tf.random.uniform([4,35,8],maxval=100,dtype=tf.int32)
# 说明:4代表4个班级,35代表学生个数,8代表科目个数
# 1.规则索引:收集1~2班的成绩
tf.gather(a,[0,1],axis=0)
# 2.不规则索引:收集2,34,23,,24号学生的成绩
tf.gather(a,[1,33,22,23],axis=1)
# 3.收集第5,8科目的成绩
tf.gather(a,[4,7],axis=2)
# 4.问题更复杂一些,比如,收集第2,3个班级的12,23,26,号同学的第4,5,6门科目
class_ = tf.gather(a,[1,2],axis=0)
students = tf.gather(class_,[11,22,25],axis=1)
subjects = tf.gather(students,[3,4,5],axis=2) 
  • 指定坐标采取样本点

通过 tf.gather_nd,可以通过指定每次采样的坐标来实现采样多个点的目的.
回到上面的挑战,我们希望抽查第 2 个班级的第 2 个同学的所有科目,第 3 个班级的第 3 个同学的所有科目,第 4 个班级的第 4 个同学的所有科目。 那么这 3 个采样点的索引坐标可以记为:[1,1], [2,2], [3,3], 我们将这个采样方案合并为一个 List 参数: [[1,1], [2,2], [3,3]]

tf.gather_nd(a,[[1,1],[2,2],[3,3]]
  • 通过给定掩码(mask)的方式采样,tf.boolean_mask(x,mask)
# 比如采取第2,3班级成绩
tf.boolean_mask(a,mask=[False,True,True,False],axis=0)
# 多维采集,收集第1班的0-1,第2班的2-3
x = tf.random.uniform([2,3,8],maxval=100,dtype=tf.int32)
tf.boolean_mask(x,mask=[[True,True,False],[Fasle,True,True]])
# 等价于
tf.gather_nd([[0,0],[0,1],[1,1],[1,2]])
  • tf.where
    tf.where(conditions,a,b)
# 假设我们需要提取数据中所有正数的索引
a = tf.random.normal([3,3],dtype=tf.float32)
mask = x>0
indices = tf.where(mask)
tf.gather_nd(x,indices)
# or
tf.boolean_mask(x,indices)
  • tf.scatter_nd(indices,updates,shape)
    在这里插入图片描述
    图片援引《tensorflow2深度学习》
# 1.构造需要刷新的位置
indices = tf.constant([4],[3],[1],[7])
# 2.构造需要新写入的数据
new_data = tf.constant([3.,2.,3.,5.])
# 3.在长度为8的全0向量上根据indices刷新
tf_scatter_nd(indices,new_data,[8])

在这里插入图片描述

# 1.构造写入位置
indices = tf.constant([[1],[3]])
# 2.构造新数据
updates = tf.constant([# 构造写入数据
[[5,5,5,5],[6,6,6,6],[7,7,7,7],[8,8,8,8]],
[[1,1,1,1],[2,2,2,2],[3,3,3,3],[4,4,4,4]]
]
# 3.在shape=(4,4,4)的
tf.scatter_nd(indices,updates,[4,4,4])
  • meshgrid
    在这里插入图片描述
    在这里插入图片描述
    图片来源于<tensorflow2深度学习>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值