听它爹说他孩儿:Keras 学习笔记 3.3

神经网络的传动器:张量操作(运算)

深度学习神经网络转化数据的功能,可以简化成对数字数据张量极少的几个操作。例如,张量的加法、乘法等。

Keras 层的实例是这个样子:

keras.layers.Dense(512, activation='relu')

层可看成函数,它输入一个 2 维张量,输出另外一个 2 维张量。输出的张量是对输入张量的重新表示。这个函数如下所示:

output = relu(dot(W, input) + b)

 W 和 input 都是 2 维张量, b 是一矢量,它们都是层的属性。

进一步说,此处有 3 项张量操作:一是对输入张量 input 和 W 张量做点积(dot)运算;二是对点积运算的结果与矢量 b 做加法运算;三是进行 relu 操作。relu(x) 就是 max(x, 0)。

注意

虽然本节大量使用线性代数表达式,但你不会看到数学理论。我发现,如果用 Python 短小的代码段表达数学方程式,那么,没有数学背景的程序员可以更好地掌握数学概念。因此,我们全部用 Numpy 代码表达数学理论。

张量速算(Element-wise operations)
译者注:Element-wise 直译成“元素智能”,不知所云,是笨拙的翻译。

张量的 relu 操作及其加法、乘法等,是张量速算,即对张量的每个成员做平行运算,不使用 for 循环。

用 Numpy 可以飞快地进行张量速算。例如:

import numpy as np
# 2 个张量速算:
z=x+y
z = np.maximum(z, 0.)
传播(Broadcasting)
进行加法等运算的两个张量,如果形状尺寸不同怎么办?

在不产生歧义的前提下,小的张量将扩伸形状去匹配大的张量。扩伸分成两步进行:

  1. 小张量添加扩伸轴,以匹配大张量的轴数。
  2. 小张量延着新轴逐一匹配大张量的各个维度。

说个具体的例子。X 的形状是 (32, 10) ,y 是 (10,)。

首先,给 y 添加一空轴(没有成员), 使其形状成为 (1, 10)。

然后,沿此轴循环操作增加 32 维度,得到张量 Y 的尺寸(32, 10),而 Y[i, :] == y for i in range(0, 32)。

至此,可以对 X 和 Y 做加法运算,因为他们形状相同。

上述循环操作效率低下,只为解释方便,并不用于实际的算法实现。

下面的例子是以张量速算实现张量的传播:

import numpy as np
x = np.random.random((64, 3, 32, 10))
y = np.random.random((32, 10))
z = np.maximum(x, y) # z 的形状是 (64, 3, 32, 10)
张量的点积运算

点积运算,亦称张量乘法。别把它与张量速算的乘法弄混了。点积运算,是最普通、最有用的张量操作。张量速算的乘法是这样的: z = x * y 。Keras 的点积运算是这样的:

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

译者注:百度的结果,张量速算的乘法用于矩阵相乘,点积用于向量相乘。

两个向量 a = [ a1, a2,…, an ] 和 b = [ b1, b2,…, bn ] 的点积定义为:
a·b = a1b1 + a2b2 + …… + anbn。

张量的整形 reshape

张量整形,意味着重新安排它的行、列,以匹配目标的形状。张量的成员数目,在整形前后保持不变。

张量整形的一个特例是转置。矩阵的转置,就是其行列对换, x[i, :] 变成 x[:, i]:

>>> x = np.zeros((300, 20))
>>> x = np.transpose(x)
>>> print(x.shape)
(20, 300)








  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值