У меня есть последовательность, "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
Какой-нибудь совет о лучшем способе сделать это? Спасибо.