为啥某些隐藏单元在 GRU 自动编码器中返回零?

Posted

技术标签:

【中文标题】为啥某些隐藏单元在 GRU 自动编码器中返回零?【英文标题】:Why some of the hidden units return zero in the GRU autoencoder?为什么某些隐藏单元在 GRU 自动编码器中返回零? 【发布时间】:2021-11-20 16:04:56 【问题描述】:

我已经实现了一个递归神经网络自动编码器,如下所示:

def AE_GRU(X):
    inputs = Input(shape=(X.shape[1], X.shape[2]), name="input")
    L1 = GRU(8, activation="relu", return_sequences=True, kernel_regularizer=regularizers.l2(0.00), name="E1")(inputs)
    L2 = GRU(4, activation="relu", return_sequences=False, name="E2")(L1)
    L3 = RepeatVector(X.shape[1], name="RepeatVector")(L2)
    L4 = GRU(4, activation="relu", return_sequences=True, name="D1")(L3)
    L5 = GRU(8, activation="relu", return_sequences=True, name="D2")(L4)
    output = TimeDistributed(Dense(X.shape[2]), name="output")(L5)
    model = Model(inputs=inputs, outputs=[output])
    return model

然后我运行以下代码来训练 AE:

model = AE_GRU(trainX)
optimizer = tf.keras.optimizers.Adam(learning_rate=0.01)
model.compile(optimizer=optimizer, loss="mse")
model.summary()
epochs = 5
batch_size = 64
history = model.fit(
                    trainX, trainX,
                    epochs=epochs, batch_size=batch_size,
                    validation_data=(valX, valX)
                    ).history

我还在下面附上了model.summary() 的结果。

最后,我通过运行以下代码来提取第二个隐藏层输出。

def all_hidden_layers_output(iModel, dtset):
    inp = iModel.input                                           # input placeholder
    outputs = [layer.output for layer in iModel.layers]          # all layer outputs
    functors = [K.function([inp], [out]) for out in outputs]    # evaluation functions
    layer_outs = [func([dtset]) for func in functors]
    return layer_outs


hidden_state_train = all_hidden_layers_output(model, trainX)[2][0]
hidden_state_val = all_hidden_layers_output(model, valX)[2][0]

# remove zeros_columns:
hidden_state_train = hidden_state_train[:,~np.all(hidden_state_train==0.0, axis=0)]
hidden_state_val = hidden_state_val[:,~np.all(hidden_state_val==0.0, axis=0)]

print(f"hidden_state_train.shape=hidden_state_train.shape")
print(f"hidden_state_val.shape=hidden_state_val.shape")

但我不知道为什么这一层中的某些单元总是返回零。我希望得到 hidden_state_trainhidden_state_val 作为具有 4 个非零的二维 numpy 数组列(基于model.summary() 信息)。 任何帮助将不胜感激。

【问题讨论】:

供您参考:trainX.shape=(462939, 8, 22) valX.shape=(195861, 8, 22) 【参考方案1】:

这可能是由于垂死的 relu 问题。对于负值,relu 为 0。看看这个 (https://towardsdatascience.com/the-dying-relu-problem-clearly-explained-42d0c54e0d24) 对问题的解释。

【讨论】:

这正是我问题的根源。非常感谢。 我已将“relu”激活函数更改为“sigmoid”,它解决了我的问题。 欢迎您,很高兴我的回答对您有所帮助!

以上是关于为啥某些隐藏单元在 GRU 自动编码器中返回零?的主要内容,如果未能解决你的问题,请参考以下文章

PyTorch GRU 中隐藏状态的层顺序返回

81.门控循环单元(GRU)以及代码实现

不知道为啥列返回零

如何在pytorch LSTM中自定义多个隐藏层单元的数量?

LSTM与GRU有什么联系和区别?

如何在pytorch中获得双向2层GRU的最终隐藏状态