首页 > 解决方案 > 无论输入如何,LSTM 层(keras)都会导致其之后的所有层不断预测相同的事物

问题描述

我有一个 OCR 模型,我意识到在 2-3 个 epoch 之后模型的输出是相同的。因此,当我预测值并查看每一层的输出时,我意识到无论输出如何,LSTM 块中第一层之后的所有层都输出相同的值。所以这里是模型(或与问题相关的部分):

Processing = layers.Reshape((12,9472))(encoder)

Processing = layers.Dense(128, activation='relu')(Processing)

lstm = layers.Bidirectional(layers.LSTM(256, return_sequences = True))(Processing)
lstm = layers.Bidirectional(layers.LSTM(128, return_sequences = True))(lstm)
lstm = layers.Bidirectional(layers.LSTM(64, return_sequences = True))(lstm)

outputs = layers.Dense(358,activation=tf.keras.layers.LeakyReLU(alpha=0.1))(lstm)
outputs = layers.Dense(358, activation=tf.keras.layers.LeakyReLU(alpha=0.1))(outputs)
outputs = layers.Dense(l, activation='softmax',name='output')(outputs)

output = CTCLayer()(labels,outputs)

第一个 LSTM 层之后(包括)的所有内容都输出相同的值(不包括 CTC 层的东西,因为它被移除以进行预测)。

在选择模型之前,我认为这可能是一个垂死的 relu 问题,所以我用泄漏的 relu 替换了所有 relu 的激活函数。那么是什么原因导致我的实现有问题?或者是什么可能导致 LSTM 层之后的一切“死亡”。我将如何解决根本问题?

仅供参考:CTCLayer 来自 keras 网站的代码示例

顺便说一句:另一个奇怪的事情是,即使在它输出相同的东西之后,损失值也会减少一段时间(所以从 20.5 - 16.2),所以它仍在学习。我很确定这与学习率无关,因为我尝试了极小的值(1e-10,只是花了更长的时间才能达到所有输出都相同的点,根据我的观察,它在 22 到 16 之间,就损失而言)

class CTCLayer(layers.Layer):
    def __init__(self, name=None):
        super().__init__(name=name)
        self.loss_fn = keras.backend.ctc_batch_cost

    def call(self, y_true, y_pred):
        batch_len = tf.cast(tf.shape(y_true)[0], dtype="int64")
        input_length = tf.cast(tf.shape(y_pred)[1], dtype="int64")
        label_length = tf.cast(tf.shape(y_true)[1], dtype="int64")

        input_length = input_length * tf.ones(shape=(batch_len, 1), dtype="int64")
        label_length = label_length * tf.ones(shape=(batch_len, 1), dtype="int64")

        loss = self.loss_fn(y_true, y_pred, input_length, label_length)
        self.add_loss(loss)

        return y_pred

标签: pythontensorflowkeraslstmocr

解决方案


推荐阅读