Câu hỏi và vấn đề của tôi được nêu bên dưới hai khối mã.TensorFlow: Thực hiện tính toán tổn thất này
Mất Chức năng
def loss(labels, logits, sequence_lengths, label_lengths, logit_lengths):
scores = []
for i in xrange(runner.batch_size):
sequence_length = sequence_lengths[i]
for j in xrange(length):
label_length = label_lengths[i, j]
logit_length = logit_lengths[i, j]
# get top k indices <==> argmax_k(labels[i, j, 0, :], label_length)
top_labels = np.argpartition(labels[i, j, 0, :], -label_length)[-label_length:]
top_logits = np.argpartition(logits[i, j, 0, :], -logit_length)[-logit_length:]
scores.append(edit_distance(top_labels, top_logits))
return np.mean(scores)
# Levenshtein distance
def edit_distance(s, t):
n = s.size
m = t.size
d = np.zeros((n+1, m+1))
d[:, 0] = np.arrange(n+1)
d[0, :] = np.arrange(n+1)
for j in xrange(1, m+1):
for i in xrange(1, n+1):
if s[i] == t[j]:
d[i, j] = d[i-1, j-1]
else:
d[i, j] = min(d[i-1, j] + 1,
d[i, j-1] + 1,
d[i-1, j-1] + 1)
return d[m, n]
Được sử dụng trong
Tôi đã cố gắng để san bằng mã của tôi để mọi thứ đang xảy ra ở một nơi. Hãy cho tôi biết nếu có lỗi chính tả/điểm nhầm lẫn.
sequence_lengths_placeholder = tf.placeholder(tf.int64, shape=(batch_size))
labels_placeholder = tf.placeholder(tf.float32, shape=(batch_size, max_feature_length, label_size))
label_lengths_placeholder = tf.placeholder(tf.int64, shape=(batch_size, max_feature_length))
loss_placeholder = tf.placeholder(tf.float32, shape=(1))
logit_W = tf.Variable(tf.zeros([lstm_units, label_size]))
logit_b = tf.Variable(tf.zeros([label_size]))
length_W = tf.Variable(tf.zeros([lstm_units, max_length]))
length_b = tf.Variable(tf.zeros([max_length]))
lstm = rnn_cell.BasicLSTMCell(lstm_units)
stacked_lstm = rnn_cell.MultiRNNCell([lstm] * layer_count)
rnn_out, state = rnn.rnn(stacked_lstm, features, dtype=tf.float32, sequence_length=sequence_lengths_placeholder)
logits = tf.concat(1, [tf.reshape(tf.matmul(t, logit_W) + logit_b, [batch_size, 1, 2, label_size]) for t in rnn_out])
logit_lengths = tf.concat(1, [tf.reshape(tf.matmul(t, length_W) + length_b, [batch_size, 1, max_length]) for t in rnn_out])
optimizer = tf.train.AdamOptimizer(learning_rate)
global_step = tf.Variable(0, name='global_step', trainable=False)
train_op = optimizer.minimize(loss_placeholder, global_step=global_step)
...
...
# Inside training loop
np_labels, np_logits, sequence_lengths, label_lengths, logit_lengths = sess.run([labels_placeholder, logits, sequence_lengths_placeholder, label_lengths_placeholder, logit_lengths], feed_dict=feed_dict)
loss = loss(np_labels, np_logits, sequence_lengths, label_lengths, logit_lengths)
_ = sess.run([train_op], feed_dict={loss_placeholder: loss})
Vấn đề của tôi
Vấn đề là điều này đang trở lại các lỗi:
File "runner.py", line 63, in <module>
train_op = optimizer.minimize(loss_placeholder, global_step=global_step)
File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/training/optimizer.py", line 188, in minimize
name=name)
File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/training/optimizer.py", line 277, in apply_gradients
(grads_and_vars,))
ValueError: No gradients provided for any variable: <all my variables>
Vì vậy, tôi cho rằng điều này là TensorFlow phàn nàn rằng nó không thể tính toán gradient của sự mất mát của tôi bởi vì sự mất mát được thực hiện bởi numpy, bên ngoài phạm vi của TF.
Vì vậy, tự nhiên để sửa chữa mà tôi sẽ cố gắng và thực hiện điều này trong TensorFlow. Vấn đề là, logit_lengths
và label_lengths
của tôi là cả hai Tensors, vì vậy khi tôi thử và truy cập vào một phần tử duy nhất, tôi đã trả về một Tensor of shape []. Đây là vấn đề khi tôi đang cố gắng sử dụng tf.nn.top_k()
mất Int
cho thông số k
của nó.
Một vấn đề khác là label_lengths
của tôi là Trình giữ chỗ và vì giá trị loss
cần được xác định trước cuộc gọi optimizer.minimize(loss)
, tôi cũng gặp lỗi cho biết giá trị cần được chuyển cho trình giữ chỗ.
Tôi chỉ tự hỏi làm thế nào tôi có thể thử và thực hiện chức năng mất này. Hoặc nếu tôi thiếu điều gì đó hiển nhiên.
Edit: Sau một further reading Tôi thấy rằng thường thiệt hại như một tôi mô tả được sử dụng trong thẩm định và trong việc đào tạo một sự mất mát thay thế giảm thiểu trong cùng một vị trí như sự mất mát thật sự được sử dụng. Có ai biết mất mát thay thế được sử dụng cho một kịch bản dựa trên khoảng cách chỉnh sửa như tôi không?
trong 'np_labels, np_logits, sequence_lengths, label_lengths, logit_lengths = sess.run ([labels_placeholder, logits, sequence_lengths_placeholder, label_lengths_placeholder, logit_lengths], feed_dict = feed_dict) 'gì được bạn' feed_dict'? Bạn không nên có phần giữ chỗ trong danh sách tìm nạp cho session.run. –
@ TheMyth Feed_dict thực sự lưu trữ các giá trị giữ chỗ. Đó chắc chắn là một sự thừa, nhưng tôi nghĩ rằng tôi đã làm điều đó để làm cho mã ngắn gọn hơn cho SO. –