当我的训练数据和测试数据大小不同时,如何使用 sklearn 模型的拟合和预测功能创建神经网络类?

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

我正在尝试制作一个神经网络模型来回答线性回归问题(我已经使用

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
步骤将不起作用。

是否可以制作一个训练数据和测试数据大小不同的神经网络类?

machine-learning scikit-learn pytorch neural-network linear-regression
1个回答
0
投票

是的,输入层的大小需要为 49。输出层的大小需要为 1。然后它将适用于训练数据和测试数据。

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