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拼接数组
作业
广播机制并不是所有情况下都奏效,只是理论上复制后覆盖成为可能时才奏效。

3039

被折叠的 条评论
为什么被折叠?



