处理多维特征的输入

文章目录

  • 回顾
  • 多维向量的逻辑回归
    • Mini-Batch
  • 神经网络
  • 构建模型
    • 1. 数据准备
    • 2.定义模型
    • 3.构建损失函数和优化器
    • 4. 训练
    • 完整代码
  • 练习

回顾

之前学习的分类和回归任务都是由x、y组成的数据集,但是我们的输入都是一维向量,那么针对多维向量的输入又该如何处理呢?
处理多维特征的输入_第1张图片

  • 在数据集里面,我们把一行数据叫做一个样本(在数据库中叫做一个元组)
    处理多维特征的输入_第2张图片
  • 输入数据中的某一列叫做特征,比如说颜色、纹理、形状(在数据库中叫做属性/字段)
    处理多维特征的输入_第3张图片

多维向量的逻辑回归

  • 首先模型会发生变化:
    处理多维特征的输入_第4张图片
    处理多维特征的输入_第5张图片

Mini-Batch

torch中的所有数据都是向量形式,可以把向量运算都转化为矩阵运算,利用并行计算提高计算能力。
假设输入数据为8维,输出为1维
处理多维特征的输入_第6张图片
请先尝试自己写一下这个逻辑回归模型的model代码!
处理多维特征的输入_第7张图片
处理多维特征的输入_第8张图片
如果线性层的输出是多维的呢?
处理多维特征的输入_第9张图片

上面的这个线性层已经把8维向量转化为了2维,但是我们最终结果是1维的.我们可以再后面再接一个线形层,将二维的转化为1维。

请利用下面这个代码写一个函数模型,完成线性模型的代码(降维到1维)
处理多维特征的输入_第10张图片

神经网络

多个神经元之间连接就可以实现维度的变换。
不仅可以实现降维,还可以升维。注意:提升维度可以提高模型的非线性表达能力,即模型的学习能力。但不是维度越高越好,维度过高可能会出现过拟合的现象。所有我们最终还是要注意模型的泛化能力,模型的层数、维度的设置需要合理。(可以利用超参数搜索的方式选择)
处理多维特征的输入_第11张图片
构造一个人工神经网络:
处理多维特征的输入_第12张图片
构造学习器进行数据预测的流程:
处理多维特征的输入_第13张图片

构建模型

1. 数据准备

处理多维特征的输入_第14张图片

# prepare dataset
xy = np.loadtxt('diabetes.csv', delimiter=',', dtype=np.float32)
#delimiter:分隔符,dtype:数据类型。pycharm中通常是float32
x_data = torch.from_numpy(xy[:, :-1])  # 第一个‘:’是指读取所有行,第二个‘:’是指从第一列开始,最后一列不要
y_data = torch.from_numpy(xy[:, [-1]])  # [-1] 最后一列,保证是矩阵形式

2.定义模型

处理多维特征的输入_第15张图片

class Model(torch.nn.Module):
    def __init__(self):
        super(Model, self).__init__()
        self.linear1 = torch.nn.Linear(8, 6)  # 输入数据x的特征是8维,x有8个特征
        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))  # y hat
        return x

3.构建损失函数和优化器

处理多维特征的输入_第16张图片

# construct loss and optimizer
criterion = torch.nn.BCELoss(reduction='mean')
optimizer = torch.optim.SGD(model.parameters(), lr=0.1)

4. 训练

没有使用mini-batch,后续会讲。

epoch_list = []
loss_list = []
# training cycle forward, backward, update
for epoch in range(100):#没有使用mini-batch
    #forward
    y_pred = model(x_data)
    loss = criterion(y_pred, y_data)
    print(epoch, loss.item())
    epoch_list.append(epoch)
    loss_list.append(loss.item())
    #backward
    optimizer.zero_grad()
    loss.backward()
    #update
    optimizer.step()

完整代码

import numpy as np
import torch
import matplotlib.pyplot as plt

# prepare dataset
xy = np.loadtxt('diabetes.csv', delimiter=',', dtype=np.float32)
#delimiter:分隔符,dtype:数据类型。pycharm中通常是float32
x_data = torch.from_numpy(xy[:, :-1])  # 第一个‘:’是指读取所有行,第二个‘:’是指从第一列开始,最后一列不要
y_data = 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)  # 输入数据x的特征是8维,x有8个特征
        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))  # y hat
        return x


model = Model()

# construct loss and optimizer
criterion = torch.nn.BCELoss(reduction='mean')
optimizer = torch.optim.SGD(model.parameters(), lr=0.1)

epoch_list = []
loss_list = []
# training cycle forward, backward, update
for epoch in range(100):#没有使用mini-batch
    #forward
    y_pred = model(x_data)
    loss = criterion(y_pred, y_data)
    print(epoch, loss.item())
    epoch_list.append(epoch)
    loss_list.append(loss.item())
    #backward
    optimizer.zero_grad()
    loss.backward()
    #update
    optimizer.step()

plt.plot(epoch_list, loss_list)
plt.ylabel('loss')
plt.xlabel('epoch')
plt.show()

损失曲线图:
处理多维特征的输入_第17张图片

练习

请把sigmoid激活函数换成其他的激活函数。
处理多维特征的输入_第18张图片
各种激活函数图形曲线
处理多维特征的输入_第19张图片
各种激活函数介绍
处理多维特征的输入_第20张图片
处理多维特征的输入_第21张图片
注意:最后要将预测值归一化到【0,1】,所以最后一层激活函数还是要用sigmoid函数。

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