码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 【PyTorch】深度学习实践之多维度输入Multiple Dimension Input


    本文目录

    • 多维度特征的数据集
    • 多层神经网络的计算图
    • 实现糖尿病预测:
      • 代码:
      • 结果:
      • 补充知识:
    • 练习:尝试不同的激活函数
      • tips:
      • 代码:
      • 结果:
    • 学习资料
    • 系列文章索引

    多维度特征的数据集

    每一行代表一个样本,每一列代表一重要特征Feature
    [图片]

    [图片]

    在机器学习和数据库中处理数据的方式略有不同。在机器学习里面,拿到数据表之后,把内容分成两部分,一部分作为输入x,另一部分作为输入y。如果训练是从数据库读数据,就把x读出来构成一个矩阵,把y字段读出来构成一个矩阵,就把输入的数据集准备好了。
    如下图:Anaconda的安装目录下已经给我们准备好了一些数据集,gz是linux下非常流行的压缩格式。
    [图片]

    一个样本多个特征的计算图,如图所示:
    [图片]

    多个样本多个特征的计算图,如下:
    [图片]

    模型采用一层线性函数self.linear = torch.nn.Linear(8, 1),函数的输入的特征维度为8,输出的维度为1,如下图:
    [图片]

    中间线性层加入了sigmoid非线性函数进行非线性变化。
    [图片]

    多层神经网络的计算图

    中间隐层越多,中间步骤越多,神经元越多,学习能力越强。与此同时,也会学会更多噪声。
    [图片]

    [图片]

    实现糖尿病预测:

    代码:

    [图片]
    在这里插入图片描述

    import numpy as np 
    import torch
    import matplotlib.pyplot as plt
    
    #1.Prepare Dataset
    xy = np.loadtxt('diabetes.csv.gz', delimiter=',', dtype=np.float32) 
    x_data = torch.from_numpy(xy[:,:-1]) 
    y_data = torch.from_numpy(xy[:, [-1]])
    
    #2. Define Model
    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 x
    model = Model()
    #3.Construct Loss and Optimizer
    criterion = torch.nn.BCELoss(size_average=True)
    optimizer = torch.optim.SGD(model.parameters(), lr=0.1)
    
    #4. Train Cycle
    epoch_list=[]
    loss_list=[]
    
    for epoch in range(100): 
            # Forward 
            y_pred = model(x_data)
            loss = criterion(y_pred, y_data) 
            print(epoch, loss.item())
            # Backward 
            optimizer.zero_grad() 
            loss.backward()
            # Update 
            optimizer.step()
            epoch_list.append(epoch+1)
            loss_list.append(loss.item())
    # 画图
    plt.plot(epoch_list,loss_list)
    plt.xlabel("epoch")
    plt.ylabel("'loss")
    plt.grid()
    plt.show()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49

    结果:

    [图片]

    补充知识:

    查看参数

    • 如果想查看某些层的参数,以神经网络的第一层参数为例,可按照以下方法进行:
    # 参数说明
    # 第一层的参数:
    layer1_weight = model.linear1.weight.data
    layer1_bias = model.linear1.bias.data
    print("layer1_weight", layer1_weight)
    print("layer1_weight.shape", layer1_weight.shape)
    print("layer1_bias", layer1_bias)
    print("layer1_bias.shape", layer1_bias.shape)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    [图片]

    更改评估指标

    • 更改epoch为100000,以准确率acc为评价指标,源代码和结果如下:
    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]) # 第一个‘:’是指读取所有行,第二个‘:’是指从第一列开始,最后一列不要
    print("input data.shape", x_data.shape)
    y_data = torch.from_numpy(xy[:, [-1]]) # [-1] 最后得到的是个矩阵
     
    # print(x_data.shape)
    # design model using class
     
     
    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, 2)
            self.linear4 = torch.nn.Linear(2, 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
            x = self.sigmoid(self.linear4(x))  # y hat
            return x
     
     
    model = Model()
     
    # construct loss and optimizer
    # criterion = torch.nn.BCELoss(size_average = True)
    criterion = torch.nn.BCELoss(reduction='mean')
    optimizer = torch.optim.SGD(model.parameters(), lr=0.1)
     
    # 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())
     
        optimizer.zero_grad()
        loss.backward()
        optimizer.step()
     
        if epoch%100000 == 99999:
            y_pred_label = torch.where(y_pred>=0.5,torch.tensor([1.0]),torch.tensor([0.0]))
     
            acc = torch.eq(y_pred_label, y_data).sum().item()/y_data.size(0)
            print("loss = ",loss.item(), "acc = ",acc)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53

    [图片]

    练习:尝试不同的激活函数

    采用不同的激活函数进行训练,并画出不同激活函数的损失曲线进行比较。

    • 查看激活函数及导数图像:https://dashee87.github.io/data%20science/deep%20learning/visualising-activation-functions-in-neural-networks/
    • 查看pytorch提供的激活函数:https://pytorch.org/docs/stable/nn.html#non-linear-activations-weighted-sum-nonlinearity

    [图片]

    [图片]

    tips:

    注意:(激活函数种类很多,采用RuLU激活函数时需要注意)
    现在非常流行使用RuLU激活函数,但是RuLU存在的问题是当激活函数的输入为小于0时,激活函数的梯度就变为0,不会继续更新维度,所以采用RuLU需要注意。
    一般如果做分类,采用RuLU激活函数都是在前面的层数,最后一层激活函数不要使用RuLU,一般会采用sigmoid的。

    代码:

    数据集diabetes.csv.gz需要在anaconda中找到放在代码目录下。
    激活函数最后一层统一采用sigmoid。

    import numpy as np 
    import torch
    import matplotlib.pyplot as plt
    
    #1.Prepare Dataset
    xy = np.loadtxt('diabetes.csv.gz', delimiter=',', dtype=np.float32) 
    x_data = torch.from_numpy(xy[:,:-1]) 
    y_data = torch.from_numpy(xy[:, [-1]])
    
    #2. Define Model
    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()
            def forward(self, x): 
                    x = self.activate(self.linear1(x)) 
                    x = self.activate(self.linear2(x)) 
                    x = F.sigmoid(self.linear3(x)) 
                    return x
    model = Model()
    #3.Construct Loss and Optimizer
    criterion = torch.nn.BCELoss(size_average=True)
    optimizer = torch.optim.SGD(model.parameters(), lr=0.1)
    
    #4. Train Cycle
    epoch_list=[]
    loss_relu=[]
    
    for epoch in range(100): 
            # Forward 
            y_pred = model(x_data)
            loss = criterion(y_pred, y_data) 
            print(epoch, loss.item())
            # Backward 
            optimizer.zero_grad() 
            loss.backward()
            # Update 
            optimizer.step()
            epoch_list.append(epoch+1)
            loss_relu.append(loss.item())
    # 画图
    plt.plot(epoch_list,loss_relu)
    plt.xlabel("epoch")
    plt.ylabel("'loss")
    plt.grid()
    plt.show()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49

    结果:

    • Sigmoid
      [图片]

    • ReLu
      [图片]


    学习资料

    • https://blog.csdn.net/qq_42585108/article/details/108150913
    • https://blog.csdn.net/qq_42764492/article/details/112745651
    • https://blog.csdn.net/bit452/article/details/109682078?spm=1001.2101.3001.6650.3&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-3-109682078-blog-123956650.pc_relevant_multi_platform_whitelistv3&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-3-109682078-blog-123956650.pc_relevant_multi_platform_whitelistv3&utm_relevant_index=5

    系列文章索引

    教程指路:【《PyTorch深度学习实践》完结合集】 https://www.bilibili.com/video/BV1Y7411d7Ys?share_source=copy_web&vd_source=3d4224b4fa4af57813fe954f52f8fbe7

    1. 线性模型 Linear Model
    2. 梯度下降 Gradient Descent
    3. 反向传播 Back Propagation
    4. 用PyTorch实现线性回归 Linear Regression with Pytorch
    5. 逻辑斯蒂回归 Logistic Regression
    6. 多维度输入 Multiple Dimension Input
    7. 加载数据集Dataset and Dataloader
    8. 用Softmax和CrossEntroyLoss解决多分类问题(Minst数据集)
    9. CNN基础篇——卷积神经网络跑Minst数据集
    10. CNN高级篇——实现复杂网络
    11. RNN基础篇——实现RNN
    12. RNN高级篇—实现分类
  • 相关阅读:
    RequestMappingHandlerAdapter类简介说明
    取色器实战(Qt含源码)
    springboot(13):spring 过滤器和拦截器的区别
    Java中静态常量和枚举类的区别
    历届蓝桥杯青少年编程选拔赛 科技素养题真题讲解 STEMA评测比赛真题解析【持续更新 已更新至18套】
    Android多种方法获取系统属性
    Prometheus部署、操作及Grafana展示、告警
    原料厂与烧结工艺
    测试用例的八大基本准则
    VsCode 配置java环境(详细教程)
  • 原文地址:https://blog.csdn.net/qq_43800119/article/details/126415596
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号