我在Keras中使用双向RNN,需要使用Tensoflows LazyAdamOptimizer。我需要进行梯度归一化。如何使用张量流LazyAdamOptimizer实现梯度归一化,而不是进一步使用功能性keras模型?
我正在训练无监督的RNN来预测长度为10的输入序列。问题是,我正在使用keras功能模型。由于嵌入层的稀疏性,我需要使用Tensorflows LazyAdamOptimizer,它不是keras中的默认优化器。当使用默认的keras优化器时,我可以通过在优化器函数中设置参数'clipnorm = 1'来进行梯度归一化。因为我正在使用LazyAdam,所以我需要使用tensorflow进行此操作,然后再将其传递回我的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:未定义名称'categorical_crossentropy'
但是,即使此错误已解决,我也不知道此代码是否会工作。因为我需要使用keras函数model.compile,所以在此函数中需要指定一个损失。但是当我在上面的张量流部分中执行此操作时,它不起作用。 我需要一种方法来进行梯度归一化并使用正常的keras功能模型吗?!
答案 0 :(得分:0)
也许您可以尝试使用我的惰性优化器工具: https://github.com/bojone/keras_lazyoptimizer
这是一个纯正的keras工具,将现有的优化器包装成一个懒惰的版本。