处理多维特征的输入

回顾

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

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

多维向量的逻辑回归

  • 首先模型会发生变化:
    在这里插入图片描述
    在这里插入图片描述

Mini-Batch

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

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

请利用下面这个代码写一个函数模型,完成线性模型的代码(降维到1维)
在这里插入图片描述

神经网络

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

构建模型

1. 数据准备

在这里插入图片描述

# 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.定义模型

在这里插入图片描述

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.构建损失函数和优化器

在这里插入图片描述

# 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()

损失曲线图:
在这里插入图片描述

练习

请把sigmoid激活函数换成其他的激活函数。
在这里插入图片描述
各种激活函数图形曲线
在这里插入图片描述
各种激活函数介绍
在这里插入图片描述
在这里插入图片描述
注意:最后要将预测值归一化到【0,1】,所以最后一层激活函数还是要用sigmoid函数。

  • 20
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值