构建一个带有真实标签的非图像分类器

我有一个如下所示的数据集:

enter image description here

标签基本上是一系列项目(假设是停车场中的汽车)的列表,总共有10个项目,标签从0到9。我有14个类别(假设是14个不同的汽车品牌)。每个浮点值只是该项目属于哪个类别的百分比。例如,项目2很可能是类别2,概率为0.995275:

print(set(list(df['label'])))> {0, 1, 2, 3, 4, 5, 6, 7, 9}

我的目标是训练一个分类器,输出一个从0到14的整数,以预测x属于哪个类别标签。

我正在尝试构建一个具有3个隐藏层(加上输入和输出层)的前馈神经网络,接受15个输入,并输出从0到14的预测。这是迄今为止我的设计:

class NNO(nn.Module):  def __init__(self):    super(NNO, self).__init__()    h= [2,1]    self.hidden = nn.Linear(h[0], h[1])    self.hidden = nn.Linear(2,20)    self.hidden = nn.Linear(20,20)    self.output = nn.Linear(20,15)    self.sigmoid = nn.Sigmoid()    self.softmax = nn.Softmax(dim = 1)    def forward(self, y):    x = self.hidden(x)    x = self.sigmoid(x)    x = self.output(x)    x = self.softmax(x)

我的问题是:如何将数据集输入到我的神经网络中以开始训练轮次?我找不到任何与这种数据集相关的资源。


回答:

以下是答案:

# 首先我创建一些虚拟数据label = np.random.randint(0, 14, 1000)random = np.random.random((1000, 14))total = pd.DataFrame(data=random, columns=[f'{i}_col' for i in range(14)])total['label'] = label'''根据我的理解,你需要在输出中选择概率最高的一个类,因此这是一个多类分类问题。在我的案例中,我将使用`random`中的最高值作为目标类。'''class TDataset(torch.utils.data.Dataset):    def __init__(self, df):        self.inputs = df[[f'{i}_col' for i in range(14)] + ['label']].values        self.outputs = df[[f'{i}_col' for i in range(14)]].values        def __len__(self):        return len(self.inputs)        def __getitem__(self, idx):        x = torch.tensor(self.inputs[idx], dtype=torch.float)        y = torch.tensor(np.argmax(self.outputs[idx]))        return x, yds = TDataset(total)dl = torch.utils.data.DataLoader(ds, batch_size=64)# 接下来我将创建一个模型,它接受15个输入,# 在我的案例中输出14个代表logits的输出class NNO(nn.Module):    def __init__(self):        super(NNO, self).__init__()        self.hidden = nn.Linear(15, 20)        self.relu = nn.ReLU()        self.output = nn.Linear(20, 14)      def forward(self, x):        x = self.hidden(x)        x = self.relu(x)        x = self.output(x)        return x# 现在我们创建模型对象m = NNO()sample = Nonefor i in dl:    sample = i    breakprint(m(sample[0]).shape) # shape = [64, 14] 如所期望。# 现在我们定义损失函数和优化器loss_fn = torch.nn.CrossEntropyLoss()optimizer = torch.optim.Adam(m.parameters())# 现在我们定义训练循环for i in range(500): # 训练500个轮次    epoch_loss = 0    for idx, data in enumerate(dl):        inputs = data[0]        targets = data[1] # 根据你的数据进行相应的修改        preds = m(inputs)        optimizer.zero_grad()        loss = loss_fn(preds, targets)        epoch_loss += loss        loss.backward()        optimizer.step()        if (i%50 == 0):        print('loss: ', epoch_loss.item() / len(dl))'''在推理时,你只需对模型的结果应用softmax并选择最可能的输出。'''preds = m(sample[0])predicted_classes = torch.argmax(torch.nn.functional.softmax(preds), axis=1)# 这里的预测类别就是你所需的最终输出。

Related Posts

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注