《PyTorch深度学习实践》第七讲 处理多维特征的输入

news/2024/11/17 1:27:40/

b站刘二大人《PyTorch深度学习实践》课程第七讲处理多维特征的输入笔记与代码:https://www.bilibili.com/video/BV1Y7411d7Ys?p=7&vd_source=b17f113d28933824d753a0915d5e3a90


Diabetes Dataset

  • 每一行是一个记录
  • 每一列是一个特征,每个样本有8个特征
image-20230701135124288

每个样本不再是一个特征,即模型输入变成了多维,那么就要将所有特征乘以相应的权重然后再累加起来

image-20230701135715087

Mini-Batch(N samples)

  • 向量化形式

    • 可以用上并行计算
    image-20230701140237529
image-20230701140318302
  • Linear的第一个参数是输入特征数,第二个是输出特征数
image-20230701140602305
  • 通过引入激活函数 σ \sigma σ,给线性变换增加非线性因子,这样就可以去拟合非线性变换
image-20230701141213192 image-20230701141243980
  • 学习能力越强,有可能会把输入样本中噪声的规律也学到,而我们要学习的是数据本身真实数据的规律,因此关键的是模型的泛化能力

例子:Artificial Neural Network -> Diabetes Prediction

image-20230701141917363
  • Prepare dataset:

    import numpy as np
    import torchxy = np.loadtxt('dataset/diabetes.csv.gz', delimiter=',', dtype=np.float32)
    # :表示所有行;:-1表示第一列开始,最后一列(-1)不要,最后一列是分类(这是输出)
    x_data = torch.from_numpy(xy[:, :-1])  
    # : 表示所有行;[-1]表示只要最后一列,加中括号意味着取出后是一个矩阵,不加则是向量
    y_data = torch.from_numpy(xy[:, [-1]])  
    

    数据集放到和源代码同一个存储目录下即可,代码目录是Liuer_lecturer,数据集放在Liuer_lecturer/dataset

    image-20230701142807927 image-20230701143747036
    • delimiter是分隔符;dtype是指定数据类型

      • 用float32是因为常用的GPU(1080,2080等)中都只支持32位浮点数,因此在神经网络计算中通常使用32位浮点数
    • 可以用print查看数据,如下是print(x_data)

      image-20230701143047352
  • Design model using class:

    image-20230701144621272
    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)# 激活函数# 之前的是调用torch.nn.Functional的sigmoid函数# 现在调用的是nn下的模块,把它当成一个层(运算模块)构建计算图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 xmodel = Model()
    
  • Construct loss and optimizer:

    image-20230701144806211
    # criterion = torch.nn.MSELoss(size_average=True) pytorch更新后被弃用了
    criterion = torch.nn.BCELoss(reduction='mean')
    optimizer = torch.optim.SGD(model.parameters(), lr=0.01)
    
  • Training cycle:

    image-20230701145102335
    • 此处没做mini-batch,而是将全部数据放进去,mini-batch后续才讲
    # 训练过程
    for epoch in range(100):# 前馈y_pred = model(x_data)              # 计算y_hatloss = criterion(y_pred, y_data)    # 计算损失print(epoch, loss.item())# 反馈optimizer.zero_grad()   # 在反向传播开始将上一轮的梯度归零loss.backward()         # 反向传播(计算梯度)# 更新optimizer.step()        # 更新权重w和偏置b
    

完整代码:

