[我知道这个问题很多,但我找不到任何符合我的用例的答案]
[编辑:如果你了解 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 个值的张量]
您可以将矩阵 p×q 与矩阵 q×r 相乘,结果将是矩阵 p×r。
更明确地说:
您可以将矩阵(p 行,q 列)与矩阵(q 行,r 列)相乘,结果将为(p 行,r 列)。
注意左侧矩阵的列数必须等于右侧矩阵的行数。
示例:
因此,如果您认为必须按顺序将这两个矩阵相乘,那么您的推理一定有错误。
问自己这些问题:
在数学中,函数组合总是“从右到左”书写。如果你有一个向量 x,并且应用函数 f,然后应用函数 g,然后将结果写入
g(f(x)) 或 (g∘f)(x)
注意尽管 f 是先应用的,但 g 如何出现在左侧,f 如何出现在右侧。
矩阵可以表示线性函数,矩阵乘法对应于函数复合,所以如果矩阵A表示线性函数f,矩阵B表示线性函数g,列向量X表示向量x,则必须计算g(f(x))作为 BAX,而不是 ABX。
如果您需要将 2 个矩阵相乘,则:
第一个矩阵中的列数必须等于第二个矩阵中的行数
所以如果:
Mat1 is 8x10
然后
mat2 must be something 10x8
(或 10 X 任何东西)
可视化:
https://pytorch.org/blog/inside-the-matrix/
https://eli.thegreenplace.net/2015/visualizing-matrix-multiplication-as-a-linear-combination/