Обмен технологиями

Понимание оси Питорха

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

import torch
x = torch.arange(16).reshape(1,4,4)
print(x)
print('--------')
a = x.sum(axis = 1,keepdim=True)
a2 = x.sum(axis = 1,keepdim=False)
a3 = x.sum(axis = 0,keepdim=True)
a4 = x.sum(axis = 0,keepdim=False)
a5 = x.sum(axis = 2,keepdim=True)
print(a)
print(a2)
print('----------')
print(a3)
print(a4)
print(a5)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
 import torch
x = torch.arange(16).reshape(4,4)
print(x)
print('--------')
a = x.sum(axis = 1,keepdim=True)
a2 = x.sum(axis = 1,keepdim=False)
print(a)
print(a2)
print(x/a) 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

Объедините эти два примера, чтобы подробно объяснить изменения оси при различных обстоятельствах.
Понимание размерных операций с тензорами и суммированием по определенным осям в PyTorch требует немного времени. Давайте проанализируем эти операции шаг за шагом на двух примерах и подробно объясним изменение оси в разных ситуациях.

первый пример

import torch
x = torch.arange(16).reshape(1, 4, 4)
print(x)
print('--------')
a = x.sum(axis=1, keepdim=True)
a2 = x.sum(axis=1, keepdim=False)
a3 = x.sum(axis=0, keepdim=True)
a4 = x.sum(axis=0, keepdim=False)
a5 = x.sum(axis=2, keepdim=True)
print(a)
print(a2)
print('----------')
print(a3)
print(a4)
print(a5)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
начальный тензор
tensor([[[ 0,  1,  2,  3],
         [ 4,  5,  6,  7],
         [ 8,  9, 10, 11],
         [12, 13, 14, 15]]])
  • 1
  • 2
  • 3
  • 4

Это форма (1, 4, 4) тензоров. Мы можем думать об этом как о пакете, содержащем матрицу 4x4.

Сумма по оси 1
  1. x.sum(axis=1, keepdim=True)

Суммируйте по оси 1 (т. е. направлению второго измерения, 4), сохраняя размеры.

tensor([[[24, 28, 32, 36]]])
  • 1

Форма становится (1, 1, 4)

  1. x.sum(axis=1, keepdim=False)

Суммируем по оси 1, размерность не сохраняется.

tensor([[24, 28, 32, 36]])
  • 1

Форма становится (1, 4)

Сумма по оси 0
  1. x.sum(axis=0, keepdim=True)

Суммируйте по оси 0 (т. е. направлению первого измерения, 1), сохраняя размеры.

tensor([[[ 0,  1,  2,  3],
         [ 4,  5,  6,  7],
         [ 8,  9, 10, 11],
         [12, 13, 14, 15]]])
  • 1
  • 2
  • 3
  • 4

Поскольку исходный тензор имеет только один элемент на оси 0, результат тот же, что и исходный тензор, с формой (1, 4, 4)

  1. x.sum(axis=0, keepdim=False)

Сумма по оси 0, размерность не сохраняется.

tensor([[ 0,  1,  2,  3],
        [ 4,  5,  6,  7],
        [ 8,  9, 10, 11],
        [12, 13, 14, 15]])
  • 1
  • 2
  • 3
  • 4

Форма становится (4, 4)

Сумма по оси 2
  1. x.sum(axis=2, keepdim=True)

Суммируйте по оси 2 (т. е. третьему измерению, направлению 4), сохраняя размеры.

tensor([[[ 6],
         [22],
         [38],
         [54]]])
  • 1
  • 2
  • 3
  • 4

Форма становится (1, 4, 1)

ключевой момент
  • keepdim=True Суммарные измерения сохранятся, количество измерений результата останется неизменным, но размер суммируемых измерений станет равным 1.
  • keepdim=False Суммированные измерения будут удалены, а количество измерений в результате уменьшится на 1.

второй пример

import torch
x = torch.arange(16).reshape(4, 4)
print(x)
print('--------')
a = x.sum(axis=1, keepdim=True)
a2 = x.sum(axis=1, keepdim=False)
print(a)
print(a2)
print(x/a)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
начальный тензор
tensor([[ 0,  1,  2,  3],
        [ 4,  5,  6,  7],
        [ 8,  9, 10, 11],
        [12, 13, 14, 15]])
  • 1
  • 2
  • 3
  • 4

Это форма (4, 4) тензоров.

Сумма по оси 1
  1. x.sum(axis=1, keepdim=True)

Суммируйте по оси 1 (т. е. направлению второго измерения, 4), сохраняя размеры.

tensor([[ 6],
        [22],
        [38],
        [54]])
  • 1
  • 2
  • 3
  • 4

Форма становится (4, 1)

  1. x.sum(axis=1, keepdim=False)

Суммируем по оси 1, размерность не сохраняется.

tensor([ 6, 22, 38, 54])
  • 1

Форма становится (4,)

Элементы, разделенные на сумму строк
  1. x / a
tensor([[0.0000, 0.1667, 0.3333, 0.5000],
        [0.1818, 0.2273, 0.2727, 0.3182],
        [0.2105, 0.2368, 0.2632, 0.2895],
        [0.2222, 0.2407, 0.2593, 0.2778]])
  • 1
  • 2
  • 3
  • 4

