深度学习-10-前向传播(张量)
import tensorflow as tf from tensorflow import keras from tensorflow.keras import datasets import os os.environ[‘TF_CPP_MIN_LOG_LEVEL’] = ‘2’ # x: [60k, 28, 28], # y: [60k] (x, y), _ = …
import tensorflow as tf from tensorflow import keras from tensorflow.keras import datasets import os os.environ[‘TF_CPP_MIN_LOG_LEVEL’] = ‘2’ # x: [60k, 28, 28], # y: [60k] (x, y), _ = …
常用的数学运算:
操作类型:
@用于矩阵乘法,是多个矩阵并行计算的过程[b,3,4]@[b,4,5]
dim-wise是对某个维度进行计算,如对某个维度进行求和等等
+-*/%//
exp log
exp只能是以e为底要以其他系数为底则需要组合
pow sqrt
@ matmul
会将后面两维当成矩阵来计算,前一个当成batch来并行计算
broadcasting
两个很重要的概念:
Broadcasting是一个向量维度扩张的手段,对某个维度重复多次但是没有真正的复制数据,可以理解是一种优化的手段,没有复制数据但是维度被扩张了(不会占用更多的内存)。
之前在线性回归中我们使用了
X@W + b
即:[b, 784] @ [784, 10] + [10]
=> [b, 10] + [10]
这个时候我们发现这两个矩阵不能够直接进行运算,这个时候就可以使用broadcasting来扩张[10]这个向量的维度到[b, 10]使其能够进行计算
因此:当两个tensor的维度不一致的时候我们就可以使用broadcasting使其能够进行数学计算
理解这张图就理解了broadcasting的运算方式:
在实际操作中,我们一般会先给一个小维度的概念,然后大维度进行要加上小维度的数据比如[classes, student, scores] + [scores],因此在这个例子中即使score没有班级、学校的概念,仍然可以对所有的score进行计算。所以这样我们就可以对一些小维度的数据进行计算了。
Broadingcast其实我们可以使用expand dim来添加维度,那么为什么我们要使用broadcasting呢?主要是简单,并且这样可以有一个高维度和低维度的概念,而不是为了进行计算把一些数据的维度手动的提升,另一方面broadcasting不需要扩展内存,因此可以节省大量的内存空间。
其运行过程可以理解为先插入一个维度,然后在把维度进行扩展,如果维度已经是1那么直接进行扩展(复制)
需要注意的是broadingcast是从右边小维度向左边匹配的,并且dim必须是1或者不存在才能够把维度进行扩张
在进行运算的时候会自动boradingcast 可以不用调tf.broadingcast_to
显式的进行扩展
复杂一点
tf,tile后面矩阵的参数代表维度重复的次数,利用这种方式结合expand_dim也可以实现同样的效果,但是麻烦并且会占用额外的内存
一个tensor有shape和ndim的概念,shape也就是[b,28,28,1],每个代表一个轴,我们把第一个轴理解为batch,第二个轴理解为height,第三个轴理解为width,第四个轴理解为channel。我们把这个原始的数据成为conte…