【问题标题】:crash in ctc loss functionctc损失函数崩溃
【发布时间】:2017-08-26 03:07:41
【问题描述】:

我在 Tensorflow 1.2.0-rc0 (python 2.7) 中使用 ctc-loss 函数得到以下 InvalidArgumentError

InvalidArgumentError (see above for traceback): label SparseTensor is not valid: indices[7] = [0,7] is out of bounds: need 0 <= index < [1,7]
         [[Node: loss/CTCLoss = CTCLoss[ctc_merge_repeated=true, ignore_longer_outputs_than_inputs=false, preprocess_collapse_repeated=false, _device="/job:localhost/replica:0/task:0/cpu:0"](output_fc/BiasAdd/_91, _arg_labels/indices_0_1, _arg_labels/values_0_3, seq_len/Cast/_93)]]
         [[Node: loss/CTCLoss/_103 = _Recv[client_terminated=false, recv_device="/job:localhost/replica:0/task:0/gpu:0", send_device="/job:localhost/replica:0/task:0/cpu:0", send_device_incarnation=1, tensor_name="edge_103_loss/CTCLoss", tensor_type=DT_FLOAT, _device="/job:localhost/replica:0/task:0/gpu:0"]()]]

我不明白:

label SparseTensor is not valid: indices[7] = [0,7] is out of bounds: need 0 <= index < [1,7]

由于正在崩溃的SparseTensor(目标序列)是(我将批量大小设置为1):

(array([[ 0,  0],
       [ 0,  1],
       [ 0,  2],
       [ 0,  3],
       [ 0,  4],
       [ 0,  5],
       [ 0,  6],
       [ 0,  7],
       [ 0,  8],
       [ 0,  9],
       [ 0, 10],
       [ 0, 11],
       [ 0, 12],
       [ 0, 13],
       [ 0, 14],
       [ 0, 15],
       [ 0, 16],
       [ 0, 17],
       [ 0, 18],
       [ 0, 19],
       [ 0, 20],
       [ 0, 21],
       [ 0, 22]], dtype=int32), array([41,  2,  7,  0, 13, 19,  4, 11, 11,  4, 40, 19,  8,  1,  1, 18, 40,
       24,  4,  0,  7, 40, 41], dtype=int32), array([ 1, 23], dtype=int32))

在之前的迭代中,它处理了具有相似值的较长序列,例如:

(array([[  0,   0],
       [  0,   1],
       [  0,   2],
       [  0,   3],
       [  0,   4],
       [  0,   5],
       [  0,   6],
       [  0,   7],
       [  0,   8],
       [  0,   9],
       [  0,  10],
       [  0,  11],
       [  0,  12],
       [  0,  13],
       [  0,  14],
       [  0,  15],
       [  0,  16],
       [  0,  17],
       [  0,  18],
       [  0,  19],
       [  0,  20],
       [  0,  21],
       [  0,  22],
       [  0,  23],
       [  0,  24],
       [  0,  25],
       [  0,  26],
       [  0,  27],
       [  0,  28],
       [  0,  29],
       [  0,  30],
       [  0,  31],
       [  0,  32],
       [  0,  33],
       [  0,  34],
       [  0,  35],
       [  0,  36],
       [  0,  37],
       [  0,  38],
       [  0,  39],
       [  0,  40],
       [  0,  41],
       [  0,  42],
       [  0,  43],
       [  0,  44],
       [  0,  45],
       [  0,  46],
       [  0,  47],
       [  0,  48],
       [  0,  49],
       [  0,  50],
       [  0,  51],
       [  0,  52],
       [  0,  53],
       [  0,  54],
       [  0,  55],
       [  0,  56],
       [  0,  57],
       [  0,  58],
       [  0,  59],
       [  0,  60],
       [  0,  61],
       [  0,  62],
       [  0,  63],
       [  0,  64],
       [  0,  65],
       [  0,  66],
       [  0,  67],
       [  0,  68],
       [  0,  69],
       [  0,  70],
       [  0,  71],
       [  0,  72],
       [  0,  73],
       [  0,  74],
       [  0,  75],
       [  0,  76],
       [  0,  77],
       [  0,  78],
       [  0,  79],
       [  0,  80],
       [  0,  81],
       [  0,  82],
       [  0,  83],
       [  0,  84],
       [  0,  85],
       [  0,  86],
       [  0,  87],
       [  0,  88],
       [  0,  89],
       [  0,  90],
       [  0,  91],
       [  0,  92],
       [  0,  93],
       [  0,  94],
       [  0,  95],
       [  0,  96],
       [  0,  97],
       [  0,  98],
       [  0,  99],
       [  0, 100],
       [  0, 101],
       [  0, 102],
       [  0, 103],
       [  0, 104],
       [  0, 105],
       [  0, 106],
       [  0, 107],
       [  0, 108],
       [  0, 109],
       [  0, 110]], dtype=int32), array([41, 22,  4, 36, 17,  4, 40,  6, 14,  8, 13,  6, 40, 19, 14, 40,  4,
        0, 19, 40,  8, 19, 40, 22,  4, 36, 17,  4, 40,  6, 14,  8, 13,  6,
       40, 19, 14, 40, 14, 15,  4, 13, 40, 20, 15, 40, 18, 14, 12,  4, 40,
       22,  8, 13,  4, 40,  0, 13,  3, 40, 22,  4, 36, 17,  4, 40,  6, 14,
        8, 13,  6, 40, 19, 14, 40, 19,  4, 11, 11, 40, 24, 14, 20, 40, 18,
       19, 14, 17,  0,  6,  4, 40,  7, 14, 22, 40, 12, 20,  2,  7, 40,  8,
       19, 40,  2, 14, 18, 19, 18, 40, 41], dtype=int32), array([  1, 111], dtype=int32))

提前谢谢你。

【问题讨论】:

    标签: python python-2.7 tensorflow


    【解决方案1】:

    我一直面临的问题: 该错误意味着

    • 您的第 0 个维度的值应小于 1,即值只有 0 可以工作。
    • 第一个维度的值应小于 7,即值只能介于 0 和 6 之间。

    这就是它开始从索引[7] 崩溃的原因,因为它的第一个维度的值为 7,大于 6。

    此外,我认为问题是由于帧数(时间步长维度)的值小于发送到 ctc_loss 函数的 target_labels 数。

    尝试使帧数/时间步数> target_labels 数,您的代码肯定可以工作!

    我想进一步提供帮助,您能否将您的代码链接发给我。

    【讨论】:

    • 谢谢!我做了更多研究,似乎问题出在 TF 忽略了ignore_longer_outputs_than_inputs 选项(我之前设置为True)。
    【解决方案2】:

    ctc.loss (https://www.tensorflow.org/api_docs/python/tf/nn/ctc_loss) 似乎忽略了选项:ignore_longer_outputs_than_inputs=True。它不会忽略比输入序列更长的输出,而是返回 InvalidArgumentError(似乎我没有正确检查序列的长度)。

    因此,解决方案是预处理您的数据集,并确保您输入到 ctc_loss 的所有序列都具有比输入更多的目标。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-01-16
      • 1970-01-01
      • 1970-01-01
      • 2020-07-25
      • 1970-01-01
      • 2020-12-04
      • 2018-09-04
      • 1970-01-01
      相关资源
      最近更新 更多