Используйте веса временных классов в RNN "многие-к-одному" в Керасе

У меня есть модель, которая использует несколько уровней RNN "многие ко многим", за которыми следуют один уровень "многие к одному" и уровень декодирования "один к одному".

Таким образом, первый уровень RNN использует параметр "return_sequence =True", а второй уровень RNN использует "return_sequence =False".

До сих пор это работает, но разваливается, когда я добавляю выборочные веса. Если бы у меня была обычная сеть "многие ко многим", я бы просто установил sample_weight_mode="temporal" в функции compile() и определил весовые коэффициенты как 2d матрицу.

Однако в моем случае "многие к одному" это не работает, так как я получаю ошибку, что временные веса ожидают измерения времени в выходных данных. Я понимаю, что это, вероятно, связано с тем, что мой уровень декодирования больше не является временным (многие-к-одному). Но я не могу запустить сеть, используя невременные веса, так как это не будет работать вместе со слоями "многие ко многим".

Есть ли решение, позволяющее иметь веса выборок со смешанными слоями "многие ко многим" и "многие к одному"?

Вот моя модель, чтобы немного уточнить:

_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
the_input (InputLayer)       (None, 20, 249)           0         
_________________________________________________________________
masking_1 (Masking)          (None, 20, 249)           0         
_________________________________________________________________
time_distributed_1 (TimeDist (None, 20, 64)            16000     
_________________________________________________________________
relu (Activation)            (None, 20, 64)            0         
_________________________________________________________________
simple_rnn_1 (SimpleRNN)     (None, 20, 16)            1296      
_________________________________________________________________
simple_rnn_2 (SimpleRNN)     (None, 16)                528       
_________________________________________________________________
dense_2 (Dense)              (None, 36)                612       
_________________________________________________________________
softmax (Activation)         (None, 36)                0         
=================================================================

1 ответ

Решение

TL;DR - Просто установите вас sample_weight_mode в None

Но я не могу запустить сеть, используя невременные веса, так как это не будет работать вместе со слоями "многие ко многим".

Это предложение заставляет меня думать, что вы на самом деле не понимаете, какой выборочный вес должен делать. Из документов Кераса:

sample_weight: необязательный массив весов Numpy для обучающих выборок, используемый для взвешивания функции потерь

Это означает, что ваши веса выборки будут использоваться только для функции потерь (и, в более поздних версиях, также для взвешенных показателей). Поскольку ваша функция потерь - это функция только вашего выхода, я не вижу причин, по которым ваши зависимые от времени промежуточные слои могут вообще что-то повлиять.

Если у вас есть один выход для каждой временной последовательности, тогда ваша выборка - это полная временная последовательность, а не каждый временной шаг. Таким образом, веса вашего образца не отличаются от тех, которые вы использовали бы, например, для MLP.

Другие вопросы по тегам