Я экспериментирую с автоэнкодером внимания, который выполняет следующие действия:
1) Каждый вход представляет собой кортежи массива (например, кортежи длины 10, среди которых каждый массив имеет размер 90)
2) Кодировщик кодирует каждый массив размером от 90 до размера 30
3) Кодированные соединяются вместе, образуя массив размером 10 x 30 = 300)
4) Внимание слой сжать encoded_combined до размера 30 и посмотреть, какой массив (из 10 массивов) стоит обратить внимание на
5) Декодер декодирует массив размером 30 в массив 90
Следовательно, вперед, for-l oop должен включать в себя кодированный из каждого массива в кортеже: *
def forward(self, X):
x = torch.from_numpy(X[0]).view(1,-1,self.in_features)
encoded_combined = self.encoder(x)
encoded_combined = torch.squeeze(encoded_combined)
for arr in X[1:]:
x = torch.from_numpy(arr).view(1,-1,self.in_features)
tail = self.encoder(x)
tail = torch.squeeze(tail)
encoded_combined = torch.cat((encoded_combined,tail))
attn_w = F.softmax(self.attn(encoded_combined), dim = 0)
encoded_combined = encoded_combined.view(-1, 1)
attn_applied = torch.mm(attn_w_expanded, encoded_combined)
decoded = self.decoder(attn_applied.view(1,-1,30))
return decoded, attn_w
. Вышеуказанная операция пересылки может принимать только 1 выборку за раз, и процесс обучения очень медленный.
. Есть ли способ добиться мини-пакетирования / избавления от for-l oop для такого набора данных?
В настоящее время у меня есть collate_fcn как следует взять 1 образец за раз, поэтому я не ed, чтобы отключить автоматическое c пакетирование загрузчика данных.
def collate_fcn_one_sample(data):
data_batch = [batch[0] for batch in data]
target_batch = [batch[1] for batch in data]
for group in data_batch:
for data in group:
data = torch.from_numpy(data)
for target in target_batch:
target = torch.from_numpy(target)
return group, target
Большое спасибо за вашу помощь !!!
Большое спасибо.