手动实现打乱训练集并生成一个batch的简单方法

​ 在训练一个深度学习模型之前,我们会将数据集划分为训练集、验证集和测试集。在训练的时候,我们往往会将训练集打乱,划分成多个batch来进行训练。一般情况下,我们可以使用tf.data.Dataset或者tf.TFRecordReader()来实现。如果不使用这两个方法,我们利用numpy也可以实现这个功能。

​ 下面我将定义一个类,来简单实现这个功能:

import numpy as np

class Model(object):
    def __init__(self, X, y):
        # 测试集
		self.X_test = X[:10000]
        self.y_test = y[:10000]
        # 验证集
        self.X_val = X[10000:20000]
        self.y_val = y[10000:20000]
        # 训练集
        self.X_train = X[20000:]
        self.y_train = y[20000:]
	
    def train(self, iters, batch_size=8):
        """
        定义网络及操作
        ......
        """
        with tf.Session() as sess:
            # 初始化全局变量
            sess.run(init_op)
            # 开始训练
            for epoch in range(iters):	# 迭代轮数
                # 打乱数据
                permutation = np.random.permutation(len(self.y_train))
                # 遍历所有的batch
                loops = len(self.y_train) // batch_size
                for i in range(loops-1):
                    sess.run(train_op, feed_dict={x: self.X_train[permutation[i*batch_size: (i+1)*batch_size]],
                                                 y: self.y_train[permutation[i*batch_size: (i+1)*batch_size]]})
        

在初始化阶段,我将数据集进行了划分, 然后我利用numpy中的随机函数中的permutation函数来实现打乱数据集。这个函数的功能是生成由0到n之间整数的随机排列:

import numpy as np

permuation = numpy.random.permutation(10)
print(permutation)

"""
[out]: array([1, 0, 4, 9, 3, 5, 7, 8, 6, 2])
"""

通过这种方式,其实是将数据集的index打乱,然后通过这些打乱后的index去训练集中取一个batch的数据,直到取完所有数据。

​ 当然,你也可以先全部打乱所有数据,如:

self.X_train = self.X_train[permutation]
self.y_train = self.y_train[permutation]

但是不推荐这种办法,因为如果数据量很大的时候,这种操作会造成内存不足的问题。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要将时间序列数据划分为训练集和测试集,并分批次(batch),可以使用`torch.utils.data.Dataset`和`torch.utils.data.DataLoader`类来进行操作。 以下是一个示例: ```python import torch from torch.utils.data import Dataset, DataLoader # 自定义时间序列数据集类 class TimeSeriesDataset(Dataset): def __init__(self, data, window_size): self.data = data self.window_size = window_size def __len__(self): return len(self.data) - self.window_size + 1 def __getitem__(self, index): window = self.data[index:index+self.window_size] target = self.data[index+self.window_size] return window, target # 创建时间序列数据 data = range(100) # 指定窗口大小和批次大小 window_size = 10 batch_size = 5 # 将数据转换为时间序列数据集 dataset = TimeSeriesDataset(data, window_size) # 划分训练集和测试集 train_size = int(0.8 * len(dataset)) test_size = len(dataset) - train_size train_dataset, test_dataset = torch.utils.data.random_split(dataset, [train_size, test_size]) # 创建数据加载器 train_loader = DataLoader(train_dataset, batch_size=batch_size, shuffle=True) test_loader = DataLoader(test_dataset, batch_size=batch_size, shuffle=False) # 遍历每个批次数据 for batch in train_loader: print(batch) ``` 在这个示例中,我们首先创建了一个自定义的时间序列数据集类`TimeSeriesDataset`,该类继承自`torch.utils.data.Dataset`。在数据集类中,我们实现了`__len__()`和`__getitem__()`两个方法,分别用于返回数据集的长度和获取指定索引处的数据窗口和目标值。 然后,我们创建了一个包含100个时间序列数据的数据集,并将其转换为时间序列数据集`dataset`。 接下来,我们使用`torch.utils.data.random_split()`函数将数据集划分为训练集和测试集,其中80%的数据用于训练集,20%的数据用于测试集。 然后,我们使用`DataLoader`类创建训练集和测试集的数据加载器`train_loader`和`test_loader`,其中指定了批次大小为5,并设置了相应的shuffle参数。 最后,我们使用`for`循环遍历训练集数据加载器中的每个批次,并打印出来。 运行代码后,将会得到按照指定批次大小划分的训练集数据批次。你可以根据需要调整窗口大小和批次大小,并对测试集数据加载器进行相同的操作。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值