Pytorch深度学习实践课程-处理多维特征输入

导入

前几节主要讨论的是一维特征的输入(即一个x:实数)
单维:输入x是一个实数。
多维:x有不同的特征,预测对应的分类。
回归问题:输出值y 是一个实数。
分类问题:输出y是属于一个离散的集合。

数据集介绍

如下图 是个糖尿病的数据集,一行是一个样本,共有八个特征,一列是一个特征(10维)。最终输出的值是一个y(取值只有0和1,代表分类任务)
在这里插入图片描述

一维到多维:模型的改变

一维:x是一个实数,所以乘以一个w权重即可。
多维:因为最终的输出值y是一个实数,所以每一个Xi的值都要和一个权重w相乘。即下图的右。
在这里插入图片描述

转化成向量运算,可以利用并行能力来提高运行速度。
在这里插入图片描述
代码部分相对于上节课内容只需修改数据准备和模型部分

如何构造多层神经网络

神经网络的本质:寻找一种非线性的空间变换函数(矩阵)(从N维到一维,通过引入sigmoid等激活函数给线性变换增加非线性因子)
神经网络到底设多少层,每层多少维,一般通过超参数搜索的方法进行尝试,看什么样的设计在开发集表现比较好。
在这里插入图片描述

代码实现

代码运行在jupyter上

激活函数采用sigmoid函数

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

#这里之所以设置为float32是因为大部分显卡的存储都支持,只有少部分高端显卡支持double
xy = np.loadtxt('data/diabetes.csv.gz', delimiter=',', dtype=np.float32)
x_data = torch.from_numpy(xy[:, :-1])
y_data = torch.from_numpy(xy[:, [-1]])


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.activate = torch.nn.Sigmoid()

	#构建计算图,三层网络,为了简便,统一设为x,实际图应为o1,o2,o3
    def forward(self, x):
        x = self.activate(self.linear1(x))
        x = self.activate(self.linear2(x))
        x = self.activate(self.linear3(x))
        return x


model = Model()
criterion = torch.nn.BCELoss(reduction='mean')
optimizer = torch.optim.SGD(model.parameters(), lr=0.1)

epoch_list = [i for i in range(1, 101)]
loss_list = []
for epoch in range(100):
    # Forward
    y_pred = model(x_data)
    loss = criterion(y_pred, y_data)
    loss_list.append(loss.item())
    print(epoch, loss.item())
    # Backward
    optimizer.zero_grad()
    loss.backward()
    # Update
    optimizer.step()

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




注意:diabetes.csv数据集如果加载不出:原因是该数据集和源代码没有放置在同一个文件夹内(必须要放在同一个文件夹内)
结果展示
在这里插入图片描述

激活函数用ReLU函数实现

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

xy = np.loadtxt('diabetes.csv.gz', delimiter=',', dtype=np.float32)
x_data = torch.from_numpy(xy[:, :-1])
y_data = torch.from_numpy(xy[:, [-1]])


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.activate = torch.nn.ReLU()
        self.sigmoid = torch.nn.Sigmoid()

	#最后一层使用sigmoid,保证概率输出曲线光滑,且relu输出如果小于1,他是直接输出0的,  所以sigmoid就可以得到小数,o-
#1之间的取值)
    def forward(self, x):
        x = self.activate(self.linear1(x))
        x = self.activate(self.linear2(x))
        x = self.sigmoid(self.linear3(x))
        return x


model = Model()
criterion = torch.nn.BCELoss(reduction='mean')
optimizer = torch.optim.SGD(model.parameters(), lr=0.1)

epoch_list = [i for i in range(1, 101)]
loss_list = []
for epoch in range(100):
    # Forward
    y_pred = model(x_data)
    loss = criterion(y_pred, y_data)
    loss_list.append(loss.item())
    print(epoch, loss.item())
    # Backward
    optimizer.zero_grad()
    loss.backward()
    # Update
    optimizer.step()

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


结果展示
在这里插入图片描述
注意:即使是相同的超参数设置,每次训练的曲线也是不同的

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
PyTorch一个用于深度学习的开源框架,它提供了一组工具和接口,使得我们可以轻松地进模型训练、预测和部署。在PyTorch中,数据处理深度学习应用的重要部分之一。 PyTorch中的数据处理主要涉及以下几个方面: 1.数据预处理:包括数据清洗、数据归一化、数据增强等操作,以提高模型的鲁棒性和泛化能力。 2.数据加载:PyTorch提供了多种数据加载方式,包括内置的数据集、自定义的数据集和数据加载器等,以便我们更好地管理和使用数据。 3.数据可视化:为了更好地理解数据和模型,PyTorch提供了多种数据可视化工具,如Matplotlib、TensorBoard等。 下面是一个简单的数据预处理示例,展示如何将图像进归一化和数据增强: ```python import torch import torchvision.transforms as transforms from torchvision.datasets import CIFAR10 # 定义一个数据预处理管道 transform_train = transforms.Compose([ transforms.RandomCrop(32, padding=4), transforms.RandomHorizontalFlip(), transforms.ToTensor(), transforms.Normalize(mean=[0.4914, 0.4822, 0.4465], std=[0.2023, 0.1994, 0.2010]) ]) # 加载CIFAR10数据集,进处理 trainset = CIFAR10(root='./data', train=True, download=True, transform=transform_train) trainloader = torch.utils.data.DataLoader(trainset, batch_size=128, shuffle=True, num_workers=2) ``` 在上面的例子中,我们首先定义了一个数据预处理管道,其中包括了对图像进随机裁剪、水平翻转、归一化等操作。然后,我们使用PyTorch内置的CIFAR10数据集,并将其预处理后,使用DataLoader进批量加载。这个过程可以帮助我们更好地管理和使用数据,同时提高模型的训练效率和泛化能力。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值