跟着刘二大人学pytorch(第---7---节课之多维特征作为输入)

0 前言

0.1、课程链接:

《PyTorch深度学习实践》完结合集
有大佬已经写好了笔记:大佬的笔记
pytorch=0.4

0.2、课件下载地址:

链接:https://pan.baidu.com/s/1_J1f5VSyYl-Jj2qIuc1pXw
提取码:wyhu

7、处理多维特征的输入

以前的输入只是一个实数
这一集讲解输入有多个维度
在这里插入图片描述
本节使用的数据集:糖尿病的分类
一行叫做一个sample
一列叫做一个feature即特征
在这里插入图片描述
sklearn的糖尿病数据集可以Anaconda/lib/sklearn/data下看,文件格式为.gz文件
在这里插入图片描述
mini-batch
pytorch中的函数继承自module的函数都支持向量化函数,即是按元素的,看下图:
在这里插入图片描述
变成向量化这样的方式可以提高计算的速度
在这里插入图片描述
在这里插入图片描述
将linear改成输入为8输出为1的即可

构造多层的网络怎么搞?

单层的是输入特征维度为8,输出特征维度为1,所以有下面的写法在这里插入图片描述
假如写成了linear(8,2),输入维度为8,输出维度则为2,维度为2这样不符合任务的类型,我们的任务输出维度应该是1.此时添加一个linear(2,1)即可
在这里插入图片描述
可以将矩阵看作是一种空间到另一种空间线性变换的转换函数。
将N维空间映射到M维空间中去。
在这里插入图片描述
因此linear(8,2):指的是将一个8维空间线性映射到一个2维空间中
注意:现实中需要做的任务经常要做的空间变换不都是线性的,一般是非常复杂的非线性,所以我们需要用多个线性变换层,通过找到最优的权重,把这些层给组合起来,来模拟非线性的变换。因此,神经网络本质上是在寻找一种非线性的空间变换函数。

神经网络的本质

本质:神经网络本质上是在寻找一种非线性的空间变换函数。

我们的目标是找到8维到1维的非线性变换。
linear可以做到空间维度变换。
linear之后跟上非线性变换西格玛。
激活函数给线性变换增加非线性因子(因素),这样就使得可以拟合相应的非线性变换。
多层的线性层非线性化然后进行任意组合
在这里插入图片描述
变换的维度和层数决定了网络的复杂程度,具体值取什么比较好,这就是典型的超参数搜索问题。
一般来说隐层的数量越多,神经元越多,对非线性的变换就学习的越强。
不是学习能力越强越好。
学习能力太强会把输入数据中的噪声的规律也给学会,这个噪声和应用场景中的噪声是不一样的,因此要学习的东西是数据真值本身的规律。学习能力必须要有泛化的能力才是最好的。

1、读文档能力
2、基本的架构理解(cpu、主机、编译原理等)(核心能力)
我们需要的是能抓住问题核心的模型,不要学习能力太强(连噪声都不放过)的模型
举例:
在这里插入图片描述
在这里插入图片描述
Y:表示一年后这个人的糖尿病病情是否会加重
这种预测也会发生在保险业
在这里插入图片描述
N卡GPU中只支持32位float的数据,比较贵的显卡如特斯拉系列的显卡才支持双精度的数据格式。
:-1:表示最后一列元素不要
[-1]:拿出最后一列,写中括号是为了是一个矩阵,直接写-1,出来的是一个向量
在这里插入图片描述
这个会出来两个Tensor
在这里插入图片描述在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
修改激活函数,只需要改变下面两个位置就可以了
在这里插入图片描述
代码:

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

# prepare dataset
xy = np.loadtxt('diabetes.csv', delimiter=',', dtype=np.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(size_average = True)
# criterion = torch.nn.BCELoss(reduction='mean')
criterion = torch.nn.BCELoss()
optimizer = torch.optim.SGD(model.parameters(), lr=0.1)

epoch_list = []
loss_list = []
# training cycle forward, backward, update
for epoch in range(100000):
    y_pred = model(x_data)
    loss = criterion(y_pred, y_data)
    print(epoch, loss.item())
    epoch_list.append(epoch)
    loss_list.append(loss.item())

    optimizer.zero_grad()
    loss.backward()

    optimizer.step()

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

100epoch:
在这里插入图片描述

1000epoch:
在这里插入图片描述

10000epoch:
在这里插入图片描述

100000epoch:
在这里插入图片描述

  • 26
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

饿了就干饭

你的鼓励将是我创作的最大动力~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值