神经网络的数学基础:张量运算

回顾上一篇 神经网络的数学基础 :张量和梯度
通过上一篇的内容,我们知道了张量表示神经网络中的数据,那么数据在网络中流动必然要经过各种运算或者叫做处理,这一系列的处理就是达到最终结果的过程。可以形象把中间的变换称为神经网络的“齿轮”,或者叫做张量运算。就像二进制运算有逻辑与(AND),或(OR),异或(NOR)一样,张量运算有以下几种:

  1. 逐元素运算
  2. 张量点积
  3. 广播
  4. 张量变形
1. 逐元素运算

relu运算和加法(减法)都是逐元素(element-wise)的运算,即该运算独立地应用于张量中的每个元素。如果你想对逐元素运算编写简单的Python 实现,那么可以用for循环,但是一般都使用Numpy封装好的函数,这也是Numpy功能强大的一个原因。示例:

>>> import numpy as np
>>> x = np.array([[1,2,3],[4,5,6]])
>>> x.shape
(2, 3)
>>> y = np.array([[1,1,1],[2,2,2]])
>>> y.shape
(2, 3)
>>> z = x + y
>>> z
array([[2, 3, 4],
       [6, 7, 8]])
>>> z.shape
(2, 3)
>>> z = x - y
>>> z
array([[0, 1, 2],
       [2, 3, 4]])
>>> z.shape
(2, 3)
>>> z = y - x
>>> z
array([[ 0, -1, -2],
       [-2, -3, -4]])
>>> z.shape
(2, 3)
2. 张量点积

点积运算,也叫张量积(tensor product,不要与逐元素的乘积弄混),是最常见也最有用的张量运算。与逐元素的运算不同,它将输入张量的元素合并在一起。
在Numpy、Keras、Theano 和TensorFlow 中,都是用* 实现逐元素乘积。TensorFlow 中的点积使用了不同的语法,但在Numpy 和Keras 中,都是用标准的dot 运算符来实现点积。

import numpy as np
z = np.dot(x, y)

数学符号中的点(.)表示点积运算。
z=x.y

示例如下:

>>> import numpy as np
>>> x = np.array([[1,2,3],[4,5,6]])
>>> x.shape
(2, 3)
>>> y = np.array([[1,1,1],[2,2,2],[3,3,3]])
>>> y.shape
(3, 3)
>>> z = np.dot(x,y)
>>> z
array([[14, 14, 14],
       [32, 32, 32]])
>>> z.shape
(2, 3)
3. 广播

上一节所说的加减法仅支持两个形状相同的张量相加。如果将两个形状不同的张量相加,会发生什么?如果没有歧义的话,较小的张量会被广播(broadcast),以匹配较大张量的形状。广播包含以下两步。
(1) 向较小的张量添加轴(叫作广播轴),使其ndim 与较大的张量相同。
(2) 将较小的张量沿着新轴重复,使其形状与较大的张量相同。

举例,下图可以形象说明广播是怎么进行的。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

科技与文明

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值