首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ctc_loss错误“找不到有效路径”。

ctc_loss错误“找不到有效路径”。
EN

Stack Overflow用户
提问于 2017-07-16 15:18:45
回答 4查看 7.2K关注 0票数 8

每次运行列车运行时,使用tf.nn.ctc_loss对模型进行培训都会产生错误:

代码语言:javascript
复制
tensorflow/core/util/ctc/ctc_loss_calculator.cc:144] No valid path found.

与以前关于这个函数的问题不同,这并不是因为分歧。我的学习率很低,甚至在第一次列车运行时也会出现错误。

模型是CNN -> LSTM -> CTC。下面是模型创建代码:

代码语言:javascript
复制
# 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)

下面是提要的创建代码:

代码语言:javascript
复制
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
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2017-07-23 14:35:28

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

例如,标签BIFI将要求输入长度至少为4,而标签BIIF由于在重复符号之间插入空白而要求输入长度至少为5。

票数 13
EN

Stack Overflow用户

发布于 2019-05-30 22:31:26

我也有同样的问题,但我很快意识到这仅仅是因为我使用的是glob,而我的标签在文件名中,所以它超出了。

您可以使用以下方法解决此问题:

代码语言:javascript
复制
os.path.join(*(filename.split(os.path.sep)[noOfDir:]))
票数 4
EN

Stack Overflow用户

发布于 2018-08-17 16:25:22

对我来说,这个问题是通过设置preprocess_collapse_repeated=True来解决的。

FWIW:我的目标序列长度已经比输入短,RNN输出是softmax的输出。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45130184

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档