Почему обучение моего RNN с помощью ADAM (с использованием Keras) не выполняется, если я ограничиваю столбцы повторяющихся весов? - PullRequest
0 голосов
/ 07 февраля 2020

Я использую Keras для понимания и изучения различных откликов сети при использовании RNN для выполнения различных задач времени отклика (https://arxiv.org/pdf/1906.01094.pdf).

Теперь я хочу ограничить веса RNN и обучают его выполнять те же задачи, но теперь считают, например, некоторые столбцы положительными, а другие отрицательными. Мне удается сделать ограничения, используя пользовательские ограничения ckeras, такие как:

class NonNegLast(Constraint):
    def __call__(self, w):
        first_cols= w[ :,0:int(N_rec/2)]*K.cast(K.less_equal(w[:,0:int(N_rec/2)], 0.0), K.floatx())
        last_cols= w[:,2:int(N_rec/4)]*K.cast(K.greater_equal(w[:,2:int(N_rec/4)], 0.0), K.floatx())                                
        full_matrix = K.concatenate([first_cols,last_cols]],1)
        return matrix

И затем, когда я генерирую модель:

model = Sequential()
model.add(SimpleRNN(units=N_rec,return_sequences=True, input_shape=(None, 2), kernel_initializer='glorot_uniform',recurrent_initializer='glorot_uniform',activation='tanh',use_bias=True,bias_initializer='zeros',recurrent_constraint=NonNegLast()))
model.add(Dense(units=1,activation='tanh',input_dim=N_rec))

Это беспокоит, в том смысле, что ограничения хорошо применимо, так как я был в состоянии проверить ранее построение матрицы Рекуррентного веса.

Но я не могу сделать так, чтобы сеть изучала задачу при применении моих ограничений. Есть идеи почему? Как я могу сохранить ограничения и успешно обучить сеть?

Я пытался: изменить количество единиц. смена оптимизатора. добавление повторяющегося отсева. изменение активации. изменение соотношения отрицательных и положительных чисел в ограничении.

Но это не сработало. Какие-нибудь идеи, которые могли бы помочь сохранить ограничение и заставить его работать?

...