使用Pytorch处理多维特征的输入案例

155 阅读1分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第24天,点击查看活动详情

1、情况说明

 下图这个预测一个人在一年之后得糖尿病的概率的例子,这个时候我们的输入将会有很多的指标。你可以把它看成是我们体检的各种值。最后一排的外代表了他是否会得糖尿病。

那么多维的特征输入应该怎么办呢?我们就需要把每一个特征x付以相应的权重。在进行逻辑回归时,把每一个维度的x乘相应的权值的和加上一个偏置量,送入sigema函数进行二分类,就像这样:

 当然在真正编程的时候是以矩阵乘法的形式进行运算的,也就是一次能算多个样本的值,具体的推导过程大家可以看刘老师的教学视频,这里就不写了。根据数据集,我们需要构造一个从八维到一维的计算图,就是这样:

二 代码实现 含注释

import numpy as np
import torch
from torch import nn

xy=np.loadtxt("CIFAdata/diabetes.csv.gz",delimiter=",",dtype=np.float32)
x_data=torch.from_numpy(xy[:,:-1])
print(x_data)
#[-1] 表示要拿出一个矩阵
y_data=torch.from_numpy(xy[:,[-1]])
print(y_data)

class Model(nn.Module):
    def __init__(self):##构造函数
        super(Model, self).__init__()
        #8维转为6维
        self.linear1 = torch.nn.Linear(8,6)
        self.linear2 = torch.nn.Linear(6, 4)
        self.linear3 = torch.nn.Linear(4, 1)
        #激活函数
        # self.active=torch.nn.ReLU()
        #因为他里边也没有权重需要更新,所以要一个就行了,单纯的算个数
        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(size_average=True)
#model.parameters()会扫描module中的所有成员,
#                  如果成员中有相应权重,那么都会将结果加到要训练的参数集合上
optimizer=torch.optim.SGD(model.parameters(),lr=0.1)

for epoch in range(100):
    y_pred=model(x_data)
    loss=criterion(y_pred,y_data)
    print(epoch,loss.item())
    #反向传播
    optimizer.zero_grad()
    loss.backward()
    #Updata
    optimizer.step()

    
# 如果想查看某些层的参数,以神经网络的第一层参数为例,可按照以下方法进行。
# 第一层的参数:
layer1_weight = model.linear1.weight.data
layer1_bias = model.linear1.bias.data
print("layer1_weight", layer1_weight)
print("layer1_weight.shape", layer1_weight.shape)
print("layer1_bias", layer1_bias)
print("layer1_bias.shape", layer1_bias.shape)