我面临着一个类似于这里所说的错误,length(b) <= time,但是似乎没有解释这个错误的真正含义。根据我所做的阅读,这是否意味着小型批处理中示例"0“的序列长度小于3?在这种情况下,为什么它是一个错误(因为在tf文档和上面的问题中解释了,所有序列的长度都必须小于时间,对吗?) ..could任何人都可以解释我如何调试这个问题并理解错误?我正在使用一个现有的conv2d示例,并试图使用一些音频文件合并ctc丢失。
代码出现在这里,https://github.com/takingstock/ServerSide-Algos/blob/master/ctc-conv.py和问题发生在第213行(为粘贴代码github url而不是这里的代码而道歉。我觉得这样可能会更干净)
堆栈跟踪
Caused by op u'CTCLoss', defined at:
File "conv_train.py", line 279, in <module>
loss = tf.nn.ctc_loss(Y , logits, seq_len)
File "/usr/local/lib/python2.7/site-packages/tensorflow/python/ops/ctc_ops.py", line 156, in ctc_loss
ignore_longer_outputs_than_inputs=ignore_longer_outputs_than_inputs)
File "/usr/local/lib/python2.7/site-packages/tensorflow/python/ops/gen_ctc_ops.py", line 224, in _ctc_loss
name=name)
File "/usr/local/lib/python2.7/site-packages/tensorflow/python/framework/op_def_library.py", line 787, in _apply_op_helper
op_def=op_def)
File "/usr/local/lib/python2.7/site-packages/tensorflow/python/framework/ops.py", line 3160, in create_op
op_def=op_def)
File "/usr/local/lib/python2.7/site-packages/tensorflow/python/framework/ops.py", line 1625, in __init__
self._traceback = self._graph._extract_stack() # pylint: disable=protected-access
InvalidArgumentError (see above for traceback): sequence_length(0) <= 3
[[Node: CTCLoss = CTCLoss[ctc_merge_repeated=true, ignore_longer_outputs_than_inputs=false, preprocess_collapse_repeated=false, _device="/job:localhost/replica:0/task:0/device:CPU:0"](transpose, _arg_Placeholder_3_0_3, _arg_Placeholder_2_0_2, _arg_Placeholder_4_0_4)]]发布于 2018-03-24 09:00:14
结果发现,错误是因为我将输入输入到ctc_loss函数的方式。逻辑应该是max_timestep、batch_size、num_classes/labels的形式,但我的发送方式正好相反。请查看..hopefully下面的url中的更新代码,它可能对某些人有一定的帮助。
准确地说,这是代码中产生问题的部分。
conv1 = conv2d(x, weights['wc1'], biases['bc1'])
# Max Pooling (down-sampling)
conv1 = maxpool2d(conv1, k=2)
# Convolution Layer
conv2 = conv2d(conv1, weights['wc2'], biases['bc2'])
# Max Pooling (down-sampling)
conv2 = maxpool2d(conv2, k=2)
# Fully connected layer
# Reshape conv2 output to fit fully connected layer input
fc1 = tf.reshape(conv2, [-1, weights['wd1'].get_shape().as_list()[0]])
fc1 = tf.add(tf.matmul(fc1, weights['wd1']), biases['bd1'])
fc1 = tf.nn.relu(fc1)
# Apply Dropout
fc1 = tf.nn.dropout(fc1, dropout)如果您注意到,池的添加降低了需要输入到ctc_loss中的数据的维度。而且,根据我的个人经验(以及我读过的相当多的文献),池没有多大的好处(至少在非图像卷积中是这样),因此我用以下方法替换了上面的内容:
x = tf.reshape(X, shape=[-1, num_features, 399 , 1])
# Convolution Layer
conv1 = conv2d(conv1, weights['wc1'], biases['bc1'], 1)
fc1 = tf.reshape(conv1, [batch_size , 399 ,
weights['wd1'].get_shape().as_list()[0]])
fc1 = tf.layers.dense( fc1, 1024 , activation=tf.nn.relu)
# Apply Dropout
fc1 = tf.nn.dropout(fc1, keep_prob)
# Output, class prediction
logits = tf.layers.dense(inputs=fc1, units=num_classes, activation=tf.nn.relu)
logits = tf.transpose(logits, (1, 0, 2))
loss = tf.nn.ctc_loss(Y , logits, seq_len)这样,输入到ctc_loss的输入就有了确切的max_ts、批处理、标签格式。另外,仅使用1层conv的结果要比BiRNN (**对于我的数据) ..also要好得多--这篇文章被证明是非常直观的帮助(对于与ctc_loss一起使用卷积) loss in cnn+ctc network
https://stackoverflow.com/questions/48889769
复制相似问题