#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. Похоже, он не поддерживает итерацию списка тензоров и имеет некоторые странные требования.
Мне также интересно, является ли это самым быстрым вариантом, возможно, какое-то умное изменение формы также могло бы решить проблему.