PYTORCH - 张量问题 - Mat1 和 mat2 形状无法相乘(8x10 和 8x8)

问题描述 投票:0回答:2

[我知道这个问题很多,但我找不到任何符合我的用例的答案]

[编辑:如果你了解 Pytorch,请回答这个问题,我了解矩阵乘法,这不是这里的问题]

我将由 8 个浮点数组成的 N = 10 个输入输入到 8 个输入层

但是我得到了那个错误

Mat1 and mat2 shapes cannot be multiplied (8x10 and 8x8) 

我错过了什么?

我在数据集中生成随机数据

class MyDataset(Dataset):
    def __init__(self):
        self.data = []
        self.input_size = 0
        for i in range(0,10):
            label = random.randint(0, 1)
            data = [random.uniform(0.0, 1.0) for _ in range(8)]
            self.data.append((data , label))
            self.input_size = len(data ) if self.input_size < len(encoded_text) else self.input_size
  
    def __len__(self):
        return len(self.data)
    
    def __getitem__(self, idx):
        text, label = self.data[idx]
        return text, label

这是我的模型

class MyModel(nn.Module):
    def __init__(self, input_size, hidden_size, output_size):
        super(MyModel, self).__init__()
        self.input = nn.Linear(input_size,hidden_size)
        self.hidden = nn.Linear(hidden_size, output_size)
        self.sigmoid = nn.Sigmoid()

    def forward(self, x):
        # padding is there as original dataset does not have full 8 floats inputs
        x_padded = pad_sequence(x, batch_first=True, padding_value=0).float()  
        output = self.input(x_padded) >>>>>>>> ERROR
        return torch.sigmoid(output)

def train_model(model, train_loader, criterion, optimizer, num_epochs):
    for epoch in range(num_epochs):
        for inputs, labels in train_loader:
            outputs = model(inputs)

初始化部分

if __name__ == "__main__":
    hidden_size = 8  # hidden size 
    output_size = 1  # binary classification 
    learning_rate = 0.001
    num_epochs = 10
    
    dataset = MyDataset()
    train_loader = DataLoader(dataset, batch_size=64, shuffle=True)
    
    input_size = dataset.input_size
    
    model = MyModel(input_size, hidden_size, output_size)
    criterion = nn.BCEWithLogitsLoss()
    optimizer = optim.Adam(model.parameters(), lr=learning_rate)
    train_model(model, train_loader, criterion, optimizer, num_epochs)`

这是一个非常简单的初学者用例,没什么花哨的

感谢您的帮助

[编辑:x 输入由 8 个 10 个值的张量组成,但它应该是 10 个 8 个值的张量]

python math matrix pytorch matrix-multiplication
2个回答
0
投票

您可以将矩阵 p×q 与矩阵 q×r 相乘,结果将是矩阵 p×r。

更明确地说:

您可以将矩阵(p 行,q 列)与矩阵(q 行,r 列)相乘,结果将为(p 行,r 列)。

注意左侧矩阵的列数必须等于右侧矩阵的数。

维基百科有一张很好的图片来形象化这一点。

示例:

  • (8×10)乘以(10×12)得到(8x12);
  • (8×10)乘以(10×10)得到(8x10);
  • (8×8)乘以(8×10)得到(8x10);
  • (10×8)乘以(8×8)得到(10x8);
  • (8×10)次(8×8)不起作用。

因此,如果您认为必须按顺序将这两个矩阵相乘,那么您的推理一定有错误。

问自己这些问题:

  • 这两个矩阵代表什么?
  • 为什么要把它们相乘?
  • 如果你想将它们相乘,你如何选择哪个矩阵应该在左边,哪个在右边?
  • 所得矩阵代表什么?

重要提示:矩阵乘法、函数复合

从右到左应用运算

在数学中,函数组合总是“从右到左”书写。如果你有一个向量 x,并且应用函数 f,然后应用函数 g,然后将结果写入

g(f(x)) 或 (g∘f)(x)

注意尽管 f 是先应用的,但 g 如何出现在左侧,f 如何出现在右侧。

矩阵可以表示线性函数,矩阵乘法对应于函数复合,所以如果矩阵A表示线性函数f,矩阵B表示线性函数g,列向量X表示向量x,则必须计算g(f(x))作为 BAX,而不是 ABX。


0
投票

如果您需要将 2 个矩阵相乘,则:

第一个矩阵中的列数必须等于第二个矩阵中的行数

所以如果:

Mat1 is 8x10

然后

mat2 must be something 10x8
(或 10 X 任何东西)

https://byjus.com/maths/matrix-multiplication/#:~:text=To%20perform%20multiplication%20of%20two,columns%20of%20the%202nd%20matrix.

可视化:

https://pytorch.org/blog/inside-the-matrix/

https://eli.thegreenplace.net/2015/visualizing-matrix-multiplication-as-a-linear-combination/

© www.soinside.com 2019 - 2024. All rights reserved.