Это 12-й день моего участия в августовском испытании обновлений. Узнайте подробности события:Испытание августовского обновления
Мы можем выбрать или, что более наглядно, нарезать определенное измерение на основе существующего тензора, чтобы сохранить желаемый тензор данных, таким образом создавая новый тензор аналогичным образом. Сегодня меньше теории и больше кодирования.На примерах мы можем помочь вам понять, как выбрать подходящий метод, предоставляемый факелом для среза тензора.
import numpy as np
import torch
# indexing
a = torch.rand(4,3,28,28)
Сначала мы создаем матрицу, используется здесьtorch.rand
для создания возвращаетТензор равномерно распределенных случайных чисел на . Фактический смысл изменения матрицы заключается в том, чтобы ввести в модель небольшую партию картинок, 4 указывает количество вводимых картинок за раз, 3 указывает количество каналов изображения,Указывает ширину и высоту изображения.
Как получить значение в Tensor
a[0,0].shape
a[0,0]
Указывает, что первый канал удален из изображения, т.е.Представляет изображение с изображением канала
torch.Size([28, 28])
a[0,0,2,4]
Здесь это означает удалить его первый канал из изображения, чтобы получить соответствующее значение пикселя его третьего столбца и пятой строки.
tensor(0.4215)
Метод среза тензора для создания нового тензора
Тензор — это как большой пирог, мы делим его по определенной оси, и в итоге из данных получаем нужный кусок данных.
# 从 0 开始 1 这里不包含 2
a[:2].shape
torch.Size([2, 3, 28, 28])
:
Как понять этот символ, если этот символ появляется на определенном измерении (оси) Тензора,:
Указывает символ интервала для перехвата. Когда дело доходит до интервала, давайте сначала рассмотрим его. В компьютере определение диапазона интервала обычно остается закрытым и открытым справа.Это правило относится и к тензору,:
Левая и правая стороны символа могут иметь значения, левая сторона символа представляет начальное значение интервала, а правая сторона представляет конечное значение.
-
start:end
: Указывает значение соответствующего значения начальной позиции от СТАРТ до предыдущей позиции конца -
start:
: Указывает, что значение начальной позиции берется в конец массива.Здесь массив не является строгим, но я думаю, что каждый может понять -
:end
: Указывает, что значение, соответствующее предыдущей позиции конца, берется до начала массива. -
:
: получить все значения массива
a[:2,:1].shape
Глядя на это, мы можем себе представить, ведь здесь 4 измерения, которые могут быть за гранью воображения каждого, как показано на рисунке
Берем количество каналов, ширину и длину, чтобы понять высоту, ширину и длину кубаэтоИ еще одно измерение это понимать 2 два куба, ну и что если еще одно измерение? Предположим, это, на самом деле очень просто, можно представить его предыдущее измерение целиком, положить в ящик, а там таких ящиков 2 и так далее,
Объясните еще раз со схемойТеперь это 5-мерные данные, причем кубы представляют любое из первых 3-х измерений, а затем 4-мерные — это 2 (количество измерений мы считаем сзади наперед), то есть 2 куба, а затем в 5-мерный, 2 означает два разных В настоящее время, если предположить, что мы поместили один и тот же цветной куб в коробку, в это время есть две такие коробки. На самом деле, пока все это понимают, нетрудно понять многомерное пространство в тензоре глубокого обучения, Многомерное пространство здесь не является физическим многомерным пространством.
torch.Size([2, 1, 28, 28])
# 取从 1 开始到最末尾
# [0,1,2][1,2]
a[:2,1:,:,:].shape
torch.Size([2, 2, 28, 28])
# [0,1,2] [0,1,2] ,[-3,-2,-1]
a[:2,-1:,:,:].shape
Если стоит отрицательное число, значит уже не спереди назад, а сзади наперед, -1 значит начинать вторую позицию сзади наперед, то есть второе значение позиции снизу массива начинается.
torch.Size([2, 1, 28, 28])
# 对于图片进行隔行采样,隔列采样
a[:,:,0:28:2,0:28:2].shape
start:end:step
, где шаг занимает 2, чтобы указать, что нет интервала 1 для принятия значения, то есть указатель значения перемещает 2 элемента за раз
torch.Size([4, 3, 14, 14])
a[:,:,::2,::2].shape
torch.Size([4, 3, 14, 14])
Создайте новый Tensor, выбрав точный индекс
Выбирает данные из указанного местоположения в измерении тензора.
a.index_select(2,torch.arange(14)).shape
torch.Size([4, 3, 14, 28])
a.index_select(0,torch.tensor([0,2])).shape
Из 1-го измерения тензора выбирается композиция изображения позиций 0 и 2 для получения результата как
torch.Size([2, 3, 28, 28])
a.index_select(1,torch.tensor([1,2])).shape
Выберите 1 и 2 позиции из 2-го измерения тензора, то есть выберите его 1 и 2 каналы для всех картинок, чтобы получить тензор как
torch.Size([4, 2, 28, 28])
a.index_select(2,torch.arange(8)).shape
torch.Size([4, 3, 8, 28])
Взгляните на этот символ выбора многоточия
...
Этот символ означает принятие всего на основе существующего выбора.Цель этого символа — уменьшить рабочую нагрузку, когда мы выбираем или устанавливаем пространство.
a[...].shape
...
Указывает, что выбор не сделан, и выбраны все элементы тензора.
torch.Size([4, 3, 28, 28])
a[:1,...].shape
Это означает, что рассматривается только первое 1 измерение, и выбираются тензорные данные первого изображения. Преимущество в том, что вам не нужно разделять каждый
torch.Size([1, 3, 28, 28])
a[0,...].shape
На самом деле, эта операция выбора не может видеть эффект, потому что мыa[0,]
Также имеет тот же эффект, поэтому я еще не вижу многоточие...
Преимущества выбора
torch.Size([3, 28, 28])
a[:,1,...].shape
torch.Size([4, 28, 28])
Если мы выберем среднюю размерность тензора через случайные интервалы определенной размерности, в игру вступит многоточие.
a[0,...,::2].shape
torch.Size([3, 28, 14])
И когда мы переходим со спины на фронт:
Сделав выбор, мы обнаружили, что на этот раз...
Это также пригодится, как показано ниже.
a[...,:2].shape
torch.Size([4, 3, 28, 2])
Создайте новый Tensor путем фильтрации
Тензор фильтруется по условиям, элементы, соответствующие условиям, будут сохранены, а те элементы, которые не удовлетворяют условиям, будут отфильтрованы, а сохраненные элементы в конечном итоге будут возвращены в виде тензора формы одномерного массива.
x = torch.randn(3,4)
x
tensor([[-0.1850, 1.3697, -1.0597, -0.5774],
[-0.2925, 0.9569, 0.1281, 0.0644],
[ 0.9894, -0.0659, -0.7232, -0.4943]])
import numpy as np
a_arr = np.random.randint(0,10,size=(3,4))
a_mask = a_arr >5
a_mask
a_mask = a_arr >5
Возвращая маску, состоящую из True и False, мы можем затем использовать эту маску для фильтрации тензора Значение позиции, соответствующее True, будет сохранено, а позиция, соответствующая False, не будет сохранена.
array([[False, False, True, True],
[False, False, False, False],
[ True, True, False, False]])
# np.random.randint?
mask = x.ge(0.5)
mask
tensor([[False, True, False, False],
[False, True, False, False],
[ True, False, False, False]])
torch.masked_select(x,mask)
Нетрудно представить, что элементно-мерный 1-мерный тензор возвращается через фильтрацию и удержание по маске.Нетрудно представить, что элементы, удержанные фильтрацией, не могут сохранить первоначальную форму.
tensor([1.3697, 0.9569, 0.9894])
torch.masked_select(x,mask).shape
torch.masked_select(x,mask).dim()
1
Вы также можете получить новые тензоры с помощью тензорных операций.
tensor_1 = torch.randint(low=0,high=10,size=(3,3))
tensor_2 = torch.randint(low=0,high=10,size=(3,3))
tensor_1
tensor([[0, 6, 5],
[7, 0, 2],
[8, 7, 6]])
tensor_2
tensor([[0, 4, 7],
[5, 2, 8],
[2, 9, 0]])
tensor_add_res = tensor_1 + tensor_2
tensor_add_res
tensor([[ 0, 10, 12],
[12, 2, 10],
[10, 16, 6]])