Python 我应该在神经网络中转置特征或权重吗?

Python 我应该在神经网络中转置特征或权重吗?,python,machine-learning,neural-network,pytorch,Python,Machine Learning,Neural Network,Pytorch,我正在学习神经网络 以下是完整的代码: 当我转置特征时,我得到以下输出: import torch def activation(x): return 1/(1+torch.exp(-x)) ### Generate some data torch.manual_seed(7) # Set the random seed so things are predictable # Features are 5 random normal variables features = tor

我正在学习神经网络

以下是完整的代码:

当我转置特征时,我得到以下输出:

import torch
def activation(x):
    return 1/(1+torch.exp(-x))

### Generate some data
torch.manual_seed(7) # Set the random seed so things are predictable

# Features are 5 random normal variables
features = torch.randn((1, 5))
# True weights for our data, random normal variables again
weights = torch.randn_like(features)
# and a true bias term
bias = torch.randn((1, 1))

product = features.t() * weights + bias
output = activation(product.sum())
张量(0.9897)

但是,如果我转置权重,我会得到不同的输出:

weights_prime = weights.view(5,1)
prod = torch.mm(features, weights_prime) + bias
y_hat = activation(prod.sum())
张量(0.1595)

为什么会发生这种情况


更新 我看了一下解决方案:

我看到了:

y=激活((特征*权重).sum()+偏差)

为什么一个矩阵的特征(1,5)可以与另一个矩阵的权重(1,5)相乘,而不先变换权重

更新2 读了几篇文章后,我意识到

matrixA*matrixB不同于torch.mm(matrixA,matrixB)和torch.matmul(matrixA,matrixB)

有人能证实我的三个理解吗

  • 所以*表示元素相乘,而torch.mm()和torch.matmul()是矩阵相乘

  • torch.mm()和torch.matmul()之间的区别:mm()专门用于二维矩阵,而matmul()可用于更复杂的情况

  • 在我上面的链接中提到的这个Udacity编码练习的中性网络中,它需要元素相乘

  • 更新3 为了给有同样困惑的人带来视频截图:


    这是视频链接:

    这条线在两个向量之间取外积

    product=features.t()*权重+偏差
    
    生成的形状是
    5x5

    如果将其更改为点积,则
    输出将匹配
    y_hat

    product=torch.mm(重量、特征.t())+偏差
    
    查看

    火炬中典型的线性(完全连接)层使用形状
    (N,∗,输入特征)
    和形状权重
    (输出特征,输入特征)
    生成形状
    (N,*,输出特征)
    。这里N是批量大小,*是任意数量的其他维度(可以是无)

    实施计划如下:

    output = input.matmul(weight.t())
    
    所以,答案是,根据惯例,你的两个公式都不正确;标准公式为上述公式

    您可以使用非标准形状,因为您是从头开始实现的;只要它是一致的,它可能会起作用,但我不推荐它用于学习。不清楚代码中的1和5是什么,但您可能需要5个输入特性和一个输出特性,批量大小也为1。在这种情况下,标准形状应为input=
    torch.randn((1,5))
    (批量大小=1,输入特征=5),权重=
    torch.randn((5,1))
    输入特征=5,输出特征=1

    没有理由认为权重应该与特征具有相同的形状;因此,
    weights=torch.randn_like(特性)
    没有意义

    最后,针对您的实际问题:

    “我应该在神经网络中转置特征或权重吗?”-在torch惯例中,您应该转置权重,但首先使用matmul和特征。其他框架可能有不同的约定;只要权重的in_features维度乘以输入的num_features维度,它就可以工作

    “为什么会发生这种情况?”——这是两种完全不同的计算;没有理由认为它们会产生同样的结果

    “所以*表示元素相乘,而torch.mm()和torch.matmul()是矩阵相乘。”-是;mm只是矩阵矩阵,matmul是向量矩阵或矩阵矩阵,包括相同的批处理版本-检查文档,了解matmul可以做的一切(这有点多)

    “torch.mm()和torch.matmul()之间的差异:mm()专门用于二维矩阵,而matmul()可用于更复杂的情况。”-是;最大的区别是matmul可以广播。当你特别想要的时候使用它;使用mm防止无意广播


    “在我上面的链接中提到的这个Udacity编码练习的中性网络中,它需要元素级乘法。”-我对此表示怀疑;这可能是Udacity代码中的错误。这段代码
    weights=torch.randn_like(features)
    在任何情况下看起来都是一个错误;权重的维度与特征的维度含义不同。

    谢谢@danny的回答。所以NN需要点积而不是外积,对吗?另外,如果我在2,羽毛和重量之间做点积,那么在这种情况下,特征和重量的顺序将无关紧要,对吗?特征和重量的顺序对于点积来说并不重要,但当使用
    torch.mm
    计算点积时,它们将很重要,因为该函数执行矩阵乘法。要对点积使用矩阵乘法,第一个参数应该是行向量,第二个参数应该是列向量。关于NNs是否需要点积,在应用偏差和激活函数之前,这是考虑如何计算每个单元的激活的一般方法。点积通常组合在一起,这样整个层的点积计算可以通过权重矩阵和前一层的活动向量的单个矩阵乘法来计算。谢谢Danny,你建议我使用
    torch.mm()
    ,而其他人建议使用
    torch.matmul()
    。有什么区别?我应该使用哪一个?
    torch.mm
    torch.matmul
    都执行矩阵乘法,但前者不执行(在适用的情况下自动展开张量),后者执行。非常感谢您的详细解释。对典型线性层应该如何定义的解释确实让我对它有了更好的理解。但当你说:形状的权重
    (out\u特征,in\u特征)
    时,我感到困惑。例如,如果我有一个NN代表