Преобразование тензора размера 768 в 128

#pytorch #conv-neural-network

Вопрос:

Я хочу сделать проекцию на тензор формы [197, 1, 768] [197,1,128] в pytorch, используя nn.Conv()

Ответ №1:

Вы могли бы достичь этого, используя широкое плоское ядро и / или в сочетании с определенным шагом. Если вы придерживаетесь расширения 1 , то отношение пространственных измерений ввода / вывода задается как:

 out = [(2p   x - k)/s   1]
 

Где p — заполнение, k — размер ядра и s — шаг. [] детонирует целая часть количества.

Применяемый здесь у вас есть:

 128 = [(2p   768 - k)/s   1]
 

Таким образом, вы получите:

 p = 2*p   768 - (128-1)*s # one off
 

Если вы наложите p = 0 , и s = 6 вы найдете k = 6

 >>> project = nn.Conv2d(197, 197, kernel_size=(1, 6), stride=6)
>>> project(torch.rand(1, 197, 1, 768)).shape
torch.Size([1, 197, 1, 128])
 

Альтернативно, более простой, но другой подход заключается в изучении отображения с использованием полностью связанного слоя:

 >>> project = nn.Linear(768, 128)
>>> project(torch.rand(1, 197, 1, 768)).shape
torch.Size([1, 197, 1, 128])
 

Комментарии:

1. Спасибо. Но в первом решении (Conv) мне нужны размеры «3», а не «4»

2. Вы можете сжать dim=2 с project(torch.rand(1, 197, 1, 768))[..., 0, :]

Ответ №2:

Вы могли бы использовать размер ядра и шаг 6, так как это фактор между временным размером ввода и вывода:

 x = torch.randn(197, 1, 768)
conv = nn.Conv1d(in_channels=1, out_channels=1, kernel_size=6, stride=6)
out = conv(x)
print(out.shape)
> torch.Size([197, 1, 128])
 

Источник решения