tensorflow - CTC_损失错误 "No valid path found."

标签 tensorflow deep-learning lstm

每次运行训练操作时,使用tf.nn.ctc_loss训练模型都会产生错误:

tensorflow/core/util/ctc/ctc_loss_calculator.cc:144] No valid path found.

与之前有关此函数的问题不同,这不是由于分歧造成的。我的学习率很低,甚至在第一次训练操作时也会出现错误。

该模型是 CNN -> LSTM -> CTC。这是模型创建代码:

# Build Graph
self.videoInput = tf.placeholder(shape=(None, self.maxVidLen, 50, 100, 3), dtype=tf.float32)
self.videoLengths = tf.placeholder(shape=(None), dtype=tf.int32)
self.keep_prob = tf.placeholder(dtype=tf.float32)
self.targets = tf.sparse_placeholder(tf.int32)
self.targetLengths = tf.placeholder(shape=(None), dtype=tf.int32)

conv1 = tf.layers.conv3d(self.videoInput ...)
pool1 = tf.layers.max_pooling3d(conv1 ...)
conv2 = ...
pool2 = ...
conv3 = ...
pool3 = ...

cnn_out = tf.reshape(pool3, shape=(-1, self.maxVidLength, 4*7*96))

fw_cell = tf.nn.rnn_cell.MultiRNNCell(self.cell(), for _ in range(3))
bw_cell = tf.nn.rnn_cell.MultiRNNCell(self.cell(), for _ in range(3))
outputs, _ = tf.nn.bidirectional_dynamic_rnn(
            fw_cell, bw_cell, cnn_out, sequence_length=self.videoLengths, dtype=tf.float32)

outputs = tf.concat(outputs, 2)
outputs = tf.reshape(outputs, [-1, self.hidden_size * 2])

w = tf.Variable(tf.random_normal((self.hidden_size * 2, len(self.char2index) + 1), stddev=0.2))
b = tf.Variable(tf.zeros(len(self.char2index) + 1))

out = tf.matmul(outputs, w) + b
out = tf.reshape(out, [-1, self.maxVidLen, len(self.char2index) + 1])
out = tf.transpose(out, [1, 0, 2])

cost = tf.reduce_mean(tf.nn.ctc_loss(self.targets, out, self.targetLengths))
self.train_op = tf.train.AdamOptimizer(0.0001).minimize(cost)

这是 feed 字典创建代码:

indices = []
values = []
shape = [len(vids) * 2, self.maxLabelLen]
vidInput = np.zeros((len(vids) * 2, self.maxVidLen, 50, 100, 3), dtype=np.float32)

# Actual video, then left-right flip
for j in range(len(vids) * 2):

    # K is video index
    k = j if j < len(vids) else j - len(vids)

    # convert video and label to input format
    vidInput[j, 0:len(vids[k])] = vids[k] if k == j else vids[k][:,::-1,:]
    indices.extend([j, i] for i in range(len(labelList[k])))
    values.extend(self.char2index[c] for c in labelList[k])

fd[self.targets] = (indices, values, shape)
fd[self.videoInput] = vidInput

# Collect video lengths and label lengths
vidLengths = [len(j) for j in vids] + [len(j) for j in vids]
labelLens = [len(l) for l in labelList] + [len(l) for l in labelList]
fd[self.videoLengths] = vidLengths
fd[self.targetLengths] = labelLens

最佳答案

事实证明,ctc_loss 要求标签长度小于输入长度。如果标签长度太长,损失计算器无法完全展开,因此无法计算损失。

例如,标签 BIFI 要求输入长度至少为 4,而标签 BIIF 则要求输入长度至少为 5,因为中间插入了空格重复的符号。

关于tensorflow - CTC_损失错误 "No valid path found.",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45130184/

相关文章:

python - 值错误 : You are trying to load a weight file containing 6 layers into a model with 0

keras - keras 中用于文本分类的 convolution2d 的尺寸误差

python - Keras + TensorFlow Realtime 训练图

python - tensorflow 中的平均精度(mAP)

machine-learning - 所有输入数组和目标数组必须具有相同数量的样本。”- 在单个图像上进行训练以检查模型在 keras 中是否有效

python - TF 2.0 W 操作已更改...禁用急切模式并使用回调时

python-3.x - "tensorflow.python.framework.errors_impl.FailedPreconditionError"同时运行 "model_main_tf2.py"用于在 tensorflow 中训练对象检测模型

python - Py2app 应用程序无法与 tensorflow 一起使用

python - 在这个LSTM示例代码中如何计算可训练参数数量为335872?