Индексирование тензора Кераса - PullRequest
0 голосов
/ 02 июня 2018

Выходным слоем моей функциональной модели Keras является тензор x размерности (None, 1344, 2).Я хочу извлечь n < 1344 записей из 2-го измерения x и создать новый тензор y размера (None, n, 2).

Кажется простым извлекать n последовательных записей простым доступом к x[:, :n,:], но (на первый взгляд) сложно, если индексы n непоследовательны.Есть ли в Керасе чистый способ сделать это?

Вот мои подходы.

Эксперимент 1 (Разрезание тензора, последовательные индексы, работы):

print('My tensor shape is', K.int_shape(x)) #my tensor 
(None, 1344, 2) # as printed in my code
print('Slicing first 5 entries, shape is', K.int_shape(x[:, :5, :]))
(None, 5, 2) # as printed in my code, works!

Эксперимент 2 (индексирование тензора при произвольных индексах завершается неудачей)

print('My tensor shape is', K.int_shape(x)) #my tensor 
(None, 1344, 2) # as printed in my code
foo = np.array([1,2,4,5,8])
print('arbitrary indexing, shape is', K.int_shape(x[:,foo,:]))

Keras возвращает следующую ошибку:

ValueError: Shapes must be equal rank, but are 1 and 0
From merging shape 1 with other shapes. for 'strided_slice_17/stack_1' (op: 
'Pack') with input shapes: [], [5], [].

Эксперимент 3 (серверная часть тензорного потокаЯ также попробовал K.backend.gather, но его использование неясно, потому что 1) Документация Keras гласит, что индексы должны быть тензором целых чисел, и нет эквивалента Keras, равного numpy.where, если моя цель - извлечь записи в xудовлетворяя определенному условию, и 2) K.backend.gather, кажется, извлекает записи из axis = 0, тогда как я хочу извлечь из второго измерения x.

1 Ответ

0 голосов
/ 02 июня 2018

Вы ищете tf.gather_nd , который будет индексироваться на основе индексного массива:

# From documentation
indices = [[0, 0], [1, 1]]
params = [['a', 'b'], ['c', 'd']]
output = ['a', 'd']

Чтобы использовать его в модели Keras, обязательно оберните его в виде слояLambda.

...