Python 神经网络中正向传递的首选数学表示是什么?
我知道这可能是一个语义问题,但我总是看到不同的文章对向前传递的解释略有不同。e、 有时它们代表标准神经网络中对隐藏层的前向传递,如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课程笔记中的一个示例。他们在下面的例子中讨论了这个问题,并引用了用于计算它的
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
都是二维数组,则为矩阵乘法, 但最好使用:func:b
或matmul
a@b
- 如果
或a
为0-D(标量),则相当于:func:b
并且使用乘法
或numpy。首选乘法(a,b)
a*b
- 如果
是一个N-D数组而a
是一个1-D数组,则它是b
和a
最后一个轴的和积b
- 如果
是一个N-D数组,而a
是一个M-D数组(其中b
),则它是一个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)