Pytorch сжимать и отжимать - PullRequest
0 голосов
/ 04 мая 2020

Я прошу прощения, если этот вопрос уже задавался, однако я очень смущен сжатием и расстегиванием pytorch. Я пытался просмотреть документы и другие вопросы, связанные со стековым потоком, но я все еще не уверен, что он на самом деле делает. Я посмотрел на Что такое "unqueeze" в Pytorch? , но я до сих пор не понимаю.

Я пытался понять это, исследуя это сам в python. Сначала я создал случайный тензор с

x = torch.rand(3,2,dtype=torch.float)
>>> x
tensor([[0.3703, 0.9588],
        [0.8064, 0.9716],
        [0.9585, 0.7860]])

Но независимо от того, как я сжимаю его, я получаю те же результаты:

>>> x.squeeze(0)
tensor([[0.3703, 0.9588],
        [0.8064, 0.9716],
        [0.9585, 0.7860]])
>>> x.squeeze(1)
tensor([[0.3703, 0.9588],
        [0.8064, 0.9716],
        [0.9585, 0.7860]])
>>> x.squeeze(-1)
tensor([[0.3703, 0.9588],
        [0.8064, 0.9716],
        [0.9585, 0.7860]])

Если я сейчас пытаюсь отжать, я получаю далее,

>>> x.unsqueeze(1)
tensor([[[0.3703, 0.9588]],

        [[0.8064, 0.9716]],

        [[0.9585, 0.7860]]])
>>> x.unsqueeze(0)
tensor([[[0.3703, 0.9588],
         [0.8064, 0.9716],
         [0.9585, 0.7860]]])
>>> x.unsqueeze(-1)
tensor([[[0.3703],
         [0.9588]],

        [[0.8064],
         [0.9716]],

        [[0.9585],
         [0.7860]]])

Однако, если я сейчас создаю тензор x = torch.tensor([1,2,3,4]) и пытаюсь отжать его, то получается, что 1 и -1 превращают его в столбец, где при 0 остается То же самое.

x.unsqueeze(0)
tensor([[1, 2, 3, 4]])
>>> x.unsqueeze(1)
tensor([[1],
        [2],
        [3],
        [4]])
>>> x.unsqueeze(-1)
tensor([[1],
        [2],
        [3],
        [4]])

Может ли кто-нибудь дать объяснение того, что сжатие и отжимание делают с тензором? И в чем разница между аргументами 0, 1 и -1?

1 Ответ

0 голосов
/ 04 мая 2020

Проще говоря, unsqueeze() "добавляет" поверхностное измерение 1 в тензор (при заданном измерении), в то время как squeeze удаляет все поверхностные 1 измерения из тензора.

Вы должны посмотреть на тензор shape атрибут, чтобы увидеть это легко. В вашем последнем случае это будет:

import torch

tensor = torch.tensor([1, 0, 2, 3, 4])
tensor.shape # torch.Size([5])
tensor.unsqueeze(dim=0).shape # [1, 5]
tensor.unsqueeze(dim=1).shape # [5, 1]

Это полезно для предоставления одной выборки в сеть (которая требует, чтобы первое измерение было пакетным), для изображений это было бы:

# 3 channels, 32 width, 32 height
tensor = torch.randn(3, 32, 32)
# 1 batch, 3 channels, 32 width, 32 height
tensor.unsqueeze(dim=0).shape

unsqueeze можно увидеть, если вы создадите tensor с 1 размером, например, вот так:

# 3 channels, 32 width, 32 height and some 1 unnecessary dimensions
tensor = torch.randn(3, 1, 32, 1, 32, 1)
# 1 batch, 3 channels, 32 width, 32 height again
tensor.squeeze().unsqueeze(0) # [1, 3, 32, 32]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...