Tensor dot (张量点)

点运算,也称为张量积(不要与元素积混淆)是最常见、最有用的张量运算。与元素操作相反,它组合了输入张量中的项。使用Numpy、Keras、Theano和TensorFlow中的*操作符完成元素的乘积。在TensorFlow中,点使用了不同的语法,但在Numpy和Keras中,它都使用了标准的点操作符:
import numpy as np
z = np.dot(x, y)
在数学符号中,你可以用点(.)来标记操作:
z = x . y
从数学上讲,点运算有什么作用?让我们从两个向量x和y的点积开始,它的计算方法如下:

def naive_vector_dot(x, y):
    assert len(x.shape) == 1
    assert len(y.shape) == 1
    assert x.shape[0] == y.shape[0]
    z = 0  .
    for i in range(x.shape[0]):
        z += x[i] * y[i]
    return z

您将注意到,两个向量之间的点积是一个标量,并且只有元素数量相同的向量才适用于点积。你也可以取矩阵x和向量y之间的点积,这将返回一个向量,其中的系数是y和x行之间的点积。你可以这样实现它:

import numpy as np
def naive_matrix_vector_dot(x, y):
    assert len(x.shape) == 2
    assert len(y.shape) == 1
    assert x.shape[1] == y.shape![\[](https://img-blog.csdnimg.cn/20210314155638896.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0lUR0lSTG5vMQ==,size_16,color_FFFFFF,t_70)

    z = np.zeros(x.shape[0])
    for i in range(x.shape[0]):
        for j in range(x.shape[1]):
            z[i] += x[i, j] * y[j]
    return z

为了理解点积形状的兼容性,可以通过下图所示的对齐来帮助可视化输入和输出张量。

Tensor dot (张量点)_第1张图片
x, y和z被画成矩形(系数的文字框)。因为y的行、x和列必须具有相同的大小,因此x的宽度必须匹配y的高度。如果你继续开发新的机器学习算法,你可能会经常绘制这样的图表。更一般地,你可以在高维张量之间取点积,遵循与前面二维情况相同的形状兼容性规则:

(a, b, c, d) . (d,) -> (a, b, c)
(a, b, c, d) . (d, e) -> (a, b, c, e)

你可能感兴趣的:(Deep,learning,with,python,python,深度学习,张量,人工智能)