У меня есть тензор probs
с probs.shape = (max_time, num_batches, num_labels)
.Theano расширенная индексация для тензора, общий индекс
И у меня есть тензор targets
с targets.shape = (max_seq_len, num_batches)
, где значения являются индексами меток, то есть для третьего измерения в probs
.
Теперь я хочу получить тензор probs_y
с probs.shape = (max_time, num_batches, max_seq_len)
, где третье измерение - это индекс в targets
. В основном
probs_y[:,i,:] = probs[:,i,targets[:,i]]
для всех 0 <= i < num_batches
.
Как я могу это достичь?
Аналогичная проблема с решением была опубликована here.
Решение есть, если я правильно понимаю, был бы:
probs_y = probs[:,T.arange(targets.shape[1])[None,:],targets]
Но это не похоже на работу. Я получаю: IndexError: only integers, slices (`:`), ellipsis (`...`), numpy.newaxis (`None`) and integer or boolean arrays are valid indices
.
Кроме того, не является создание временного T.arange
немного дорогостоящим? Esp, когда я пытаюсь обходным путем, действительно делая его полным плотным целым массивом. Должен быть лучший способ.
Возможно, theano.map
? Но, насколько я понимаю, это не распараллеливает код, так что это тоже не решение.
Только что понял, что все, что я сделал иначе, чем ваша линия, заключается в том, что я перенесил оси как в «T.arange», так и «target». Это странно. В таком случае вам тоже следовало бы работать. – eickenberg
Хорошо, как вы это делаете, я также обновил свой ответ. Так что проблема в другом месте. Либо версия anano, либо что-то не относящееся к этой конкретной операции - хотя, учитывая сообщение об ошибке, последнее кажется невероятным. – eickenberg