《PyTorch深度学习实战》学习笔记07——处理多维特征输入

1.声明

本文为哔哩哔哩视频集《PyTorch深度学习实战》课程的学习笔记,仅作为记录分享。

此文所用数据集可从百度网盘链接下载,放置于所写python脚本同级目录之下。

链接:https://pan.baidu.com/s/1Br_g0tW2AWZ87ribhYaaBg 
提取码:im6v

2.问题描述

《PyTorch深度学习实战》学习笔记07——处理多维特征输入_第1张图片

该图为糖尿病数据集的节选,从图中可以看出有8个维度,每一条数据包含八个维度的信息,进行二分类问题,判断是否患有糖尿病。

3.构思模型

之前我们遇到的是单维度的数据,我们采用的是单维度的逻辑回归模型:

\widehat y^{(i)} = \sigma(x^{(i)} \omega+b)

此模型仅能解决单维度的数据,而输入变成上图所示的八个维度,其模型也变成了:

\widehat y^{(i)} = \sigma(\sum _{n=1}^8 x^{(i)}_n \omega _n+b)

而在计算中我们往往是通过矩阵的方式进行的计算:

\sum _{n=1}^8 x^{(i)}_n \omega _n = \begin{bmatrix} {x_1^{(i)}}&{\cdots}&{x_8^{(i)}} \end{bmatrix} \begin{bmatrix} {w_1}\\ {\vdots}\\ {w_8} \end{bmatrix}

则原式表示成了:

\widehat y^{(i)} = \sigma( \begin{bmatrix} {x_1^{(i)}}&{\cdots}&{x_8^{(i)}} \end{bmatrix} \begin{bmatrix} {w_1}\\ {\vdots}\\ {w_8} \end{bmatrix}+b) =\sigma(z^{(i)})

Mini-Batch

PyTorch中的sigmoid函数,是一种按向量计算的函数,所以在计算中

\begin{bmatrix} {\widehat y^{(1)}}\\ {\vdots}\\ {\widehat y^{(N)}} \end{bmatrix} = \begin{bmatrix} {\sigma(z^{(1)})}\\ {\vdots}\\ {\sigma(z^{(N)})} \end{bmatrix} =\sigma( \begin{bmatrix} {z^{(1)}}\\ {\vdots}\\ {z^{(N)}} \end{bmatrix})

因为其中每一个z等于:

z^{(i)} = \begin{bmatrix} {x_1^{(i)}}&{\cdots}&{x_8^{(i)}} \end{bmatrix} \begin{bmatrix} {w_1}\\ {\vdots}\\ {w_8} \end{bmatrix}+b\\

所以原始又可以写为:

\begin{bmatrix} {z^{(1)}}\\ {\vdots}\\ {z^{(N)}} \end{bmatrix} = \begin{bmatrix} {x_1^{(1)}} & {\cdots} & {x_8^{(1)}}\\ {\vdots} & {\vdots} & {\vdots}\\ {x_1^{(N)}} & {\cdots} & {x_8^{(N)}}\\ \end{bmatrix} \begin{bmatrix} {w_1}\\ {\vdots}\\ {w_8} \end{bmatrix} + \begin{bmatrix} {b}\\ {\vdots}\\ {b} \end{bmatrix}

4.维度下降

通过矩阵变换,进行维度下降

《PyTorch深度学习实战》学习笔记07——处理多维特征输入_第2张图片

通过这段代码可以直接使得八维的数据,降到一维:

self.linear = torch.nn.Linear(8,1)

同时也可以增加网络层数,进行分步降维:

《PyTorch深度学习实战》学习笔记07——处理多维特征输入_第3张图片

通过如图方法进行分布降维。

5.代码实现

import torch
import numpy as np

"""
Prepare DataSet
"""
xy = np.loadtxt('diabetes.csv.gz', delimiter=',', dtype = np.float32)
#将前八列(除最后一列)和除最后一行作为训练集
x_data = torch.from_numpy(xy[:-1, :-1])
#取最后一列作为输出验证
y_data = torch.from_numpy(xy[:-1, [-1]])
#取最后1行的测试集部分
test_data = torch.from_numpy(xy[[-1], :-1])
pred_test = torch.from_numpy(xy[[-1],[-1]])


"""
Design model using Class
"""
class Model(torch.nn.Module):
    def __init__(self):
        super(Model, self).__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()

"""
Construct loss and optimizer
"""
criterion = torch.nn.BCELoss(size_average=True)

optimizer = torch.optim.SGD(model.parameters(), lr=0.1)

"""
Training cycle
forward ,backward, update
"""
for epoch in range(1000):
    #Forward 并非mini-batch的设计,只是mini-batch的风格
    y_pred = model(x_data)
    loss = criterion(y_pred,y_data)
    print(epoch, loss.item())

    #Backward
    optimizer.zero_grad()
    loss.backward()

    #Update
    optimizer.step()

"""
Test
"""
print("test_pred = ", model(test_data).item())
print("infact_pred = ", pred_test.item())

你可能感兴趣的:(深度学习,深度学习,pytorch,学习)