Индексация в тензор факела с индексами переменной длины вдоль осиPython

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

Сообщение Anonymous »

Я пытаюсь вычислить вероятности слов в списке токенизированных слов в соответствии с языковой моделью, и мне нужна необычная индексация.
Мои входные данные проиллюстрированы игрушечным примером ниже :
  • token_list: n_words x max_tokenization_length (например, три слова, где максимальная длина токенизации равна 3)
  • pxhs: n_words x (max_tokenization_length + 1) x |vocabulary|, (например, три слова, четыре набора логитов для токенов 3+1 и словарь размером 1000)
  • next_word_token_ids: список токенов, которые составляют новое слово (например, все токены, начинающиеся с пробела).

Код: Выделить всё

pxhs = torch.rand((3,4,1000))

pad_token_id = tokenizer.pad_token_id
word_token_list = [
[120, pad_token_id, pad_token_id],
[131, 132, pad_token_id],
[140, 141, 142],
]

new_word_token_ids = [0,1,2,3,5]
Желаемый результат — это список вероятностей слов длиной 3, рассчитанный следующим образом:

Код: Выделить всё

word 1: pxhs[0, 0, 120] * pxhs[0, 1, new_word_token_ids].sum()
word 2: pxhs[1, 0, 131] * pxhs[1, 1, 132] * pxhs[1, 2, new_word_token_ids].sum()
word 3: pxhs[2, 0, 140] * pxhs[2, 1, 141] * pxhs[2, 2, 142] * pxhs[2, 3, new_word_token_ids].sum()
На практике я хочу индексировать, заменяя первый Pad_token_id новыми идентификаторами токенов слов, а затем ничего (это не работает как индекс, просто иллюстрирую):

Код: Выделить всё

actual_idx = [
[[120], new_word_token_ids, [None], [None]],
[[131], [132], new_word_token_ids, [None]],
[[140], [142], [143], new_word_token_ids],
]
Я написал очень медленную функцию, которая делает это:

Код: Выделить всё

all_word_probs = []
for word_tokens, word_probs in zip(token_list, pxhs):
counter=0
p_word=1
while (counter < len(word_tokens) and
word_tokens[counter] != tokenizer.pad_token_id):
p_word = p_word * word_probs[counter, word_tokens[counter]]
counter+=1
new_word_prob = word_probs[counter, new_word_tokens].sum()
p_word = p_word * new_word_prob
all_word_probs.append(p_word)
Мне нужно что-то побыстрее, заранее спасибо за помощь!

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

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

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

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

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

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

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