Внедрение и улучшение Pytorch (3) - изменение операции тензора

искусственный интеллект PyTorch
Внедрение и улучшение Pytorch (3) - изменение операции тензора

Это 13-й день моего участия в августовском испытании обновлений. Узнайте подробности события:Испытание августовского обновления

Эмалированная чашка, которую я получил сегодня от Наггетс, является небольшим поощрением за то, что я писал в прошлом месяце.Хотя я думаю, что сделал это, я все еще чувствую себя сладко, когда получаю экспресс и открываю подарок. Спасибо, Наггетс, поблагодарите себя, подбодрите себя и спасибо за вашу поддержку и ободрение.

Что касается формы, как мы используем тензор для представления изображения, наше изображение представленоcolordepth×hight×widthcolordepth \times hight \times width, Сегодня я покажу вам свои навыки рисования, используя изображение для представления преобразования изображения в тензор.

005.png

Как преобразовать картинку в тензор на графике, обычно 3-мерный тензор представляет картинкуchannel×height×widthchannel \times height \times width

Напоминаем, что в pytorch количество цветовых каналов увеличено до 0, что отличается от других сред глубокого обучения или изображений библиотек, которые имеют дело с вычислительным зрением.

006.png

Мы объединяем несколько изображений и вводим их для обучения нейронной сети, что мы часто называем пакетом.

операция изменения формы тензора

Сегодня поговорим о некоторых операциях, которые могут изменить форму тензора.Тензор в основном сохраняет три атрибута: имя, форма и тип.По сути, так называемая форма является размерностью тензора.

import numpy as np
import torch
  • просмотреть/изменить форму изменить форму
  • Сжать/разжать увеличить размер/удалить размер
  • транспонировать/переставлять размер преобразования
  • Развернуть/повторить расширение измерения

Многомерный тензор

Для высокоширотного тензора мы в основном понимаем последние два измерения, которые можно понимать как плоскость, а третье измерение представляет собой трехмерную форму.По мере увеличения измерения мы можем понимать каждое измерение как контейнер или коробку, а более высокое измерение можно понимать как контейнер или коробку Уточный контейнер или коробку.

001.png

Изменить размер или форму (форму)

В numpy reshape используется для изменения формы тензора, а в pytorch мы можем использовать методы view и reshape для изменения формы тензора, У них нет разницы, кроме их имен, поэтому вот пример представления. тензорная форма.(4×1×28×28)(4 \times 1 \times 28 \times 28)Если вы написали несколько простых сетей классификации изображений, этот тензор формы должен быть вам знаком, представляя 4 изображения с высотой 1 канала и шириной 28. Если мы хотим использовать полносвязную сеть для распознавания, нам нужно сгладить высоту и ширину, прежде чем передавать их в полносвязную нейронную сеть. Это должно использовать представление, вызывая представление тензора и передавая форму для преобразования.

img_batch = torch.rand(4,1,28,28)

Фактический смысл приведенного выше тензора заключается в том, что количество каналов в 4 изображениях равно 1, а размер равен 1.28×2828 \times 28картинка.

img_batch.view(4,28*28)

002.png

в состоянии пройтиviewВыполните операцию изменения формы тензора, как показано на рисунке выше, который представлен графически.4×1×28×284 \times 1 \times 28 \times 28. Сначала нам нужно28×2828 \times 28сгладить, то есть28×2828 \times 28Каждая строка соединена встык, обычно таким образом двумерная матрица сглаживается в одномерный вектор (как показано ниже).

003.png

    tensor([[0.6365, 0.1717, 0.8811,  ..., 0.8527, 0.1694, 0.4334],
            [0.1407, 0.7842, 0.4685,  ..., 0.5031, 0.9853, 0.4011],
            [0.0238, 0.9538, 0.1811,  ..., 0.4953, 0.8943, 0.2351],
            [0.4644, 0.3313, 0.8963,  ..., 0.7917, 0.7044, 0.1615]])

Обратите внимание, что хотя форма меняется, общее количество измерений остается прежним, и, конечно же, количество элементов не меняется.

img_batch.view(4*28,28)

    tensor([[0.6365, 0.1717, 0.8811,  ..., 0.8414, 0.5303, 0.7353],
            [0.7329, 0.5666, 0.9602,  ..., 0.3899, 0.6952, 0.5773],
            [0.7327, 0.8660, 0.0051,  ..., 0.7607, 0.8036, 0.6715],
            ...,
            [0.0486, 0.4234, 0.2400,  ..., 0.9370, 0.8427, 0.0652],
            [0.0779, 0.9036, 0.1388,  ..., 0.3249, 0.8069, 0.8189],
            [0.9946, 0.6009, 0.4542,  ..., 0.7917, 0.7044, 0.1615]])

Добавьте его к другому преобразованию. Это преобразование не имеет большого практического значения. В процессе разработки мало операций по пакетному преобразованию изображения. Конкретная операция выглядит следующим образом.

007.png

img_batch.view(4*28,28).shape
torch.Size([112, 28])

Расширяйте и сжимайте размеры

Расширенное измерение (разжать)

