#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])