Я тренирую уровень ГРУ, где входные данные не имеют одинаковой длины. Поэтому я добавил к функциям входов 0,0, чтобы все последовательности имели одинаковую длину. С другой стороны, я не хочу вычислять какие-либо потери на любом временном шаге для любой выборки, пока входной вектор признаков - это все нули. Например, на временном шаге 1000 у меня есть размер пакета 34, но в образцах с номерами 33 и 34 этого пакета отсутствуют данные или значения признаков на временном шаге 1000.
Я обнаружил, что мы можем использовать метод Masking()(inputs)
в Keras, если все последующие уровни или операции поддерживают masking
. Но я реализовал свою модель в тензорном потоке. Так в чем же эквивалентность Masking()
в тензорном потоке?
Во-вторых, как я могу узнать, поддерживает ли batch normalization
, слой conv
и какая-либо функция non linear activation
функцию masking()
в Keras?
Ваша помощь очень ценится !!
Итак, я нашел подробное решение в блоге danijar https://danijar.com/variable-sequence-lengths-in-tensorflow/.
Маскировка в keras используется при наличии неполных последовательностей. Поэтому обычно вам нужно дополнить свои последовательности 0,0 в третьем измерении (измерение функции; когда входное измерение имеет shape = [batch_size, sequence_length, num_features]
). После этого маскирование в keras будет принимать число, будет выводить 0 для их активации.
В итоге: он показал, как вычислить длину последовательности для каждого образца в партии, используя реализованный им length()
. Затем выходной вектор подается в dynamic_rnn
, который выводит нулевые векторы для неполных последовательностей (для состояний и выходов), что в некоторой степени похоже на то, что происходит в функции Keras Masking()
. Во-вторых, мы должны использовать mask
при вычислении функции потерь.
Все подробности обсуждаются в этом сообщении в блоге.
Но что касается поддержки маскировки в batch_norm
, conv
и non linear activation function
; обычно, если на выходе LSTM
есть нули; то в случае с функцией активации sigmoid
на выходе; производная выхода относительно входа сигмовидной функции - output(1 - output)
. Следовательно, когда выход равен 0, эта производная также равна нулю. И поскольку обратное распространение применяет правило цепочки, тогда градиенты текущей выборки по отношению к любому параметру веса в сети также будут равны 0. Следовательно, нет необходимости беспокоиться о поддержке ... Но проблема возникает, когда активация повторяется, например, это когда градиенты должны быть явно умножены на нули перед выполнением обратного распространения (я думаю). Может быть, что-то вроде этого поможет:
final_output = output * mask
Тогда производной final_output
по отношению к output
будет маска => 0 или 1 (любой временной шаг; для любого образца). Затем распространите этот градиент обратно от output
функции активации на его входы ... с последующим правилом цепочки => веса в этом случае не будут затронуты.
Conv1D не поддерживает маскировку. Это я говорю на собственном опыте. Не уверен насчет других.