每次运行列车运行时,使用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)下面是提要的创建代码:
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发布于 2017-07-23 14:35:28
结果表明,ctc_loss要求标号长度小于输入长度。如果标签长度太长,丢失计算器无法完全展开,因此无法计算损失。
例如,标签BIFI将要求输入长度至少为4,而标签BIIF由于在重复符号之间插入空白而要求输入长度至少为5。
发布于 2019-05-30 22:31:26
我也有同样的问题,但我很快意识到这仅仅是因为我使用的是glob,而我的标签在文件名中,所以它超出了。
您可以使用以下方法解决此问题:
os.path.join(*(filename.split(os.path.sep)[noOfDir:]))发布于 2018-08-17 16:25:22
对我来说,这个问题是通过设置preprocess_collapse_repeated=True来解决的。
FWIW:我的目标序列长度已经比输入短,RNN输出是softmax的输出。
https://stackoverflow.com/questions/45130184
复制相似问题