【问题标题】:Confusion in understand python commands for deep learning理解用于深度学习的 python 命令的困惑
【发布时间】:2019-06-17 20:11:54
【问题描述】:

我最近开始使用这个 tutorial 使用 pytorch 学习深度学习。

我对这些代码行有疑问。

参数train=True表示将取出训练数据。

但是训练 50% 需要多少数据?

我们如何指定训练的数据量。同样,无法理解batch_sizenum_workers,加载数据数据是什么意思? batch_size 参数是否类似于深度学习中用于训练的参数?

                                        download=True, transform=transform)
trainloader = torch.utils.data.DataLoader(trainset, batch_size=4,
                                          shuffle=True, num_workers=2)

testset = torchvision.datasets.CIFAR10(root='./data', train=False,
                                       download=True, transform=transform)
testloader = torch.utils.data.DataLoader(testset, batch_size=4,
                                         shuffle=False, num_workers=2)

【问题讨论】:

    标签: python deep-learning pytorch


    【解决方案1】:

    batch_size 是您想要的批次大小(来自您提供的数据集的数据组),num_workers 是处理批次的工人数量,基本上是多处理工人。

    但是训练 50% 需要多少数据?

    DataLoader 不提供任何方式来控制您希望提取的样本数量。您将不得不使用切片迭代器的典型方法。

    要做的最简单的事情(没有任何库)是在达到所需的样本数量后停止。

    nsamples = 10000
    for i, image, label in enumerate(train_loader):
        if i > nsamples:
            break
    # Your training code here.
    

    或者,您可以使用 itertools.islice 获取前 10k 个样本。像这样。

    for image, label in itertools.islice(train_loader, stop=10000):
    
        # your training code here.
    

    你可以参考这个answer

    【讨论】:

      【解决方案2】:

      如果您之前没有拆分数据,trainloader 将使用整个 train 文件夹。您可以通过拆分数据来指定训练量,请参阅:

      from torchvision import datasets
      
      # convert data to a normalized torch.FloatTensor
      transform = transforms.Compose([
          transforms.ToTensor(),
          transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))
          ])
      
      # choose the training and test datasets
      train_data = datasets.CIFAR10('data', train=True,
                                    download=True, transform=transform)
      test_data = datasets.CIFAR10('data', train=False,
                                   download=True, transform=transform)
      valid_size = 0.2
      
      # obtain training indices that will be used for validation
      num_train = len(train_data)
      indices = list(range(num_train))
      np.random.shuffle(indices)
      split = int(np.floor(valid_size * num_train))
      train_idx, valid_idx = indices[split:], indices[:split]
      
      # define samplers for obtaining training and validation batches
      train_sampler = SubsetRandomSampler(train_idx)
      valid_sampler = SubsetRandomSampler(valid_idx)
      
      # prepare data loaders (combine dataset and sampler)
      train_loader = torch.utils.data.DataLoader(train_data, batch_size=batch_size,
          sampler=train_sampler, num_workers=num_workers)
      valid_loader = torch.utils.data.DataLoader(train_data, batch_size=batch_size, 
          sampler=valid_sampler, num_workers=num_workers)
      test_loader = torch.utils.data.DataLoader(test_data, batch_size=batch_size, 
          num_workers=num_workers)```
      

      批量大小是您通过迭代(时期)捕获的文件数。例如,如果您的 training_size 为 1000,并且您的 batch_size 为 10,那么每个 epoch 将包含 100 次迭代。

      worker的数量用于对batch的数据进行预处理。更多的工人将消耗更多的内存使用,工人有助于加快输入和输出过程。 num_workers = 0 表示将在需要时进行数据加载, num_workers > 0 表示您的数据将使用您定义的工人数量进行预处理。

      【讨论】:

      • 在上面的代码中,它会将数据拆分为60-20-20用于训练、验证和测试?表示批量大小,和我们通常用于深度学习的一样,不是吗?
      • 其次,我如何定义初始变量,例如train_data.. 我正在使用上面的教程,我想将您的代码放入其中。
      • 第一个问题:算法将train_data 分成80% 用于训练和20% 用于验证(在训练过程中进行验证)。所以,我有我的test_data(我的神经网络以前从未见过的数据集)在我的神经网络训练后测试她的准确性。是的,批量大小相同。
      • 关于您的第二个问题:train_data 是您的数据加载器。在这段代码中,特别是我正在使用 torchvision 已经提供的 CIFAR10 数据集。我将编辑我的答案以包含这部分代码。
      • 结构是一样的,但是你必须指定你的数据集的路径,batch_size,worker的数量,如果你想打乱图像等等。
      猜你喜欢
      • 2018-09-12
      • 2013-10-18
      • 1970-01-01
      • 2016-04-15
      • 2019-04-08
      • 1970-01-01
      • 2020-04-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多