Я использую 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))
Это беспокоит, в том смысле, что ограничения хорошо применимо, так как я был в состоянии проверить ранее построение матрицы Рекуррентного веса.
Но я не могу сделать так, чтобы сеть изучала задачу при применении моих ограничений. Есть идеи почему? Как я могу сохранить ограничения и успешно обучить сеть?
Я пытался: изменить количество единиц. смена оптимизатора. добавление повторяющегося отсева. изменение активации. изменение соотношения отрицательных и положительных чисел в ограничении.
Но это не сработало. Какие-нибудь идеи, которые могли бы помочь сохранить ограничение и заставить его работать?