Я смотрю на вложения изображений и задаюсь вопросом, почему переворачивание изображений меняет вывод. Например, рассмотрим resnet18 с удаленной головой:
import torch
import torch.nn as nn
import torchvision.models as models
device = torch.device("cuda") if torch.cuda.is_available() else torch.device("cpu")
model = models.resnet18(pretrained=True)
model.fc = nn.Identity()
model = model.to(device)
model.eval()
x = torch.randn(20, 3, 128, 128).to(device)
with torch.no_grad():
y1 = model(x)
y2 = model(x.flip(-1))
y3 = model(x.flip(-2))
Последний слой выглядит так и, что наиболее важно, имеет AdaptiveAveragePooling
в качестве последнего слоя, где пиксели/функции объединены в 1 пиксель:
В соответствии с тем, как я думаю, поскольку у нас просто есть свертки поверх сверток, перед объединением все, что произойдет, это то, что карта признаков будет переворачиваться в соответствии с тем, как переворачивается изображение. Усредненный пул просто усредняет последнюю карту объектов (вдоль каждого канала) и не зависит от ее ориентации. AdaptiveMaxPool
должно было быть то же самое.
Ключевое различие между «обычными» консетями заключается в том, что мы объединяем/усредняем до ширины в один пиксель.
Однако, когда я смотрю на y1-y2
, y1-y3
, y2-y3
, значения значительно отличаются от нуля. О чем я неправильно думаю?