Keras с бэкэндом тензорного потока, как я могу динамически нарезать тензор, используя другой тензор индексов? - PullRequest
0 голосов
/ 26 января 2020

У меня есть последовательность, "myseq" из (сэмплы, временные шаги, особенности) = (N, 500,8), где N - размер пакета

. Она подается в softmax размера 48 (представляющего 48 возможных windows размера (N, 20,80), когда я использую шаг 10, чтобы посмотреть на windows).

Затем я нахожу "индексы", максимальный индекс выходных значений softmax. = (N, 1), где второе измерение соответствует каждому максимальному индексу «i» softmax для каждой отдельной выборки.

В этот момент я хотел бы нарезать [:, indices: indices + 20,:]

Пример кода будет выглядеть примерно так:

myseq = Input(shape=(500,4))
choices = Dense(48, activation='softmax')(myseq)
indices = K.argmax(choices, axis=1)
indices = K.cast(indices,"int32")
windows = ??

Итак, для краткого изложения: я хочу по-разному нарезать windows длины 20 от axis1 myseq, используя тензорные «индексы» в качестве начальных индексов для каждого пакета.

В настоящее время я могу сделать это с помощью функции, в которой я выполняю итерацию по каждому образцу в пакете, извлекаю каждое заданное окно c и объединить их все вместе в новый тензор. Но это супер неэффективно, и я даже не уверен на 100%, что это ничего не сломает в моей сети. Вот что я делаю:

def get_window(myarr, sums, length, stride, batchsize):
  indexez = K.argmax(sums, axis=1)
  indices = K.cast(indexez,"int32")
  for i in range(batchsize):
      new_arr = Lambda(lambda x: K.slice(x, (i,indices[i]*stride,0), (1,length,myarr.shape[2])))(myarr)
      if i == 0:
        full_arr = new_arr
      else:
        full_arr = Concatenate(axis=0)([full_arr,new_arr])

  full_arr = tf.compat.v1.placeholder_with_default(full_arr,[None,full_arr.shape[1],full_arr.shape[2]])

  return full_arr

Какой-нибудь совет о лучшем способе сделать это? Спасибо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...