我正在使用Keras,我想将dropConnect应用于LSTM中隐藏到隐藏的权重。我发现Keras仅允许使用(recurrent_dropout)对隐藏状态应用dropout。
我正在尝试对此进行自定义实现。我正在尝试使用以下方法创建自定义recurrent_regularizer:
def dropConnect_reg(weight_matrix):
return tf.nn.dropout(weight_matrix, rate = 0.5)
然后按如下方式使用它(任务是语言建模,因此我在vocab上应用了softmax层):
model.add(LSTM(650, return_sequences=True, recurrent_regularizer=dropConnect_reg))
model.add(Dense(vocab_size, activation='softmax'))
但是,我认为这无法正常工作。如果不使用实现的recurrent_regularizer,则损失为预期的标量(分类交叉熵损失)。但是,使用它时,它将输出一个完整的损耗数组,而不是只有一个数字(尺寸:time_steps,time_steps * 4)。我目前也不确定是否仅在培训期间应用了此功能。
有关如何正确实施此操作的任何想法?
答案 0 :(得分:0)
如果只需要LSTM的最后一个输出,则需要设置return_sequences=False
。如果您只想在培训期间应用辍学,则需要以下内容:
def dropconnect_regularizer(weight_matrix):
return tf.nn.dropout(weight_matrix, rate=0.5)
if training:
regularizer = dropconnect_regularizer
else:
regularizer = None
model.add(LSTM(650, recurrent_regularizer=regularizer))