Это 13-й день моего участия в августовском испытании обновлений. Узнайте подробности события:Испытание августовского обновления
Эмалированная чашка, которую я получил сегодня от Наггетс, является небольшим поощрением за то, что я писал в прошлом месяце.Хотя я думаю, что сделал это, я все еще чувствую себя сладко, когда получаю экспресс и открываю подарок. Спасибо, Наггетс, поблагодарите себя, подбодрите себя и спасибо за вашу поддержку и ободрение.
Что касается формы, как мы используем тензор для представления изображения, наше изображение представлено, Сегодня я покажу вам свои навыки рисования, используя изображение для представления преобразования изображения в тензор.
Как преобразовать картинку в тензор на графике, обычно 3-мерный тензор представляет картинку
Напоминаем, что в pytorch количество цветовых каналов увеличено до 0, что отличается от других сред глубокого обучения или изображений библиотек, которые имеют дело с вычислительным зрением.
Мы объединяем несколько изображений и вводим их для обучения нейронной сети, что мы часто называем пакетом.
операция изменения формы тензора
Сегодня поговорим о некоторых операциях, которые могут изменить форму тензора.Тензор в основном сохраняет три атрибута: имя, форма и тип.По сути, так называемая форма является размерностью тензора.
import numpy as np
import torch
- просмотреть/изменить форму изменить форму
- Сжать/разжать увеличить размер/удалить размер
- транспонировать/переставлять размер преобразования
- Развернуть/повторить расширение измерения
Многомерный тензор
Для высокоширотного тензора мы в основном понимаем последние два измерения, которые можно понимать как плоскость, а третье измерение представляет собой трехмерную форму.По мере увеличения измерения мы можем понимать каждое измерение как контейнер или коробку, а более высокое измерение можно понимать как контейнер или коробку Уточный контейнер или коробку.
Изменить размер или форму (форму)
В numpy reshape используется для изменения формы тензора, а в pytorch мы можем использовать методы view и reshape для изменения формы тензора, У них нет разницы, кроме их имен, поэтому вот пример представления. тензорная форма.Если вы написали несколько простых сетей классификации изображений, этот тензор формы должен быть вам знаком, представляя 4 изображения с высотой 1 канала и шириной 28. Если мы хотим использовать полносвязную сеть для распознавания, нам нужно сгладить высоту и ширину, прежде чем передавать их в полносвязную нейронную сеть. Это должно использовать представление, вызывая представление тензора и передавая форму для преобразования.
img_batch = torch.rand(4,1,28,28)
Фактический смысл приведенного выше тензора заключается в том, что количество каналов в 4 изображениях равно 1, а размер равен 1.картинка.
img_batch.view(4,28*28)
в состоянии пройтиview
Выполните операцию изменения формы тензора, как показано на рисунке выше, который представлен графически.. Сначала нам нужносгладить, то естьКаждая строка соединена встык, обычно таким образом двумерная матрица сглаживается в одномерный вектор (как показано ниже).
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]])
Добавьте его к другому преобразованию. Это преобразование не имеет большого практического значения. В процессе разработки мало операций по пакетному преобразованию изображения. Конкретная операция выглядит следующим образом.
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
.
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
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])
bias.squeeze(-1).shape
torch.Size([1, 32, 1])
# 没有报错
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
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])