我正在尝试制作一个神经网络模型来回答线性回归问题(我已经使用
sklearn
的 LinearRegression
制作了一个模型,我想比较两者)。 最终,我想创建一个具有 fit
和 predict
函数的类,就像 sklearn
中的模型一样,这样我就可以创建一个循环来测试我在项目中使用的所有模型。
为此,我遵循了此问题答案中的代码:编写一个具有模型拟合和预测功能的 pytorch 神经网络类。 经过一些修改,这就是我所拥有的:
import torch
import torch.nn as nn
import torch.optim as optim
class MyNeuralNet(nn.Module):
def __init__(self):
super().__init__()
self.layer1 = nn.Linear(2, 4, bias=True)
self.layer2 = nn.Linear(4, 1, bias=True)
self.loss = nn.MSELoss()
self.compile_()
def forward(self, x):
x = self.layer1(x)
x = self.layer2(x)
return x.squeeze()
def fit(self, x, y):
x = torch.tensor(x.values, dtype=torch.float32)
y = torch.tensor(y.values, dtype=torch.float32)
losses = []
for epoch in range(100):
## Inference
res = self.forward(x)#self(self,x)
loss_value = self.loss(res,y)
## Backpropagation
loss_value.backward() # compute gradient
self.opt.zero_grad() # flush previous epoch's gradient
self.opt.step() # Perform iteration using gradient above
## Logging
losses.append(loss_value.item())
def compile_(self):
self.opt = optim.SGD(self.parameters(), lr=0.01)
def predict(self, x_test):
self.eval()
y_test_hat = self(x_test)
return y_test_hat.detach().numpy()
# self.train()
注意,您还需要
numpy
,我只是这里没有,因为此代码被放入单独的 .py 文件中。
这是导入我的类后我如何使用模型的:
model = MyNeuralNet()
X_train = # pandas dataframe with 1168 rows and 49 columns
y_train = # pandas dataframe with 1168 rows and 1 column
X_test = # pandas dataframe with 292 rows and 49 columns
model.fit(X_train, y_train)
pred = model.predict(X_test)
print(pred)
我在
RuntimeError: mat1 and mat2 shapes cannot be multiplied (1168x49 and 2x4)
步骤中得到的错误是fit
。 我知道这与我的网络线性层的参数有关。 我认为,如果我将第一个线性层的输入大小更改为 49,将第二个线性层的输出大小更改为 1168,那么它将适用于 fit
步骤(或至少类似的操作,以匹配训练数据)。 但是,我的测试数据大小不同,我很确定 predict
步骤将不起作用。
是否可以制作一个训练数据和测试数据大小不同的神经网络类?
是的,输入层的大小需要为 49。输出层的大小需要为 1。然后它将适用于训练数据和测试数据。