Как сделать градиентную нормализацию с помощью Tensorflow LazyAdamOptimizer в функциональной модели Keras? - PullRequest
0 голосов
/ 01 июля 2019

Я использую двунаправленный RNN в Керасе и мне нужно использовать Tensoflow LazyAdamOptimizer. Мне нужно сделать градиентную нормализацию. Как я могу реализовать нормализацию градиента с тензорными потоками LazyAdamOptimizer и чем дальше использовать модель функциональных кератов?

Я тренирую RNN без присмотра, чтобы предсказать входную последовательность длины 10. Проблема в том, что я использую функциональную модель keras. Из-за разреженности встраиваемого слоя мне нужно использовать Tensorflows LazyAdamOptimizer, который не является оптимизатором по умолчанию в кератах. При использовании оптимизатора Keras по умолчанию я могу выполнить нормализацию градиента, просто установив аргумент «clipnorm = 1» в функции оптимизатора. Поскольку я использую LazyAdam, мне нужно сделать это с помощью tenorflow, а затем передать его обратно в мою модель keras, но я не могу заставить код работать.

#model architecture
model_input = Input(shape=(seq_len, ))
embedding_a = Embedding(len(port_fwd_dict), 50, input_length=seq_len, mask_zero=True)(model_input)
lstm_a = Bidirectional(GRU(25, return_sequences=True,implementation=2, reset_after=True, recurrent_activation='sigmoid'), merge_mode="concat (embedding_a)
dropout_a = Dropout(0.2)(lstm_a)
lstm_b = Bidirectional(GRU(25, return_sequences=False, activation="relu", implementation=2, reset_after=True, recurrent_activation='sigmoid'), merge_mode="concat")(dropout_a)
dropout_b = Dropout(0.2)(lstm_b)
dense_layer = Dense(100, activation="linear")(dropout_b)
dropout_c = Dropout(0.2)(dense_layer)
model_output = Dense(len(port_fwd_dict)-1, activation="softmax(dropout_c)

# trying to implement gradient normalization
optimizer = tf.contrib.opt.LazyAdamOptimizer()
optimizer = tf.contrib.estimator.clip_gradients_by_norm(optimizer, 1)
loss = tf.reduce_mean(categorical_crossentropy(model_input, model_output))
train_op = optimizer.minimize(loss, tf.train.get_global_step())

model = Model(inputs=model_input, outputs=model_output)

model.compile(optimizer=train_op, loss='categorical_crossentropie', metrics = [ 'categorical_accuracy'])


history = model.fit(X_train, Y_train, epochs=epochs, batch_size=batch_size, validation_split=validation_split, class_weight = 'auto')

Blockquote

Я получаю следующую ошибку: NameError: имя 'categoryorical_crossentropy' не определено

Но даже если эта ошибка будет решена, я не знаю, будет ли этот код работать. Потому что мне нужно использовать функцию keras model.compile, и в этой функции должна быть указана потеря. но когда я делаю это в приведенной выше части тензорного потока, он не работает. Мне нужен способ для нормализации градиента и использования моей нормальной функциональной модели keras?!

...