CTC LossTensor是inf还是nan:Tensor有Inf值吗?

时间:2018-03-05 05:12:03

标签: tensorflow

我在训练的第一步(或300步左右)后仍然遇到这个错误。任何人都可以指出这种情况发生的原因吗?如果您对我使用的模型感兴趣,请点击这里:

{
  "network":[
    {"layer_type": "input_layer", "name": "inputs", "shape": [-1, 168, 168, 1]},
    {"layer_type": "l2_normalize", "axis": [1, 2]},
    {"layer_type": "conv2d", "num_filters": 16, "kernel_size": [3, 3]},
    {"layer_type": "max_pool2d", "pool_size": [2, 2]},
    {"layer_type": "l2_normalize", "axis": [1, 2]},
    {"layer_type": "conv2d", "num_filters": 32, "kernel_size": [3, 3]},
    {"layer_type": "max_pool2d", "pool_size": [2, 2]},
    {"layer_type": "l2_normalize", "axis": [1, 2]},
    {"layer_type": "dropout", "keep_prob": 0.5},
    {"layer_type": "conv2d", "num_filters": 64, "kernel_size": [3, 3]},
    {"layer_type": "max_pool2d", "pool_size": [2, 2]},
    {"layer_type": "l2_normalize", "axis": [1, 2]},
    {"layer_type": "dropout", "keep_prob": 0.5},
    {"layer_type": "collapse_to_rnn_dims"},
    {"layer_type": "birnn", "num_hidden": 128, "cell_type": "LSTM"},
    {"layer_type": "birnn", "num_hidden": 128, "cell_type": "LSTM"},
    {"layer_type": "birnn", "num_hidden": 128, "cell_type": "LSTM"},
    {"layer_type": "dropout", "keep_prob": 0.5}
  ],
  "output_layer": "ctc_decoder",
  "loss": "ctc",
  "metrics": ["label_error_rate"],
  "learning_rate": 0.001,
  "optimizer": "adam"
}

对于标签,我首先填充它们以匹配最长长度标签的长度。

2 个答案:

答案 0 :(得分:1)

我认为您正在处理语音转文本或类似问题。 当您的模型由RNN / LSTM组成时,Inf和Nan值通常很常见。这使得他们成功实施起来有点困难。 你在这里使用什么样的激活函数/非线性,特别是对于RNN层?

我在训练LSTM时经常观察到Nan和Inf值,主要是由于消失梯度和爆炸梯度问题。我建议使用剪切的RELU功能。在TensorFlow中,您可以使用默认函数 tf.nn.relu6 按值6进行剪辑。您可以编写一个简单的自定义函数,以剪切其他值。

如果您仍然面临同样的问题,请尝试稍微修改架构和参数。可能最初使用2层Bi-LSTM并且可能具有较小的隐藏状态。

希望这会有所帮助。 试试这些,让我知道它是如何工作的。

答案 1 :(得分:0)

它肯定是导致问题的输入的序列长度。显然,序列长度应该比地面实际长度略大。