Сжатие и разжатие удаляют и добавляют размеры к тензору соответственно.

Pos.Idx 1 2 3 4
Neg.Idx -4 -3 -2 -1

Вставьте измерение перед указанным измерением Pos.Idx (положительное направление), вставьте измерение после указанного измерения Neg.Idx (отрицательное направление) и вставьте измерение перед 0, затем добавьте (4,1,28,28) до измерения 0 ( 1,4,1,28,28)

img_batch.unsqueeze(0).shape

Расширение измерения в измерении 0 аналогично тому, что мы подготовили упаковочную коробку и поместили тензор, представляющий изображение партии, в эту упаковочную коробку, так что процесс можно понимать как расширение в 0 измерении.unsqueeze.

008.png

torch.Size([1, 4, 1, 28, 28])

Если указатель выполнен на тензоре без размерностейunsqueezeБудет выброшено следующее исключение.

img_batch.unsqueeze(5)
---------------------------------------------------------------------------

IndexError                                Traceback (most recent call last)

<ipython-input-13-fdcc2e08cb60> in <module>
----> 1 img_batch.unsqueeze(5)


IndexError: Dimension out of range (expected to be in range of [-5, 4], but got 5)
# 在 -1(3) 后插入维度,那么 (4,1,28,28) 0 维前添加 (4,1,28,28,1)
# [[1,2,1],[2,3,2]] 2 \times 3 2 \times 3 \times [[[1],[2],[3]]]
a.unsqueeze(-1).shape

Как следует понимать эту операцию? Можно понять, что наименьшая единица тензора упакована в маленькую коробку следующим образом

torch.Size([4, 1, 28, 28, 1])
# 在 -4(0) 后插入维度,那么 (4,1,28,28) 0 维前添加 (4,1,1,28,28)
# [[[1,2,1],[2,3,2]]] 2 \times 3 2  \times 1 \times 3[[[1],[2],[3]]]
a.unsqueeze(-4).shape
torch.Size([4, 1, 1, 28, 28])
# 在 -5  后插入维度就相当在 0 维度前添加维度,那么 (4,1,28,28) 0 维前添加 (1,4,1,28,28)
a.unsqueeze(-5).shape
torch.Size([1, 4, 1, 28, 28])

Размер сжатия (сжатие)

# biase 4 batch 32 channel 14 14  $\theta X + bias$
bias = torch.rand(32)
feature_map = torch.rand(4,32,14,14)
# 1,32 -> 
bias = bias.unsqueeze(1).unsqueeze(0).unsqueeze(2)
# .unsqueeze(2).unsqueeze(0)
bias.shape

011.png

torch.Size([1, 32, 1, 1])

Если нет конкретногоsqueezeКакое тензорное измерение выполняется для всех сжимаемых измерений (то есть размер измерения равен 1)squeezeдействовать

bias.squeeze().shape
torch.Size([32])

Вы также можете указать размер для сжатия, например, здесь указан размер 0

bias.squeeze(0).shape
torch.Size([32, 1, 1])

012.png

bias.squeeze(-1).shape
torch.Size([1, 32, 1])

015.png

# 没有报错
bias.squeeze(1).shape
torch.Size([1, 32, 1, 1])
bias.squeeze(-4).shape
torch.Size([32, 1, 1])

Расширение измерения

Expand возвращает текущий тензор, расширенный в большем измерении.tensor expandне выделяет новую память, просто создает новое представление существующего тензораview. RepeatПовторяет тензор по заданному измерению.В отличие от Expand(), эта функция копирует данные тензора.

a = torch.rand(4,32,14,14)
# a
temp_tensor = torch.tensor([[1,2],[2,3]])
temp_tensor.shape
torch.Size([2, 2])
temp_tensor.unsqueeze(0).shape
torch.Size([1, 2, 2])
expand_temp_tensor = temp_tensor.expand(4,2,2)
expand_temp_tensor
tensor([[[1, 2],
         [2, 3]],

        [[1, 2],
         [2, 3]],

        [[1, 2],
         [2, 3]],

        [[1, 2],
         [2, 3]]])
b = torch.rand(1,32,1,1)
b.shape
torch.Size([1, 32, 1, 1])

Расширить исходный размер

# 
b.expand(4,32,14,14).shape

016.png

torch.Size([4, 32, 14, 14])

-1 означает, что форма не меняется в этом измерении.

b.expand(-1,32,-1,-1).shape
torch.Size([1, 32, 1, 1])
b.expand(-1,32,-1,-4).shape

Если принять с переменнойb.expand(-1,32,-1,-4)Попытка вывести переменную вызовет исключениеRuntimeError: Trying to create tensor with negative dimension -4: [1, 32, 1, -4]

torch.Size([1, 32, 1, -4])

Расширенное измерение для измерений 0 и 1

img_batch.repeat(4,64,1,1).shape
torch.Size([16, 64, 28, 28])
bias.repeat(4,1,1,1).shape
torch.Size([4, 32, 1, 1])
bias.repeat(4,1,32,32).shape
torch.Size([4, 32, 32, 32])