В настоящее время я работаю над созданием сверточной нейронной сети (CNN), которая будет работать с данными временных рядов.
Более конкретно, данные представляют собой финансовые данные формы (100, 40)
, имеющие значение 100
100 отметок времени и 40
означает 40 функций.
Используемая мной CNN использует асимметричные размеры ядра (т. Е. 1 x 2
и 4 x 1
), а также асимметричные шаги (т. Е. 1 x 2
для 1 x 2
слоев и 1 x 1
для 4 x 1
слоев).
Чтобы размер по высоте оставался 100
, мне нужно было применить некоторые отступы к данным. Я искал способы сделать это и заметил, что люди, которые используют TensorFlow или Keras, просто делают padding='same'
, но эта опция явно недоступна в PyTorch согласно многим ресурсам, которые я нашел, включая этот поток в Github .
Я обнаружил, что согласно некоторым ответам в этом вопросе , а также этому ответу на форуме PyTorch , я могу вручную рассчитать, сколько мне нужнодля заполнения моих данных и может использовать torch.nn.ZeroPad2d
для решения моей проблемы, так как кажется, что нормальные torch.nn.Conv2d
слои не поддерживают асимметричное заполнение (я считаю, что общее заполнение Iнужно 3 по высоте и 0 по ширине).
Экспериментальный код, который я написал, чтобы проверить это, выглядит так:
import torch
import torch.nn as nn
conv = nn.Conv2d(1, 1, kernel_size=(4, 1))
pad = nn.ZeroPad2d((0, 0, 2, 1)) # Add 2 to top and 1 to bottom.
x = torch.randint(low=0, high=9, size=(100, 40))
x = x.unsqueeze(0).unsqueeze(0)
y = pad(x)
x.shape # (1, 1, 100, 40)
y.shape # (1, 1, 103, 40)
print(conv(x.float()).shape)
print(conv(y.float()).shape)
# Output
# x -> (1, 1, 97, 40)
# y -> (1, 1, 100, 40)
Как видите, он работаетв том смысле, что размер размеров остается прежним. Однако мне было интересно, неужели там нет опции padding='same'
? Кроме того, как мы узнаем, применять ли отступ 2 сверху или снизу?
Спасибо.