IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 人工智能 -> pytorch使用GRU等做时序预测的Dataloader如何构建 -> 正文阅读

[人工智能]pytorch使用GRU等做时序预测的Dataloader如何构建

一、本文所关注的内容

本文主要聚焦以下几个问题:

  • pytorch的Dataloader中设置shuffle=True的时候究竟打乱的是什么
  • 在构建时序数据的时候,可不可以设置shuffle=True

二、时序数据与非时序数据的区别

在非时序预测中,在自定义dataset的时候根据index直接返回对应索引的一个样本就行了,此时不管dataloader是否设置shuffle=True,都可以正常返回数据,只是shuffle=False的时候可能会稍微影响性能。

但是在时序数据里,如果我们不提前把数据处理成:一个样本就是一个序列。的形式,那么就需要在dataset中自己手动取一个序列,此时需要考虑是否打乱了,打乱会不会让时序关系彻底乱了。

什么意思呢,再解释一下,正常来说我们的数据是这样的:每一个样本就是一个一维向量。下面就是每一个样本有7个特征,一共100个样本。

data = [[i] * 7 for i in range(100)]
data = np.array(data)

如果没有时序关系,每次就取一行拿来训练就完了。此时Dataset就可以这样定义:

class aiDataset(Dataset):
    def __init__(self, features, labels):
        self.features = features
        self.labels = labels

    def __getitem__(self, index):
        feature = self.features[index] # .values
        if self.labels is not None:
            label = self.labels[index]
            return feature, label
        else:
            return feature

    def __len__(self):
        return len(self.features)

如果这100个数据是按照时间的,他们有时序关系,而我们又要使用GRU或者LSTM来做,那么我们的输入就不是一个时刻的数据了,而是当前时刻(含)之前若干个时刻组成的序列。当然,我们可以提前写一个for循环,把所有的序列组成一个新的矩阵,比如:

    X = []
    y = []
    window_size = 2

    for i in range(len(data) - window_size):
        X.append(data[i:i+window_size, :])
        y.append(labels[i+window_size-1])

    X = np.array(X)
    y = np.array(y)

    print(X.shape)  # [N-window_size, window_size, features_num]
    print(y.shape)  # [N-window_size]

但是,当数据量很大的时候,可能这个循环就要好久,好不如直接写在dataset里。

class aiDataset(Dataset):
    def __init__(self, features, labels, window_size=2):
        self.window_size = window_size
        self.features = features
        self.labels = labels

    def __getitem__(self, index):
        feature = self.features[index:index+self.window_size, :] # .values
        if self.labels is not None:
            label = self.labels[index+self.window_size-1]
            return feature, label
        else:
            return feature

    def __len__(self):
        return len(self.features) - self.window_size

那么这就是时序数据在定义dataset的时候和非时序数据的区别了。

三、时序数据要不要设置shuffle=True

当我们定义好dataset之后,不出意外的话,就可以直接定义dataloader了。

data = [[i] * 7 for i in range(100)]
    data = np.array(data)
    labels = [i*2 for i in range(100)]

    train_dataset = aiDataset(data, None, 4) # window_size设置为4
    train_loader = DataLoader(train_dataset, batch_size=2, shuffle=True, num_workers=2)

上面的代码我们设置了shuffle=True,我们来看看每一个batch的东西是什么。

可以看到,即便设置了shuffle=True,每一个batch中的每一个样本依然是按照原来的时序关系的,所以不需要担心shuffle会打乱原来的时序数据。
在这里插入图片描述

四、Dataloader中的shuffle到底shuffle了什么。

这个其实很简单,具体可以看dataloader的源码,比较简单,结论就是打乱的是index,所以我们看到的上面图中同一个batch内的样本是随机的,但是一个样本内是有序的。

  人工智能 最新文章
2022吴恩达机器学习课程——第二课(神经网
第十五章 规则学习
FixMatch: Simplifying Semi-Supervised Le
数据挖掘Java——Kmeans算法的实现
大脑皮层的分割方法
【翻译】GPT-3是如何工作的
论文笔记:TEACHTEXT: CrossModal Generaliz
python从零学(六)
详解Python 3.x 导入(import)
【答读者问27】backtrader不支持最新版本的
上一篇文章      下一篇文章      查看所有文章
加:2022-11-05 00:28:48  更:2022-11-05 00:30:12 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/19 23:29:22-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码