PyTorch实现二分类(多特征输出+多层神经网络)

前置文章:PyTorch实现二分类(单特征输出+单层神经网络)-CSDN博客

⭐处理多维特征输入

在上述实例中,x_data = torch.Tensor([[1.0], [2.0], [3.0]]) 是二维列表(矩阵),外层列表表示样本集,内层每个列表表示单个样本的特征,即表示输入三个样本,每个样本的维度为1维(1个特征feature)。当输入为多维时,如下所示二分类问题中的维度是8维(3行8列的矩阵)(8个特征features):

python 复制代码
x_data = torch.Tensor([[-0.29, 0.49, 0.18, -0.29, 0.00, 0.00, -0.53, -0.03], 
                       [-0.88, -0.15, 0.08, -0.41, 0.00, -0.21, -0.77, -0.67], 
                       [-0.06, 0.84, 0.05, 0.00, 0.00, -0.31, -0.49, -0.63]])
y_data = torch.Tensor([[0], [1], [0]])

对于多维特征输入,模型的输入也要能够接收输入的多个特征。公式变化如下:

  • 原始公式 一个样本只有一个特征,将此特征值代入线性公式后再经过激活函数Sigmoid非线性化后即可得到第个样本对应的输出
  • 变化后公式 一个样本有8个特征(),将这8个特征分别进行线性公式(一个特征对应一个权重)后再经过激活函数Sigmoid非线性化后即可得到第个样本对应的输出

实际上就是将公式从标量(单维度)计算转换为矩阵计算:

  • 单样本(一维输入,单维输出):
  • N个样本(二维输入,多维输出):

输出矩阵,输入矩阵,权重矩阵

在PyTorch中我们只需要修改相应层的输入与输出维度即可,如下以线性层为例,将输入的8维数据经过线性层后降维为6维输出数据:

⭐神经网络

对于神经网络而言,就是将网络层堆叠几次,使输入数据的维度不断降低或升高(下面的图片实例是维度不断下降)。如果你最终需要的输出是一个数值,那最终就需要降维到一维,如果最终你需要的输出是一个矩阵那就降维到二维。

至于中间的维度如何变化、需要几层网络层以及需要哪些网络层

  • 上图所示的神经网络结构是全连接层 (Linear) + 激活函数 (σ) 堆叠,属于最基础的多层感知机 (MLP) ,维度变化完全由 *torch.nn.Linear(in_features, out_features)*决定,规则只有一条,就是上一层的输出维度 = 下一层的输入维度。
  • 输入8 维是原始特征,6 维、2 维是抽象特征,最终的1 维是任务输出。之所以要设置中间的8维到6维,6维到2维的隐藏层而不是直接8维到1维,目的是逐层提取核心特征,抛弃冗余信息,让模型学到规律。
  • **层数的选择:**隐藏层越多,模型的学习能力越强,所以对于复杂任务(高维特征)隐藏层一般都在3层及以上。但是这并不意味着层数越多越好,模型学习能力过强会将数据的噪点都学习,出现过拟合(Overfitting)现象。
  • **维度的变化:**一般使用漏斗型结构,即维度逐渐减小,不建议中间维度突然增大,低维输入强行扩维,会学噪声,过拟合。
  • **网络结构的选择:**中间隐藏层的激活函数一般使用ReLU,Sigmoid易出现梯度消失。输出层一般使用Sigmoid(二分类)、Softmax(多分类)。除此之外也可以加一些其他神经网络层,并不只局限于线性层。

模型设计过程:

完整代码实例

在此例中,一个样本输入的特征有8个,要训练出好的模型参数需要的样本数要远远大于8个,这里为了方便只给出了三个样本。

python 复制代码
import torch

x_data = torch.Tensor([[-0.29, 0.49, 0.18, -0.29, 0.00, 0.00, -0.53, -0.03], 
                       [-0.88, -0.15, 0.08, -0.41, 0.00, -0.21, -0.77, -0.67], 
                       [-0.06, 0.84, 0.05, 0.00, 0.00, -0.31, -0.49, -0.63]])
y_data = torch.Tensor([[0], [1], [0]])
 
 
class Model(torch.nn.Module):
    def __init__(self):
        super().__init__()
        self.linear1 = torch.nn.Linear(8, 6) 
        self.linear2 = torch.nn.Linear(6, 4)
        self.linear3 = torch.nn.Linear(4, 1)
        self.sigmoid = torch.nn.Sigmoid()
 
    def forward(self, x):
        x = self.sigmoid(self.linear1(x))
        x = self.sigmoid(self.linear2(x))
        x = self.sigmoid(self.linear3(x)) 
        return x
 
 
model = Model()
 
criterion = torch.nn.BCELoss(reduction='sum')  
optimizer = torch.optim.SGD(model.parameters(), lr=0.01)


for epoch in range(10000):
    y_pred = model(x_data)
    loss = criterion(y_pred, y_data)
 
    if epoch % 1000 == 0:
        print(f"Epoch: {epoch}, Loss: {loss.item():.4f}")
    
    optimizer.zero_grad()
    loss.backward()
    optimizer.step()
 
 
x_test = torch.Tensor([[-0.41, 0.17, 0.21, 0.00, 0.00, 0.24, -0.89, -0.70]])
y_test_pred = model(x_test)
print("\n测试结果:")
print('y_pred = ', y_test_pred.data)
相关推荐
Narrastory2 天前
明日香 - Pytorch 快速入门保姆级教程(一)
人工智能·pytorch·深度学习
Narrastory2 天前
明日香 - Pytorch 快速入门保姆级教程(二)
人工智能·pytorch·深度学习
呆萌很7 天前
卷积神经网络的基石——基础卷积模块
神经网络
海天一色y7 天前
粒子群算法(PSO)优化BP神经网络:从原理到实战
人工智能·深度学习·神经网络
盼小辉丶7 天前
PyTorch实战(30)——使用TorchScript和ONNX导出通用PyTorch模型
人工智能·pytorch·深度学习·模型部署
有梦想的攻城狮7 天前
卷积神经网络(CNN)详解
人工智能·神经网络·cnn·卷积神经网络
LaughingZhu7 天前
Product Hunt 每日热榜 | 2026-02-25
数据库·人工智能·经验分享·神经网络·chatgpt
wearegogog1237 天前
基于神经网络、强化学习、模糊逻辑和小波相结合的混合方法控制欠驱动系统
人工智能·深度学习·神经网络
码农三叔7 天前
(3-2-01)视觉感知:目标检测与分类
人工智能·目标检测·分类·机器人·人机交互·人形机器人
封奚泽优7 天前
使用mmdetection项目进行训练记录
pytorch·python·cuda·mmdetection·mmcv