运行时错误:mat1和mat2形状不能相乘(20x27和3x30)

2024-03-28 17:56:09 发布

您现在位置:Python中文网/ 问答频道 /正文

我是人工智能新手,并且已经按照一个教程构建了一个机器学习器,它可以预测冠军赛的得分。我已经完成了教程,但是当我运行代码时,我得到一个运行时错误,它只是说mat1和mat2形状不能相乘。我看了所有的代码,似乎找不到问题。有人知道为什么会出现这个错误吗?这是程序的代码:

import pandas
import torch
import matplotlib.pyplot as plt
import numpy as np

filepath = "2010_training.csv"
df = pandas.read_csv(filepath)



extract = [5, 6, 7, 8, 9, 10, 13, 14, 16, 17, 18, 20, 21, 23, 24, 25, 26, 27, 29, 30, 31, 32, 33, 35, 
 36, 37, 38, 47, 48, 49]
 df = df.iloc[:, extract]

training = df.iloc[:-20]
test = df.iloc[-20:]

for e in range(len(training.columns) - 3): 
num = max(training.iloc[:, e].max(), test.iloc[:, e].max())
if num < 10:
  training.iloc[:, e] /=10
  test.iloc[:, e] /=10
elif num < 100:
  training.iloc[:, e] /=100
  test.iloc[:, e] /=100
elif num < 1000:
  training.iloc[:, e] /= 1000
  test.iloc[:, e] /=1000
else:
  print("Error in normalisation! Please check!")


training = training.sample(frac=1)
test = test.sample(frac=1)

training_input = training.iloc[:, -3:]
training_output = training.iloc[:, -3:]
test_input = test.iloc[:, :-3]
test_output = test.iloc[:, -3:]

def convert_output_win(source):
  target = source.copy()
  target['new'] = 2
  for i, rows in target.iterrows():
    if rows['win'] == 1:
      rows['new'] = 1
    if rows['draw'] == 1:
      rows['new'] = 0
    if rows['defeat'] == 1:
      rows['new'] = 0
   return target.iloc[:, -1]

training_output = convert_output_win(training_output)
test_output = convert_output_win(test_output)

class Net(torch.nn.Module):
  def __init__(self, input_size, hidden_size):
    super(Net, self).__init__()
    self.input_size = input_size
    self.hidden_size = hidden_size
    self.fc1 = torch.nn.Linear(self.input_size, self.hidden_size)
    self.relu = torch.nn.ReLU()
    self.fc2 = torch.nn.Linear(self.hidden_size, 1)
    self.sigmoid = torch.nn.Sigmoid() 
    
  def forward(self, x):
    hidden = self.fc1(x)
    relu = self.relu(hidden)
    output = self.fc2(relu)
    output = self.sigmoid(output)
    return output

training_input = torch.FloatTensor(training_input.values)
training_output = torch.FloatTensor(training_output.values)
test_input = torch.FloatTensor(test_input.values)
test_output = torch.FloatTensor(test_output.values)

input_size = training_input.size()[1]
hidden_size = 30


model = Net(input_size, hidden_size)
criterion = torch.nn.BCELoss()
optimizer = torch.optim.SGD(model.parameters(), lr = 0.9, momentum=0.2)

model.eval()
y_pred = model(test_input)
before_train = criterion(y_pred.squeeze(), test_output)
print('Test loss before training', before_train.item())

model.train()
epochs = 5000
errors = []
for epoch in range(epochs):
optimizer.zero_grad()
y_pred = model(training_input)
loss = criterion(y_pred.squeeze(), training_output)
errors.append(loss.item())

print('Epoch {}: train loss: {}'.format(epoch, loss.item()))
loss.backward
optimizer.step()

model.eval()
y_pred = model(test_input)
after_train = criterion(y_pred.squeeze(), test_output)
print('Test loss after Training', after_train.item())

def plotcharts(errors):
errors = np.array(errors)

plt.figure(figsize=(12, 5))

graf02 = plt.subplot(1, 2, 1)
graf02.set_title('Errors')
plt.plot(errors, '-')
plt.xlabel('Epochs')

graf03 = plt.subplot(1, 2, 2)
graf03.set_title('Tests')
a = plt.plot(test_output.numpy(), 'yo', label='Real')
plt.setp(a, markersize=10)
a = plt.plot(y_pred.detach().numpy(), 'b+', label='Predicted')
plt.setp(a, markersize=10)
plt.legend(loc=7)
plt.show()

plotcharts(errors)

Tags: testselfinputoutputsizemodeltrainingplt