Python 神经网络中正向传递的首选数学表示是什么?

Python 神经网络中正向传递的首选数学表示是什么?,python,numpy,neural-network,matrix-multiplication,Python,Numpy,Neural Network,Matrix Multiplication,我知道这可能是一个语义问题,但我总是看到不同的文章对向前传递的解释略有不同。e、 有时它们代表标准神经网络中对隐藏层的前向传递,如np.dot(x,W),有时我将其视为np.dot(W.T,x),有时np.dot(W,x) 以这张图片为例。它们将输入数据表示为[NxD]矩阵,将权重数据表示为[DxH],其中H是隐藏层中的神经元数量。这似乎是最自然的,因为输入数据通常是表格格式,行作为样本,列作为特征 现在是CS231n课程笔记中的一个示例。他们在下面的例子中讨论了这个问题,并引用了用于计算它的

我知道这可能是一个语义问题,但我总是看到不同的文章对向前传递的解释略有不同。e、 有时它们代表标准神经网络中对隐藏层的前向传递,如
np.dot(x,W)
,有时我将其视为
np.dot(W.T,x)
,有时
np.dot(W,x)

以这张图片为例。它们将输入数据表示为
[NxD]
矩阵,将权重数据表示为
[DxH]
,其中H是隐藏层中的神经元数量。这似乎是最自然的,因为输入数据通常是表格格式,行作为样本,列作为特征

现在是CS231n课程笔记中的一个示例。他们在下面的例子中讨论了这个问题,并引用了用于计算它的代码:

f = lambda x: 1.0/(1.0 + np.exp(-x)) # activation function (use sigmoid)
x = np.random.randn(3, 1) # random input vector of three numbers (3x1)
h1 = f(np.dot(W1, x) + b1) # calculate first hidden layer activations (4x1)
h2 = f(np.dot(W2, h1) + b2) # calculate second hidden layer activations (4x1)
out = np.dot(W3, h2) + b3 # output neuron (1x1)
其中
W
[4x3]
,x是
[3x1]
。我希望权重矩阵的维数等于[n_特征,n_隐藏的神经元],但在这个例子中,它们似乎在使用之前就自然地进行了转置

我想我只是对一般术语感到困惑,在计算神经网络正向传递时,数据应该如何形成和一致使用。有时我看到转置,有时我看不到。是否有一种标准的、首选的方法来根据这样的图表表示数据?这个问题可能很愚蠢,但我只是想讨论一下。谢谢。

TLDR

NumPy处理两个数组的点积的计算,如果其中一个或两个数组都是一维数组,则不必太担心它们添加到参数中的顺序。对于二维阵列,点积要求它们分别共享最后一个轴和第一个轴


详细解释

从数学角度来看,在点积过程中,
(nxm)
(mx1)
应共享一个共同的维度,以便生成的数组的形式为
(nx1)
。但是,从实现的角度来看,如果输入的一个或两个都是一维数组,numpy将处理输入的形状。依照-

  • 如果
    a
    b
    都是一维数组,则它是向量的内积 (没有复合共轭)
  • 如果
    a
    b
    都是二维数组,则为矩阵乘法, 但最好使用:func:
    matmul
    a@b
  • 如果
    a
    b
    为0-D(标量),则相当于:func:
    乘法
    并且使用
    numpy。首选乘法(a,b)
    a*b
  • 如果
    a
    是一个N-D数组而
    b
    是一个1-D数组,则它是
    a
    b
    最后一个轴的和积
  • 如果
    a
    是一个N-D数组,而
    b
    是一个M-D数组(其中
    M>=2
    ),则它是一个
    a
    的最后一个轴与
    b
    的倒数第二个轴的和积
因此,考虑玩具实例-

x = np.array([4,5,6]) #shape - (3,1)
W = np.array([[1,0,0],[0,1,0],[0,0,1]]) #shape - (3,3)

np.dot(x, W)
#Output - array([4, 5, 6])

np.dot(W.T, x)
#Output - array([4, 5, 6])

np.dot(W, x)
#Output - array([4, 5, 6])
W2 = np.array([[1,0,0],[0,1,0]]) #shape - (2,3)

np.dot(W, W2)
由于W和x的最后一个轴是3,这是共享的,而其他轴的点积可以是(1,3)或(3,1),NumPy将其简化为(3),将其更改为一维向量,而不是具有单行的二维矩阵,因此上述所有轴的计算结果相同

  • 如果a是N-D数组,b是1-D数组,则它是a和b最后一个轴的和积。
当我们使用二维阵列的点积时,这并不容易。在这里,您必须确保第一个阵列的最后一个轴与第二个阵列的第一个轴共享。范例-

x = np.array([4,5,6]) #shape - (3,1)
W = np.array([[1,0,0],[0,1,0],[0,0,1]]) #shape - (3,3)

np.dot(x, W)
#Output - array([4, 5, 6])

np.dot(W.T, x)
#Output - array([4, 5, 6])

np.dot(W, x)
#Output - array([4, 5, 6])
W2 = np.array([[1,0,0],[0,1,0]]) #shape - (2,3)

np.dot(W, W2)
---------------------------------------------------------------------------
ValueError回溯(最近一次调用上次)
在里面
---->1 np.点(W,W2)
值错误:形状(3,3)和(2,3)未对齐:3(尺寸1)!=2(尺寸0)