import torch
import numpy as np
import matplotlib.pyplot as plt# 建立数据集
xy = np.loadtxt('dataset/diabetes.csv.gz', delimiter=',', dtype=np.float32)
x_data = torch.from_numpy(xy[:, :-1])   # :表示所有行;:-1表示第一列开始,最后一列(-1)不要,最后一列是分类(这是输出)
y_data = torch.from_numpy(xy[:, [-1]])  # : 表示所有行;[-1]表示只要最后一列,加中括号意味着取出后是一个矩阵,不加则是向量# 用于绘图
epoch_list = []
loss_list =[]# 定义模型
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 xmodel = Model()# criterion = torch.nn.MSELoss(size_average=True) pytorch更新后被弃用了
criterion = torch.nn.BCELoss(reduction='mean')
optimizer = torch.optim.SGD(model.parameters(), lr=0.01)# 训练过程
for epoch in range(1000):# 前馈y_pred = model(x_data)              # 计算y_hatloss = 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()        # 更新权重w和偏置b# 绘制loss曲线
plt.plot(epoch_list, loss_list)
plt.ylabel('loss')
plt.xlabel('epoch')
plt.show()
image-20230701145749724
image-20230701145408508 image-20230701145551850

http://www.ppmy.cn/news/673299.html

相关文章

华为p9plus手机误删照片怎么恢复

如今手机制造技能的越来越成熟,现在的手机不只功用越来越强大,并且报价也越来越低廉。所以人手一部手机现已不算啥,很多人甚至一人好几部手机。并且,如今华为p9plus手机的通讯功用反而在不断地弱化,摄影娱乐成了主流&a…

TLD7002学习笔记(三)-使用S32K144EVB烧录TLD7002

文章目录 1. 前言2. 烧录数据准备2.1 OTP Wizard的下载与安装2.2 OTP Wizard的配置2.3 OTP寄存器烧录数据提取 3. OTP烧录和仿真的流程3.1 OTP烧录流程3.2 OTP仿真流程 4. 验证测试4.1 测试代码4.2 测试环境4.3 测试情况 5. 参考资料 1. 前言 本篇文章是TLD7002学习笔记的第三…

Unity导出到AS中真机测试apk没有问题,aab提交到GooglePlay审核通过,但是从Google Play下载的应用闪退问题

从Google Play下载的应用报错如下: backtrace: #00 pc 0x0000000000050748 /data/app/~~x94h_Fmdoj4Vj1NVQcL7sQ/com.id.hhhuhi-LpC7BJqILn3X29R8TffhuA/split_config.arm64_v8a.apk!libpairipcore.so (ExecuteProgram196) 06-26 20:39:40.526 13936 13936 F l…

经纬度导入arcgis【自用】

有经纬度,如何落到gis上: 先把表格导入gis,按XY显示 注意,要把点变成地理坐标系!(1984)方法如下: 工具箱 - data management tools - projections and transformations - define …

缺了华为这个对手 三星利润跌幅将过半

【TechWeb】路透社报道,三星第二季度利润恐怕会缩水一半以上,因为三星向华为的芯片出货量下降导致了价格挤压和供过于求。 近年来,华为手机出货量越来越高,有业内人士表示,近几年华为吃掉的都是三星的份额,…

三星电子2017年研发投入位列全球第四 华为第六

据韩联社12月11日报道,欧盟委员会月初公布的2017年产业研发投入排行榜显示,三星电子以122亿欧元位列全球第4,较2016年下降两个名次,但仍连续6年跻身前五。 据悉,2016财年韩企研发投入增长1.9%,远低于5.8%的…

三星总裁强硬回应华为,未来十年三星依然领先!

三星电子总裁高东真在接受采访时谈及了三星对未来手机技术革命的看法,他表示,三星会通过不断创新来留住“未来10年”的优势地位。而此前华为终端CEO余承东表示今年华为荣耀很可能会超越三星成为世界第一。似乎华为和三星这两家安卓手机厂商的火药味特别浓…

2018年全球智能手机市场报告出炉,华为和苹果之间只差280万部出货量...

2018年,华为、小米、OPPO、VIVO四大头部智能手机厂商总出货量占国内78%以上。 近日,市场研究公司IDC发布了2018年全球智能手机市场报告,也为去年全年各大手机厂商做了一次年终总结。 据IDC数据统计显示,2018年手机市场有所萎缩&…