11

bu kayıp hesaplamasını Sahne.TensorFlow: My soru sorun kodunu iki bloktan aşağıda belirtilmiştir


Kayıp Fonksiyonu

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] 

Herşeyin bir yerde oluyor böylece kodumu düzleştirmek denedim

kullanılan olmak. Yazım hataları/karışıklık noktaları varsa bana bildirin.

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> 

Bu yüzden bu TensorFlow bunun geçişlerini hesaplamak olamaz şikayetçi olduğunu varsayalım:

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

Sorunum

mesele bu hatayı dönen olmasıdır Kaybım, kayıp TF'nin kapsamı dışında numpy tarafından yapıldığı için. Bu yüzden doğal

ben denemek ve TensorFlow bu uygulayacağı yönündeki düzeltmek için. Sorun şu ki, benim logit_lengths ve label_lengths her ikisi de Tensörler'dir, bu yüzden tek bir öğeye erişmeyi denediğimde, [Tensor of shape []. Bu, tf.nn.top_k() kullanmaya çalıştığımda,parametresi için Int alan bir sorun. Bununla

diğer konu benim label_lengths bir yer tutucu ve benim loss değeri optimizer.minimize(loss) aramadan önce tanımlanması gerekir, çünkü ben de bir değer tutucu için iletilmesi gereken şeklinde bir hata olsun.

Sadece denemek ve bu kayıp işlevi uygulamak nasıl merak ediyorum. Ya da açık bir şey eksik olursam.


Düzenleme: Anlıyorumfurther reading bazı Sonra ben doğrulamada ve gerçek kayıp kullanıldığı aynı yerde en aza indirir bir vekil kaybını eğitim kullanılmaktadır açıkladığınız gibi genellikle kayıplar. Benim gibi bir düzenleme mesafesine dayalı senaryoya göre ne tür kayıp kayıplarının kullanıldığını bilen var mı? Ben yapacağını

+0

([labels_placeholder, logits, sequence_lengths_placeholder, label_lengths_placeholder, logit_lengths], feed_dict = feed_dict) ' senin 'ne feed_dict' edilir? Session.run için getirilenler listesinde yer tutucuları olmamalıdır. –

+0

@TheMyth Feed_dict aslında yer tutucu değerlerini saklar. Bu kesinlikle bir fazlalık, ama sanırım kodu SO için daha özlü yapmak için yaptım. –

cevap

1

ilk şey Numpy yerine tensorflow kullanarak kaybını hesaplamak etmektir. Bu, tensorflow'un sizin için gradyanları hesaplamasına izin verir, böylece geri yayılım gerçekleştirebilirsiniz, yani kaybı en aza indirgeyebilirsiniz. tf.edit_distance çekirdek kitaplığında (https://www.tensorflow.org/api_docs/python/tf/edit_distance) işlevi vardır

.

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.

Neden sorun olduğuna dair biraz daha fazla bilgi verebilir misiniz? `Np_labels, np_logits, sequence_lengths, label_lengths, logit_lengths = sess.run olarak