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)
相关推荐
%4717 小时前
DAY41
pytorch·python
2601_9507607919 小时前
树突状细胞亚群的分类、标志物与功能特征
人工智能·分类·数据挖掘·蛋白
CIO_Alliance1 天前
AI深度系列(3)| 从RNN到LSTM:序列数据处理的技术逻辑与企业AI化转型启示
人工智能·rnn·深度学习·神经网络·lstm·企业cio联盟·企业级ai化转型
一只积极向上的小咸鱼1 天前
pytorch 与资源核算
人工智能·pytorch·python
CIO_Alliance1 天前
AI深度系列(1)|神经元激活函数与MLP原理:理解神经网络的基础
人工智能·深度学习·神经网络·机器学习·tensorflow·ai+ipaas·企业cio联盟
民乐团扒谱机1 天前
【微科普】压缩感知(CS):违反了奈奎斯特采样定理?不先采集也能还原信号?大白话讲透稀疏采样、L1重建与OMP,一文吃透附代码
python·神经网络·线性代数·算法·数学建模·压缩感知·奈奎斯特
小女孩真可爱1 天前
GPT(3)----------------GQA分组查询注意力机制提速
人工智能·pytorch·gpt·深度学习·大模型
旋转的油纸伞1 天前
Wukong: Towards a Scaling Law for Large-Scale Recommendation
人工智能·深度学习·神经网络·目标检测·机器学习·自然语言处理·caffe
Three_ST1 天前
沐神-动手学习深度学习-习题 4.3. 多层感知机的简洁实现
人工智能·pytorch·python·深度学习·机器学习
Zzj_tju1 天前
复现一个 Transformer Encoder:从论文公式到最小 PyTorch
人工智能·pytorch·深度学习·语言模型