2017-07-16 7 views
2

ein Modells mit tf.nn.ctc_loss einem Fehler Ausbildung erzeugt jedes Mal, wenn der Zug op ausgeführt:ctc_loss Fehler "Kein gültiger Pfad gefunden."

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

Im Gegensatz zu früheren Fragen zu dieser Funktion ist diese Divergenz nicht fällig. Ich habe eine niedrige Lernrate und der Fehler tritt sogar bei der ersten Zugoperation auf.

Das Modell ist ein CNN -> LSTM -> CTC. Hier ist die Modellerstellung Code:

# 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) 

Und hier wird das Futter dict Erstellungscode:

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 

Antwort

4

Es stellt sich heraus, dass die ctc_loss erfordert, dass die Etikettenlängen kürzer sein als die Eingangslängen. Wenn die Etikettenlängen zu lang sind, kann der Verlustrechner nicht vollständig ausrollen und kann daher den Verlust nicht berechnen.

+1

irgendwelche Ratschläge, wie Sie dies debuggen können? Es scheint, dass dies falsche Beispiele wären, aber es ist schwierig, sie bei Chargenschulungen zu identifizieren –