11

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_lengthslabel_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?

+0

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. –

+0

@ 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. –

Trả lời

1

Điều đầu tiên tôi phải làm là tính toán tổn thất bằng cách sử dụng lưu lượng thay vì lưu lượng. Điều đó sẽ cho phép tensorflow tính toán gradient cho bạn, vì vậy bạn sẽ có thể truyền lại, nghĩa là bạn có thể giảm thiểu sự mất mát.

Có chức năng tf.edit_distance (https://www.tensorflow.org/api_docs/python/tf/edit_distance) trong thư viện lõi.

So naturally to fix that I would try and implement this in TensorFlow. The issue is, my logit_lengths and label_lengths are both Tensors, so when I try and access a single element, I'm returned a Tensor of shape []. This is an issue when I'm trying to use tf.nn.top_k() which takes an Int for its k parameter.

Bạn có thể cung cấp thêm một chút chi tiết tại sao đó là sự cố không?

Các vấn đề liên quan