Ошибка позиционного кодирования со скользящим окном в модели трансформатора PyTorchPython

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Ошибка позиционного кодирования со скользящим окном в модели трансформатора PyTorch

Сообщение Anonymous »

Я работаю над моделью PyTorch, которая обрабатывает сегментированные данные сигналов. Каждый сигнал представлен четырьмя функциями, каждый из которых имеет одинаковую длину (около 6 минут). Функции обрабатываются с помощью отдельных 1D CNN, в результате чего выходные данные имеют форму torch.Size([N, 512, 375]) для каждого сигнала. Каждая запись состоит из нескольких сегментов с переменным числом 𝑁 сегментов на запись.
Учитывая, что у меня всего около 100 записей, я установил размер пакета равным 1, обрабатывая одну запись. одновременно через блоки CNN. После обработки я складываю 4 выходных сигнала, чтобы получить тензор формы torch.Size([N, 4, 512, 375]). Чтобы обрабатывать потенциально большое количество сегментов (до 400 на запись), я использую механизм скользящего окна с размером окна 10.
В результате получаются такие формы фрагментов, как torch.Size( [10, 4, 512, 375]), что достигается за счет заполнения и маскировки, когда размер фрагмента меньше размера окна. Я хочу применить позиционное кодирование к каждому сегменту, а затем передать функции через преобразователь. Однако при применении позиционной кодировки возникает следующая ошибка:
RuntimeError: The size of tensor a (375) must match the size of tensor b (512) at non-singleton dimension 3

Вот упрощенная версия кода моей модели:
class PositionalEncoding(nn.Module):
def __init__(self, d_model, max_len=5000):
super(PositionalEncoding, self).__init__()
self.encoding = torch.zeros(max_len, d_model)

position = torch.arange(0, max_len, dtype=torch.float).unsqueeze(1)
div_term = torch.exp(torch.arange(0, d_model, 2).float() * -(math.log(10000.0) / d_model))
self.encoding[:, 0::2] = torch.sin(position * div_term) # sin for even indices
self.encoding[:, 1::2] = torch.cos(position * div_term) # cos for odd indices

self.encoding = self.encoding.unsqueeze(0)

def forward(self, x):
seq_len = x.size(0) # Number of segments (dim 0)
return self.encoding[:, :seq_len, :].to(x.device)

class SAModel(nn.Module):
def __init__(self):
super(SAModel, self).__init__()
# Define your layers here

def forward(self, segments, window_size=10):
batch_size, num_segments, num_features, time_steps = segments.shape

x_ra = segments[:, :, 0, :].squeeze(0) # RA feature
x_rr = segments[:, :, 1, :].squeeze(0) # RR feature
x_rrfid = segments[:, :, 2, :].squeeze(0) # RFID feature
x_edr = segments[:, :, 3, :].squeeze(0) # EDR feature

x_ra, x_rr, x_rrfid, x_edr = self.CNNLayer(x_ra, x_rr, x_rrfid, x_edr)

x = torch.stack([x_ra, x_rr, x_rrfid, x_edr], dim=1)

outputs = []
for start_idx in range(0, num_segments, window_size):
pad_size = 0
end_idx = min(start_idx + window_size, num_segments)
chunk = x[start_idx:end_idx, :, :]

if chunk.shape[0] < window_size:
pad_size = window_size - chunk.shape[0]
chunk = F.pad(chunk, (0, 0, 0, 0, 0, 0, 0, pad_size))

chunk_mask = torch.ones(window_size, dtype=torch.bool).to('cuda')
if pad_size > 0:
chunk_mask[-pad_size:] = False

# Apply positional encoding
chunk += self.positional_encoding(chunk)

print('Chunk shape: ', chunk.shape)
# Further processing...


Подробнее здесь: https://stackoverflow.com/questions/790 ... rmer-model
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Использование позиционного кодирования в Pytorch
    Anonymous » » в форуме Python
    0 Ответы
    2 Просмотры
    Последнее сообщение Anonymous
  • Какова временная сложность этого кода со скользящим окном?
    Anonymous » » в форуме Python
    0 Ответы
    44 Просмотры
    Последнее сообщение Anonymous
  • Я не понимаю, почему этот код неверен, хотя подход со скользящим окном работает нормально
    Anonymous » » в форуме C++
    0 Ответы
    32 Просмотры
    Последнее сообщение Anonymous
  • Я не понимаю, почему этот код неверен, хотя подход со скользящим окном работает нормально
    Anonymous » » в форуме C++
    0 Ответы
    15 Просмотры
    Последнее сообщение Anonymous
  • Итератор с катаниями или скользящим окном?
    Anonymous » » в форуме Python
    0 Ответы
    13 Просмотры
    Последнее сообщение Anonymous

Вернуться в «Python»