python - 无论输入如何,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
解决方案
推荐阅读
- leaflet - 将 minZoom 与 map.fitBounds 一起使用而不会出错
- python - Python - 向时间序列数据集添加行
- java - GetterAndSetter 返回空的 ArrayList
- ios - 关于重用 UITouch 和 UIEvent 对象
- rx-java - 如果 RxJava 失败,如何恢复映射列表
- regex - 具有前瞻模式的 grep 命令不选择任何内容
- html - 文本换行时元素占用 100% 的宽度(flexbox)
- xml - 旧版本产品如何提供方案?
- ruby-on-rails - 如何获得关键字搜索 ransack rails 的最接近匹配
- outlook-addin - 我可以为要使用发送按钮创建的会议设置扩展属性吗?