Вопрос или проблема
Свёртка извлекает высокоуровневые признаки, но что насчет транспонированной свёртки (или де/апсвёртки)? Она ведет себя совершенно наоборот? Генерирует ли она низкоуровневые признаки?
Апсвёрточные слои используются для увеличения пространственного размера входных данных. Таким образом, они не “генерируют” признаки. Это просто само по себе изменение размера. Действительно, они генерируют некоторые числа, но эти числа являются результатом самого изменения размера. В следующем примере вы можете увидеть, как работает Upsample (в некоторых случаях его называют UpConv).
import torch
import torch.nn as nn
image = torch.tensor([[
[1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1]]
], dtype=torch.float)
print("image size: ", image.size())
image = image.unsqueeze(0)
print("image size: ", image.size())
# image size: torch.Size([1, 8, 8])
# image size: torch.Size([1, 1, 8, 8])
downsample = nn.Conv2d(1, 1, 3, stride=2, padding=1)
upsample = nn.Upsample(scale_factor=2)
downsampled_image = downsample(image)
print(downsampled_image)
''' Вывод
tensor([[[[0.0869, 0.3312, 0.3312, 0.3312],
[0.0636, 0.3858, 0.3858, 0.3858],
[0.0636, 0.3858, 0.3858, 0.3858],
[0.0636, 0.3858, 0.3858, 0.3858]]]], grad_fn=<ConvolutionBackward0>)
'''
upsampled_image = upsample(downsampled_image)
print(upsampled_image)
'''
tensor([[[[0.0869, 0.0869, 0.3312, 0.3312, 0.3312, 0.3312, 0.3312, 0.3312],
[0.0869, 0.0869, 0.3312, 0.3312, 0.3312, 0.3312, 0.3312, 0.3312],
[0.0636, 0.0636, 0.3858, 0.3858, 0.3858, 0.3858, 0.3858, 0.3858],
[0.0636, 0.0636, 0.3858, 0.3858, 0.3858, 0.3858, 0.3858, 0.3858],
[0.0636, 0.0636, 0.3858, 0.3858, 0.3858, 0.3858, 0.3858, 0.3858],
[0.0636, 0.0636, 0.3858, 0.3858, 0.3858, 0.3858, 0.3858, 0.3858],
[0.0636, 0.0636, 0.3858, 0.3858, 0.3858, 0.3858, 0.3858, 0.3858],
[0.0636, 0.0636, 0.3858, 0.3858, 0.3858, 0.3858, 0.3858, 0.3858]]]],
grad_fn=<UpsampleNearest2DBackward1>)
'''
print(upsampled_image.size())
# torch.Size([1, 1, 8, 8])
```
Ответ или решение
Транспонированная свертка, также известная как обратная или апсэмплинг-свертка, играет важную роль в задачах машинного обучения и компьютерного зрения, в частности в архитектурах, где требуется увеличение разрешения изображения, таких как сегментация изображений или генеративно-состязательные сети (GAN). Понимание ее работы является важным аспектом для IT-специалистов, занимающихся проектированием глубоких нейронных сетей. Давайте подробно рассмотрим, как транспонированная свертка соотносится с извлечением признаков.
Традиционная свертка выполняет уменьшение разрешения, извлекая высокоуровневые признаки из изображения. Это происходит благодаря применению фильтров, которые проходят по изображению, интегрируя информацию в меньшую по размеру пространственную область. В противоположность этому, транспонированная свертка выполняет операцию, направленную на увеличение пространственного разрешения.
Отметим, что транспонированная свертка не “извлекает” низкоуровневые признаки, так как ее основная задача — это преобразование низкоразмерного представления в высокоразмерное. В конце концов, данная операция позволяет восстановить детализацию изображения, которая может быть потеряна при обычных свертках, и используется для того, чтобы выровнять размер выхода слоя с первоначальным изображением или другим заданным размером.
Транспонированная свертка не действует строго обратно классической свертке, но увеличивает размерность данных в соответствии с заданной целью сети. Важным аспектом использования транспонированной свертки является выбор подходящих параметров, таких как размер ядра и шаг, чтобы избежать артефактов и обеспечить качественное увеличение разрешения. Хорошо сконструированная транспонированная свертка интерполирует данные таким образом, чтобы сохранить как можно больше исходной информации и восстановить структуру изображения.
Пример с использованием библиотеки PyTorch демонстрирует, как транспонированная свертка может быть использована для увеличения изображения после понижения его размера классической сверткой. Исходное изображение с размером 8×8 пикселей сначала уменьшается до 4×4 пикселей при помощи обычной свертки, и затем, с помощью апсэмплинга, восстанавливается до первоначального размера. Хоть это не точная операция “воссоздания”, представление с более высоким разрешением достигается за счет использования процедуры апсэмплинга.
В общем, транспонированная свертка — это инструмент, который не генерирует признаки, а манипулирует пространственными размерами данных, что является ключевым для задач, где критически важно сохранить или увеличить разрешение изображения. Использование этой техники в сочетании с плотными слоями или другими типами сверток позволяет реализовать сложные архитектуры нейронных сетей, применяемые в современных приложениях глубокого обучения.