文章目录
写在前面:本次实验是在Pycharm里面的console写的,方便交互。
1 维度变换
1.1 tf.reshape()
- 作用:重塑张量维度
tf.reshape(a, [4,-1, 3]).shape
这里的shape表示的是,直接去计算中间-1代表的数值
因为这里的元素个数是一样的,即这些数乘积相同
4*28*28*3=4*()*3
计算机可以直接求得-1位置的值,即784
- 还可以非常的灵活:
# 套娃
# 内层的reshape函数先将a变成[4,2352]
# 外层的reshape函数再将a变成[4,14,56,3]
tf.reshape(tf.reshape(a,[4,-1]),[4,14,56,3]).shape
Out[52]: TensorShape([4, 14, 56, 3])
1.2 tf.transpose()
- 作用:张量转置
-
一般情况的转置
-
如果要确定哪些axis进行转变
tf.transpose(a,perm=[0,1,3,2]).shape
Out[56]: TensorShape([4, 3, 1, 2])
一个小实例
- [b,3,h,w]pytorch的格式
- [b,h,w,3]tensorflow的格式
改变之后,这个数据格式就能被pytorch所接受!
1.3 tf.expand_dims()
- 作用:增加axis
a=tf.random.normal([4,35,8])
# 在不同的位置上增加轴
tf.expand_dims(a,axis=0).shape
Out[63]: TensorShape([1, 4, 35, 8])
tf.expand_dims(a,axis=3).shape
Out[64]: TensorShape([4, 35, 8, 1])
tf.expand_dims(a,axis=-1).shape
Out[65]: TensorShape([4, 35, 8, 1])
1.4 tf.squeeze_dim
- 作用:仅仅去掉shape=1的那个维度
tf.squeeze(tf.zeros([1,2,1,1,3])).shape
Out[67]: TensorShape([2, 3])
- 可以用axis来指定某一个维度为1 的
a=tf.zeros([1,2,1,3])
tf.squeeze(a,axis=2).shape
Out[69]: TensorShape([1, 2, 3])
tf.squeeze(a,axis=-2).shape
Out[70]: TensorShape([1, 2, 3])
tf.squeeze(a,axis=-4).shape
Out[71]: TensorShape([2, 1, 3])
1.5 tf.broadingcasting
- 张量维度扩张的手段,但是没有在数据层面上的复制。
是一种数据优化的手段。高效且直观。
默认是小维度对齐(右边对齐)
- [4,32,14,14] 和 [2,32,14,14] 是不能broadcasting的
- [14,14] 和 [4,32,14,14] 可以broadcasting的,只需要复制一下大两维的数据
判断是否能broadcasting
-
规则:
1、从最低维开始匹配(右边是小维度)
2、如果当前维度dim=1,则向大的扩张;
3、如果没有当前维度,则插入一个维度,再进行1中的扩张;
4、否则,不能broadcasting。 -
例1
[4,32,14,14] + [1,32,1,1] 可以broadcasting
过程:
[1,32,1,1] → [1,32,1,14] → [1,32,14,14] → [4,32,14,14] -
例2
[4,32,14,14] + [14,14] 可以broadcasting
[14,14] ——> [32,14,14] ——> [4,32,14,14] -
例3
[4,32,14,14] + [2,32,14,14]
不能broadcasting
因为4≠2且不是1,不能扩张。
代码练习
- [4,32,32,3] + [3]
x=tf.random.normal([4,32,32,3])
(x+tf.random.normal([3])).shape
Out[6]: TensorShape([4, 32, 32, 3])
- [4,32,32,3] +[2,32,32,3]
x=tf.random.normal([4,32,32,3])
(x+tf.random.normal([2,32,32,3])).shape
# 报错信息
tensorflow.python.framework.errors_impl.InvalidArgumentError: Incompatible shapes: [4,32,32,3] vs. [2,32,32,3] [Op:AddV2]
2 数学运算
- /+ - * 元素级别的 加减乘除
- @, matmul 数组级别的
- reduce_maven 对于某个维度
2.1 元素级别的运算
b=tf.fill([2,2],2.)
a=tf.ones([2.2])
创建两个两行两列的数组,第一个元素全为2. 第二个元素全为1.(float)
可以输出来看一下: 尤其注意shape、dtype、以及类型,这里都是numpy类型的
2.1.1 加减乘除、乘除余除
(注意:加减乘除都是对应元素的加减乘除)
- 输出一下// 和 % (整除和余除)的结果
2.1.2 求log函数和e次方
-
log
e
(
)
\log_e()
loge() 函数
这里也是对元素进行运算,由于a是两行两列的1的一个数组,所以运算过后会得到一个全0 的数组。
注意:算以其他数为底的log,只能使用换底公式!
-
e
x
e^x
ex 的计算
注意:两个函数的层级不一样。
2.1.3 计算幂次方和开方
- 幂次方有两种
tf.pow(b,3)
b**3
- tf.sqrt()求平方
2.2 矩阵维度的运算
- 矩阵的叉乘
两种写法:@和tf.matmul()
- 高维的tensor去计算matmul
解释:先是后面两维叉乘,[2,3]和[3,5] 这个操作是可以并行的,最后可以得到[1,2,5]