【多输入模型 Multiple-Dimension 数学原理分析以及源码详解 深度学习 Pytorch笔记 B站刘二大人 (6/10)】

14 篇文章 0 订阅
11 篇文章 0 订阅

多输入模型 Multiple-Dimension 数学原理分析以及源码源码详解 深度学习 Pytorch笔记 B站刘二大人(6/10)

数学推导

在之前实现的模型普遍都是单输入单输出模型,显然,在现实场景中更多的是多输入多输入模型。在本文中将主要推导,多输入模型中的内部数据传输变化,以及内部矩阵运算过程

在这里插入图片描述

使用Mini-batch 模块,多个维度线性层共同使用一组权重w的线性组合,共享权重可以极大减小运算量。转化为矩阵运算的意义是希望通过转化为矩阵实现并行运算,进行gpu的挂载
在这里插入图片描述
在本次的实践数据中使用的是糖尿病病人的数据集,通过维度为8的输入数据,即利用8种病人自身的评价指标的数据,对该样本病人是否患有糖尿病进行判断。
在这里插入图片描述

假设输入训练数据量为N,则输入数据为一个8*N的矩阵,如上图所示。

在之前的文章中已经进行了强调,要将数据运算的过程视为矩阵的运算,因此需要维度为8的权重向量w与原始数据进行矩阵乘法,N8的矩阵与81的矩阵右乘,则得到N*1的矩阵,加上偏置量b,通过激活函数sigmoid转化为概率,通过概率进行判别。
在这里插入图片描述

虽然在原理上,是直接通过8*1的权重矩阵w进行构造,但是实际构造为了提高准确性,通常会将单个线性层拆分为多层,例如在本文的代码实现中就将 8 -> 1 层的网络结构转换为 8 -> 6 -> 4 -> 1 的多层网络结构。
在这里插入图片描述

将8维空间的数据转化为1维,通过多个线性层与激活函数的组合,模拟多个空间非线性变换,从而达到不同的设计目的。一般隐层越多,学习能力越强,但是必须考虑泛化能力

数据下载

链接:https://pan.baidu.com/s/1IJpTM1_gd4Tln01A5JYOSA?pwd=ws2r
提取码:ws2r

代码解读与实现

代码细节,loadtxt函数dtype选择 .float32类型 ,原因:绝大部分的显卡仅支持float32位的数据

其次本次代码在进行损失计算中,选用的是average = True,意味着将损失将取平均值,损失值和梯度将较大,优化器的迭代步长可以适当调大

''' coding:utf-8 '''
"""
作者:shiyi
日期:年 09月 03日
通过pytorch模块复现多输入线性模型
"""

# prepare dataset

import torch
import numpy as np

xy = np.loadtxt('D:\\pytorch_prac\\dataset\\diabetes.csv.gz', delimiter=',', dtype=np.float32)          # 使用float32位的数据,以支持绝大部分GPU的数据格式
x_data = torch.from_numpy(xy[:, :-1])           # 读取输入数据,xy[:,:-1] 意思是读取 除了最后1列 的其余所有行数据
y_data = torch.from_numpy(xy[:, [-1]])          # 读取标签数据,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)
        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,防止传输出错
        x = self.sigmoid(self.linear2(x))
        x = self.sigmoid(self.linear3(x))
        return x


model = Model()     # 实例化

# Construct loss and optimizer
cirterison = torch.nn.BCELoss(size_average=True)
opimizer = torch.optim.ASGD(model.parameters(), lr=0.05)

# Training cycle
for epoch in range(3000):
    # Forward
    y_pred = model(x_data)
    loss = cirterison(y_pred, y_data)
    print(epoch, loss.item())

    # Bcakward
    opimizer.zero_grad()
    loss.backward()

    # Update
    opimizer.step()

# Test Model
x_test = torch.Tensor([[4.0, 5.0, 3.0, 4.0, 1.0, 6.0, 7.0, 8.0]])
y_test = model(x_test)

print('y_pred =', y_test.item())

与其余的模型不同的是,本次的多输入模型训练的损失始终难以下降到一个令人满意的程度,这与损失构造算法和优化器类型都存在关系,可以尝试更换通过matplotlib库画出图形进行比对和优化

优化代码与结果

(更新中,我真是擅长给自己挖坑呢。。。。)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

狗头狗不狗

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

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

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

打赏作者

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

抵扣说明:

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

余额充值