基于TensorFlow的深度学习(5)


写在前面:本次实验是在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()

  • 作用:张量转置
  1. 一般情况的转置
    在这里插入图片描述

  2. 如果要确定哪些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

  • 张量维度扩张的手段,但是没有在数据层面上的复制。
    是一种数据优化的手段。高效且直观。
    默认是小维度对齐(右边对齐)
  1. [4,32,14,14] 和 [2,32,14,14] 是不能broadcasting的
  2. [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,不能扩张。

代码练习

  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])
  1. [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]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值