Это сумма каждого элемента, разделенная на соответствующую ему строку, в результате чего:

tensor([[ 0/6,  1/6,  2/6,  3/6],
        [ 4/22,  5/22,  6/22,  7/22],
        [ 8/38,  9/38, 10/38, 11/38],
        [12/54, 13/54, 14/54, 15/54]])
  • 1
  • 2
  • 3
  • 4

Сводка изменений осей и размеров

  • ось=0: Действуйте по первому измерению (строке), после суммирования остается сумма других измерений.
  • ось=1: действует по второму измерению (столбцу), а сумма первого и третьего измерений остается после суммирования.
  • ось=2: работает по третьему измерению (глубине), после суммирования остается сумма первых двух измерений.

использовать keepdim=True При сохранении размеров суммарная размерность становится равной 1.использоватьkeepdim=False При , суммированные размеры удаляются.

сомневаться:

Почему строки находятся в столбцах, а не в reshape (1, 4, 4) Только тогда, когда reshape (4, 4) находится в строках?

Тензорная структура

Сначала рассмотрим основные понятия:

  • 2D-тензор (матрица): Имеет строки и столбцы.
  • 3D-тензор: Он состоит из нескольких двумерных матриц и может рассматриваться как стопка матриц с измерением «глубины».

Пример 1: Двумерный тензор (4, 4)

import torch
x = torch.arange(16).reshape(4, 4)
print(x)
  • 1
  • 2
  • 3

Выход:

tensor([[ 0,  1,  2,  3],
        [ 4,  5,  6,  7],
        [ 8,  9, 10, 11],
        [12, 13, 14, 15]])
  • 1
  • 2
  • 3
  • 4

Форма этого тензора (4, 4), представляет матрицу 4x4:

  • ХОРОШОгоризонтально:

    • Строка 0: [ 0, 1, 2, 3]
    • Линия 1: [ 4, 5, 6, 7]
    • Строка 2: [ 8, 9, 10, 11]
    • Строка 3: [12, 13, 14, 15]
  • Списоквертикально:

    • Столбец 0: [ 0, 4, 8, 12]
    • Столбец 1: [ 1, 5, 9, 13]
    • Столбец 2: [ 2, 6, 10, 14]
    • Столбец 3: [ 3, 7, 11, 15]

Пример 2: Трехмерный тензор (1, 4, 4)

x = torch.arange(16).reshape(1, 4, 4)
print(x)
  • 1
  • 2

Выход:

tensor([[[ 0,  1,  2,  3],
         [ 4,  5,  6,  7],
         [ 8,  9, 10, 11],
         [12, 13, 14, 15]]])
  • 1
  • 2
  • 3
  • 4

Форма этого тензора (1, 4, 4), представляет собой трехмерный тензор 1x4x4:

  • Первое измерение – это 1, указывающий размер партии.
  • Второе измерение – это 4, представляет количество строк (строк на матрицу).
  • Третье измерение – это 4, представляет количество столбцов (столбцов каждой матрицы).

Пояснение суммы по оси

Сумма по оси 1 (второе измерение)
  1. Для двумерного тензора (4, 4)
a = x.sum(axis=1, keepdim=True)
print(a)
  • 1
  • 2

Выход:

tensor([[ 6],
        [22],
        [38],
        [54]])
  • 1
  • 2
  • 3
  • 4
  • Ось 1 — направление строк, элементы каждой строки суммируются:
    • [0, 1, 2, 3] => 0+1+2+3 = 6
    • [4, 5, 6, 7] => 4+5+6+7 = 22
    • [8, 9, 10, 11] => 8+9+10+11 = 38
    • [12, 13, 14, 15] => 12+13+14+15 = 54
  1. Для трехмерных тензоров (1, 4, 4)
a = x.sum(axis=1, keepdim=True)
print(a)
  • 1
  • 2

Выход:

tensor([[[24, 28, 32, 36]]])
  • 1
  • Ось 1 — это направление строки первой матрицы. Суммируем элементы каждой строки:
    • [0, 1, 2, 3] + [4, 5, 6, 7] + [8, 9, 10, 11] + [12, 13, 14, 15]
    • Сумма по столбцу: 24 = 0+4+8+12, 28 = 1+5+9+13, 32 = 2+6+10+14, 36 = 3+7+11+15.

Почему это выглядит так: «строки становятся столбцами»

существовать (1, 4, 4) В трехмерном тензоре первое измерение представляет размер пакета, поэтому кажется, что каждая матрица 4х4 при работе по-прежнему обрабатывается двумерным образом. Однако, поскольку добавляется пакетное измерение, оно ведет себя иначе, чем двумерный тензор в операции суммирования.

Конкретно:

  • При суммировании по оси 1 (второе измерение) мы суммируем строки каждой матрицы.
  • При суммировании по оси 0 (первое измерение) мы суммируем размеры партии.

Подведем итог

  • 2D-тензор: понятия строк и столбцов интуитивно понятны.
  • 3D-тензор: после введения пакетного измерения операции со строками и столбцами будут выглядеть по-другому, но на самом деле они все еще работают с каждой двумерной матрицей.
  • При суммировании по оси ключевым моментом является понимание размеров суммы.