初学Tensorflow|Day2

一、张量操作

1.索引

直接通过维度编号进行索引

t=tf.constant([[1,2,3,4,5],[6,7,8,9,10]])
a=t[0]
print(a)
print(t[0][1])

2.切片

采用[start:end:step]进行切片,从start开始到end-1结束,包含start但不包含end,且步长为step,即间隔一个step进行取数操作

t=tf.constant([[1,2,3,4,5],[6,7,8,9,10],[1,3,5,7,9],[2,4,6,8,10],[1,3,2,5,4]])
print(t[1:4:2])
#tf.Tensor(
#[[ 6  7  8  9 10]
# [ 2  4  6  8 10]], shape=(2, 5), dtype=int32)
print(t[1,1:4:2])
#输出第二组数据[6,7,8,9,10]中的满足要求的数
#tf.Tensor([7 9], shape=(2,), dtype=int32)

3.维度变换

3.1 tf.reshape(tensor,shape,name=None)

传入要变换的张量tensor以及要调整的形状shape

a=tf.range(24)
b=tf.reshape(a,[2,3,4])
print(a)
print(b)

3.2 tf.expand_dims(input,axis)

在索引处插入一个1的维度,如axis=0,则在[2,3]中的索引位置为0的地方置成1;若为负数,则从最后一个数开始向前计数。

t=[[1,2,3],[4,5,6]]#shape[2,3]
t1=tf.expand_dims(t,axis=0)#[1,2,3]
t2=tf.expand_dims(t,axis=1)#[2,1,3]
t3=tf.expand_dims(t,axis=2)#[2,3,1]
t4=tf.expand_dims(t,axis=-3)#[1,2,3]
t5=tf.expand_dims(t,axis=-2)#[2,1,3]
t6=tf.expand_dims(t,axis=-1)#[2,3,1]

3.3 tf.squeeze(input,axis)

删除维度为1的索引号,若不指定axis,则默认删除所有维度1的索引号

t=tf.range(6)
t1=tf.reshape(t,[1,2,1,3,1])
t2=tf.squeeze(t1,0)#[2,1,3,1]
print(t2)

3.4 tf.transpose(x,perm)

利用索引来完成维度变换,perm表示新维度的顺序,将原来的索引顺序调换。

t=tf.random.normal([2,3,4,5])
t1=tf.transpose(t,perm=[3,1,2,0])
print(t1)#[5,3,4,2]

4.合并

tf.concat(tensors,axis),axis为需要合并的维度,为1时,表示在第二个括号内的维度进行合并。不会增加新维度

a=tf.constant([[1,2,3],[4,5,6]])
b=tf.constant([[7,8,9],[10,11,12]])
c1=tf.concat([a,b],0)#[4,3]
print(c1)
c2=tf.concat([a,b],1)#[2,6]
print(c2)

tf.stack(tensors,axis)会改变维度,axis为1时,表示在第一个括号内的维度进行合并,即[1,2,3]

a=tf.constant([[1,2,3],[4,5,6],[3,4,5]])
b=tf.constant([[7,8,9],[10,11,12],[5,6,7]])
c=tf.stack([a,b],2)#[3,3,2]
d=tf.stack([a,b],1)#[3,2,3]
e=tf.stack([a,b])#[2,3,3]

5.分割

tf.unstack(tensors,num,axis),将tensor根据axis分解成num个张量,返回list类型

a=tf.constant([[1,2,3],[4,5,6]])
b=tf.constant([[7,8,9],[10,11,12],[5,6,7]])
c=tf.unstack(a,axis=0)
print(c)#两个数组[1,2,3],[4,5,6]
d=tf.unstack(a,axis=1)
print(d)#三个数组[1,4],[2,5],[3,6]

tf.split(tensor,num,axis),axis为指定分割的维度索引号,num为对应维度上的元素的个数

x=[[1,2,3],[4,5,6]]#[2,3]
print(tf.split(x,3,1))
#每个张量shape=[2,1],元素为[[1],[4]],[[2],[5]],[[3],[6]]

6.统计

6.1范数

使用tf.norm(x,ord)求解张量的范数,ord为1,2时计算L1,L2范数,为np.inf计算∞ −范数

0范数:向量中非零元素的个数

1范数:向量中各个元素绝对值之和

2范数:向量中各个元素平方和的1/2次方

                                  定义p范式:                   

无穷范数:向量中最大元素的绝对值                  

x=tf.ones([3,3])
L1=tf.norm(x,ord=1)#9.0
L2=tf.norm(x,ord=2)#3.0
L3=tf.norm(x,ord=np.inf)#1.0

6.2最值、均值

tf.math.reduce_min(
    input_tensor, axis=None, keepdims=False, name=None
)#求axis维度上的最小值
tf.math.reduce_max(
    input_tensor, axis=None, keepdims=False, name=None
)#求axis维度上的最大值
tf.math.reduce_mean(
    input_tensor, axis=None, keepdims=False, name=None
)#求axis维度上的均值
x = tf.random.normal([3,3])
#统计最大值
max=tf.reduce_max(x,axis=0)
#统计最小值
min=tf.reduce_min(x,axis=1)
# 统计均值
mean=tf.reduce_mean(x,axis=1)

7.张量比较

可以用于比较预测结果与真实标签,从而计算准确率。

tf.equal(a,b),返回true元素的个数即可获得相等的数量,再将其转换成(tf.cast)整型张量0和1,再求和(tf.reduce_sum)得到1的个数。


pre_out=tf.convert_to_tensor(np.array([[1,3,4,2,3,6,7,8,9,3,4,5,4]])) 
label=tf.convert_to_tensor(np.array([[1,7,4,2,3,6,7,3,9,7,4,2,4]])) 
# 预测值与真实值比较 
acc=tf.equal(pre_out,label) 
print("acc is: {}".format(acc))
 # 布尔型转 int 型
acc = tf.cast(acc, dtype=tf.float32)
# 统计 True 的个数 
correct = tf.reduce_sum(acc)
print("correct is: {}".format(correct))

tf.math.greater( x, y, name=None)

8.填充和复制

8.1填充

tf.pad(tensor,paddings,mode="CONSTANT",constant_values=0)对tensor的大小进行扩展,包括水平、垂直、深度,panddings为设置填充的大小,mode填充方式CONSTANT--填充0,REFLECT--映射填充,SYMMETRIC对称填充

a=tf.fill([3,3],2)
print(a)
print(tf.pad(a,[[2,1],[2,3]]))
#tf.Tensor(
#[[0 0 0 0 0 0 0 0]
#[0 0 0 0 0 0 0 0]
#[0 0 2 2 2 0 0 0]
#[0 0 2 2 2 0 0 0]
#[0 0 2 2 2 0 0 0]
#[0 0 0 0 0 0 0 0]
#[0 0 0 0 0 0 0 0]
#[0 0 0 0 0 0 0 0]], shape=(8, 8), dtype=int32)

paddings中第一个即[2,1]表示第一维也就是矩阵的行,左边的2表示上方放2行0,下方放1行0 ;同理第二个[2,3]表示第二维,也就是矩阵的列,左边的2表示左边加2列0,右边加3列0。

8.2复制

tf.tile(tensors,multiples)完成数据在指定维度上的复制,multiples要分别指定每个维度上的复制倍数,[2,1]表示在axis=0维度上复制一次,在axis=1上不复制

a=tf.constant([[1,2],[4,5]])
b=tf.tile(a,multiples=[2,1])
print(b)
#tf.Tensor(
#[[1 2]
#[4 5]
#[1 2]
#[4 5]], shape=(4, 2), dtype=int32)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值