Параллельное индексирование в Keras или Theano

#python #theano #keras

#python #theano #keras

Вопрос:

Проблема 2D

Для каждой точки данных у меня есть индексная матрица, которую я хочу использовать для сбора векторов из матрицы 2D-поиска.

Для одной точки данных, Theano и Keras позволяют легко индексировать.

 import keras.backend as K
result = K.gather(reference, indices)
  

Например.:

 result = K.gather(reference, indices)

#let:
indices.shape = (100, 5)
reference.shape = (101, 68)

#where:
max(indices) < reference.shape[0]

#then:
result.shape = (100, 5, 68)
  

Проблема 3D

Однако мне нужно повторить этот процесс для каждой точки данных в пакете. Например. Я хочу распараллелить поиск.

У меня есть 3D-матрица, которую я хочу преобразовать в 4D-матрицу.

Например.

 #let:
indices.shape = (batch_n, 100, 5)
reference.shape = (batch_n, 101, 68)

#desired result
result.shape = (batch_n, 100, 5, 68)
  

Более формально, я ищу такую операцию, чтобы:

result[i,j,k,:] = lookup[i, indices[i,j,k], :]

или

result[i,j,k,l] = lookup[i, indices[i,j,k], l]

Я реализовал решение Theano с помощью scan. На самом деле это довольно просто:

 import theano
import theano.tensor as T

def parallel_gather(references, indices):
    result, _ = theano.scan(fn=lambda reference, indices:reference[indices], outputs_info=None, sequences=[references, indices])
    return result
  

Переписывание этого в серверную часть Keras кажется проблематичным, учитывая, что keras.rnn это альтернатива Keras. Похоже, он не поддерживает итерацию списка тензоров и имеет некоторые странные требования.

Мне также интересно, является ли это самым быстрым вариантом, возможно, какое-то умное изменение формы также могло бы решить проблему.