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, benimlogit_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ı
([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. –
@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. –