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)
相关推荐
Faker66363aaa12 小时前
【深度学习】YOLO11-BiFPN多肉植物检测分类模型,从0到1实现植物识别系统,附完整代码与教程_1
人工智能·深度学习·分类
【赫兹威客】浩哥13 小时前
无人机视角军事目标细分类检测数据集及多YOLO版本训练验证
yolo·分类·无人机
LaughingZhu15 小时前
Product Hunt 每日热榜 | 2026-02-10
人工智能·经验分享·深度学习·神经网络·产品运营
技术传感器16 小时前
大模型从0到精通:对齐之心 —— 人类如何教会AI“好“与“坏“ | RLHF深度解析
人工智能·深度学习·神经网络·架构
fanstuck1 天前
从云到本地:智能体与工作流在 openJiuwen 中的导入导出设计与工程实践
人工智能·机器学习·数学建模·分类·数据挖掘
island13141 天前
ops-nn 算子库:神经网络异构加速的秘密武器与微架构深度协同
人工智能·神经网络·性能优化
查无此人byebye1 天前
从DDPM到DiT:扩散模型3大核心架构演进|CNN到Transformer的AIGC生成革命(附实操要点)
人工智能·pytorch·深度学习·架构·cnn·音视频·transformer
LaughingZhu1 天前
Product Hunt 每日热榜 | 2026-02-11
人工智能·经验分享·神经网络·信息可视化·产品运营
love530love1 天前
突破 Windows 编译禁区:BitNet 1-bit LLM 推理框架 GPU 加速部署编译 BitNet CUDA 算子全记录
c++·人工智能·pytorch·windows·python·cuda·bitnet
A尘埃1 天前
数学:神经网络的数学基础
人工智能·深度学习·神经网络