Класс AdaptiveAvgPool1d
Класс AdaptiveAvgPool1d модуля nn выполняет адаптивное усредняющее пулингование (pooling) для одномерных входных данных.
В отличие от обычного AvgPool1d, этот слой не требует указывать размер окна и шаг.
Вместо этого он принимает целевой размер выходного тензора по пространственному измерению и автоматически подбирает параметры пулинга, чтобы достичь этого размера.
Это особенно полезно, когда входные данные имеют переменную длину, а выход должен быть фиксированного размера.
На вход слой принимает тензор формы (batch, channels, length) или (channels, length).
Единственным обязательным параметром конструктора является output_size - целевой размер выходного тензора по последнему измерению.
Синтаксис
torch.nn.AdaptiveAvgPool1d(output_size)
Параметры
Конструктор класса принимает следующие параметры:
-
output_size- целевой размер выходного тензора по пространственному измерению. Может быть целым числом или значениемNone. Если указано целое число, выходная длина будет равна этому значению. Если указатьNone, то размерность не изменяется.
Пример
Рассмотрим базовый пример применения слоя AdaptiveAvgPool1d к одномерному тензору:
import torch
import torch.nn as nn
# Создаём слой с целевым размером 2
layer = nn.AdaptiveAvgPool1d(output_size=2)
# Входной тензор формы (batch=1, channels=1, length=5)
t = torch.tensor([[[1, 2, 3, 4, 5]]], dtype=torch.float)
print(t.shape)
# Применяем слой
res = layer(t)
print(res)
Результат выполнения кода:
torch.Size([1, 1, 5])
tensor([[[1.5000, 4.0000]]])
Пример
Адаптивный пулинг автоматически разбивает входную последовательность на участки и вычисляет среднее для каждого участка. Чем больше целевой размер, тем мельче разбиение:
import torch
import torch.nn as nn
# Слой с целевым размером 3
layer = nn.AdaptiveAvgPool1d(output_size=3)
t = torch.tensor([[[1, 2, 3, 4, 5, 6, 7, 8, 9]]], dtype=torch.float)
res = layer(t)
print(res)
Результат выполнения кода:
tensor([[[2., 5., 8.]]])
Пример
Слой можно применять к батчу данных с несколькими каналами. Пулинг происходит независимо для каждого канала и каждого элемента батча:
import torch
import torch.nn as nn
torch.manual_seed(0)
layer = nn.AdaptiveAvgPool1d(output_size=4)
# Батч из 2 элементов, 3 канала, длина 8
t = torch.randn(2, 3, 8)
print(t.shape)
res = layer(t)
print(res.shape)
Результат выполнения кода:
torch.Size([2, 3, 8])
torch.Size([2, 3, 4])
Пример
Если передать output_size=None, слой не изменяет размерность данных.
Это может быть полезно для унификации интерфейса при работе с разными слоями:
import torch
import torch.nn as nn
layer = nn.AdaptiveAvgPool1d(output_size=None)
t = torch.tensor([[[1, 2, 3, 4, 5, 6]]], dtype=torch.float)
res = layer(t)
print(res)
Результат выполнения кода:
tensor([[[1., 2., 3., 4., 5., 6.]]])
Смотрите также
-
класс
AvgPool1d,
который выполняет усредняющий пулинг с фиксированным окном и шагом -
класс
MaxPool1d,
который выполняет максимальный пулинг для одномерных данных -
класс
AdaptiveAvgPool2d,
который выполняет адаптивный усредняющий пулинг для двумерных данных -
класс
AdaptiveMaxPool1d,
который выполняет адаптивный максимальный пулинг для одномерных данных