11

मेरा प्रश्न और समस्या कोड के दो ब्लॉक के नीचे बताई गई है।टेंसरफ्लो: इस हानि गणना को प्रदर्शित करना


घटाने समारोह

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] 

में

मैं इतना है कि सब कुछ एक ही स्थान पर हो रहा है मेरी कोड समतल की कोशिश की है के लिए इस्तेमाल किया जा रहा है। अगर भ्रम के टाइप/अंक हैं तो मुझे बताएं।

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> 

तो मैं इस TensorFlow शिकायत कर रहा है कि यह है कि यह की ढ़ाल गणना नहीं कर सकते हैं मान:

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

मेरी समस्या

मुद्दा यह है कि इस त्रुटि लौट रहा है मेरा नुकसान क्योंकि नुकसान टीएफ के दायरे के बाहर, numpy द्वारा किया जाता है।

तो स्वाभाविक रूप से इसे ठीक करने के लिए मैं इसे टेंसरफ्लो में कोशिश और कार्यान्वित करता हूं। मुद्दा यह है कि, मेरे logit_lengths और label_lengths दोनों टेंसर हैं, इसलिए जब मैं एक तत्व को आज़माता हूं और एक्सेस करता हूं, तो मुझे आकार का एक टेंसर लौटाया जाता है []। यह एक मुद्दा है जब मैं tf.nn.top_k() का उपयोग करने का प्रयास कर रहा हूं जो k पैरामीटर के लिए Int लेता है।

उस के साथ

एक और मुद्दा यह मेरी label_lengths एक प्लेसहोल्डर है और के बाद से मेरी loss मूल्य optimizer.minimize(loss) कॉल करने से पहले से परिभाषित करने की जरूरत है, मैं भी एक त्रुटि है कि कहते हैं एक मूल्य प्लेसहोल्डर के लिए पारित किए जाने की आवश्यकता हो रही है।

मैं बस सोच रहा हूं कि मैं इस हानि समारोह को कैसे आजमा सकता हूं और कार्यान्वित कर सकता हूं। या अगर मुझे कुछ याद आ रही है।


संपादित करें: कुछ further reading के बाद मुझे लगता है कि आम तौर पर एक मैं सत्यापन में और एक किराए घटाने कि एक ही स्थान पर कम से कम के रूप में सच नुकसान प्रयोग किया जाता है के प्रशिक्षण में उपयोग किया जाता है का वर्णन की तरह नुकसान। क्या किसी को पता है कि मेरे जैसे संपादन दूरी आधारित परिदृश्य के लिए सरोगेट हानि का उपयोग किस प्रकार किया जाता है?

+0

'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) ' क्या आपके 'feed_dict' है? Session.run के लिए आपके पास फ़ेचर्स सूची में प्लेसहोल्डर नहीं होना चाहिए। –

+0

@TheMyth Feed_dict वास्तव में प्लेसहोल्डर मानों को संग्रहीत करता है। यह निश्चित रूप से एक अनावश्यकता है, लेकिन मुझे लगता है कि मैंने कोड को एसओ के लिए अधिक संक्षिप्त बनाने के लिए किया था। –

उत्तर

1

पहली चीज जो मैं करूँगा वह numpy के बजाय tensorflow का उपयोग करके हानि की गणना करना है। इससे टेन्सफोर्लो आपके लिए ग्रेडियेंट की गणना करने की अनुमति देगा, ताकि आप वापस प्रसारित कर सकें, जिसका अर्थ है कि आप नुकसान को कम कर सकते हैं।

कोर लाइब्रेरी में tf.edit_distance (https://www.tensorflow.org/api_docs/python/tf/edit_distance) फ़ंक्शन है।

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.

क्या आप थोड़ा और विवरण प्रदान कर सकते हैं कि यह एक मुद्दा क्यों है?

संबंधित मुद्दे