章2 数据操作

2.2 数据操作


创建tensor

x = tf.rang(12)
x.shape
X = 
len(x)
X = tf.reshape(x,(3,4))
tf.zeros((2,3,4))
#也可以通过列表创建#
Y = tf.constant([[2,1,3,4],[3,4,1,2]])
#去掉外括号会生成error

随机生成元素

tf.random.normal(shape=[3,4],mean = 0,stddev = 1)
#均值为0,标准差为1的正态分布

支持的运算符

X+Y
X*Y
X/Y

数据类型转换,cast

Y = tf.cast(Y, tf.float32)
tf.exp(Y)

矩阵乘法matmul 和矩阵连结
低维拼接可理解为拿掉外面的括号,高维拿掉的是里面的

tf.matmul(X,tf.transpose(Y))


tf.concat([X,Y],axis = 0), tf.concat([X,Y],axis = 1)

equal()判断相同,reduce_sum()求和,norm()求范数


broadcasting 机制

当对两个形状不同的tensor按元素运算时,可能会触发广播(broadcasting)机制:先适当复制元素使这两个tensor形状相同后再按元素运算。
广播机制可以在两种情况下作用,一种是两个数组的维数不相等,但是它们的后缘维度的轴长相符(其实就是从后数的连续若干个维度数都相同),另外一种是有一方的长度为1(其实就是如果从后数有维度不同,但是维度大小为1时,广播机制同样可以发挥作用)。

A = tf.reshape(tf.constant(range(3)), (3,1))
B = tf.reshape(tf.constant(range(2)), (1,2))
A, B
A + B


“out”:
<tf.Tensor: id=46, shape=(3, 2), dtype=int32, numpy=
array([[0, 1],
       [1, 2],
       [2, 3]])>

indexing

根据索引修改元素
assign函数待解决

X = tf.Variable(X)
X[1,2].assign(9)
X[1:2,:].assign(tf.ones(X[1:2,:].shape, dtype = tf.float32)*12)

储存结果

在前面的例子里我们对每个操作新开内存来存储运算结果。举个例子,即使像Y = X + Y这样的运算,我们也会新开内存,然后将Y指向新内存。

如果想指定结果到特定内存,我们可以使用前面介绍的索引来进行替换操作。

Z = tf.Variable(tf.zeros_like(Y))
before = id(Z)
Z[:].assign(X + Y)
id(Z) == before

实际上,上例中我们还是为X + Y开了临时内存来存储计算结果,再复制到Z对应的内存。如果想避免这个临时内存开销,我们可以使用add函数。

Z = tf.add(X, Y)
id(Z) == before

trans between numpy

import numpy as np

P = np.ones((2,3))
D = tf.constant(P)
D

np.array(D)

总结

创建多维数组的方法:使用reshape函数变形,使用其他从创建开始,用concat拼接数组

作业

广播机制并不是所有情况下都奏效,只是理论上复制后覆盖成为可能时才奏效。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值