如何在keras中的递归权重上应用dropConnect

时间:2020-01-27 17:14:32

标签: tensorflow keras lstm

我正在使用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)。我目前也不确定是否仅在培训期间应用了此功能。

有关如何正确实施此操作的任何想法?

1 个答案:

答案 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))