Почему MNIST отображается в виде списка глубиной 4 уровня?

#pytorch #mnist

#pytorch #mnist

Вопрос:

Экспериментирую с некоторым простым кодом, используя PyTorch в MNIST, и я озадачен аспектом того, как он представляет данные; возможно, я просто упускаю из виду что-то действительно очевидное.

Учитывая

 train_loader = torch.utils.data.DataLoader(
    torchvision.datasets.MNIST(
        "data",
        train=True,
        download=True,
        transform=torchvision.transforms.Compose(
            [
                torchvision.transforms.ToTensor(),
                torchvision.transforms.Normalize((0.1307,), (0.3081,)),
            ]
        ),
    ),
    batch_size=batch_size_train,
    shuffle=True,
)
  

и

 for batch_idx, (data, target) in enumerate(train_loader):
    print(data)
  

Я получаю

 tensor([[[[-0.4242, -0.4242, -0.4242,  ..., -0.4242, -0.4242, -0.4242],
          [-0.4242, -0.4242, -0.4242,  ..., -0.4242, -0.4242, -0.4242],
          [-0.4242, -0.4242, -0.4242,  ..., -0.4242, -0.4242, -0.4242],
          ...,
          [-0.4242, -0.4242, -0.4242,  ..., -0.4242, -0.4242, -0.4242],
          [-0.4242, -0.4242, -0.4242,  ..., -0.4242, -0.4242, -0.4242],
          [-0.4242, -0.4242, -0.4242,  ..., -0.4242, -0.4242, -0.4242]]],


        [[[-0.4242, -0.4242, -0.4242,  ..., -0.4242, -0.4242, -0.4242],
          [-0.4242, -0.4242, -0.4242,  ..., -0.4242, -0.4242, -0.4242],
          [-0.4242, -0.4242, -0.4242,  ..., -0.4242, -0.4242, -0.4242],
          ...,
          [-0.4242, -0.4242, -0.4242,  ..., -0.4242, -0.4242, -0.4242],
          [-0.4242, -0.4242, -0.4242,  ..., -0.4242, -0.4242, -0.4242],
          [-0.4242, -0.4242, -0.4242,  ..., -0.4242, -0.4242, -0.4242]]],
          
  

Я ожидал, что тензор, соответствующий списку глубиной в три уровня: список изображений, каждый из которых представляет собой список строк, каждый из которых представляет собой список чисел. Или, другими словами, самый внутренний [] — это строка, следующий [] — изображение, самый внешний [] — список изображений.

Но вместо этого он имеет глубину четыре уровня.

Зачем дополнительный уровень?

Ответ №1:

4 уровня

  1. Пакет
  2. Канал
  3. Строка
  4. Столбец

Комментарии:

1. Ах! Я привык к идее, что канал будет, например, красным / зеленым / синим для каждого пикселя, поэтому, если он присутствует, он будет самым внутренним. Интересно, почему они размещают его снаружи, прямо под batch.

2. Pytorch использует этот формат [пакет, канал, строка, столбец]

3. Может быть, это так, что канал всегда будет находиться в одном и том же месте, независимо от того, сколько или несколько измерений находятся под ним? Хорошо, это проясняет ситуацию. Спасибо!