Я работаю над моделью 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
Ошибка позиционного кодирования со скользящим окном в модели трансформатора PyTorch ⇐ Python
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Я не понимаю, почему этот код неверен, хотя подход со скользящим окном работает нормально
Anonymous » » в форуме C++ - 0 Ответы
- 32 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Я не понимаю, почему этот код неверен, хотя подход со скользящим окном работает нормально
Anonymous » » в форуме C++ - 0 Ответы
- 15 Просмотры
-
Последнее сообщение Anonymous
-