11

私の質問と問題は、2つのコードブロックの下に記載されています。 TensorFlow:この損失計算を実行する

に使用されて


損失関数

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] 

私はすべて1つの場所で起こっているように私のコードを平らにしようとしました。ミスの誤植がある場合は教えてください。

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で実行されるため、TFの範囲外です。

自然に私がTensorFlowでこれを試して実装することを修正します。問題は、私のlogit_lengthslabel_lengthsはどちらもテンソルなので、1つの要素にアクセスしようとすると、テンソルの形状[]が返されます。これは、私がパラメータのためにIntを取るtf.nn.top_k()を使用しようとするときの問題です。それと

もう一つの問題は、私のlabel_lengthsはプレースホルダで、私のloss値がoptimizer.minimize(loss)呼び出しの前に定義する必要があるため、私はまた、値がプレースホルダのために渡す必要があるというエラーメッセージが出ています。

私はこの損失機能をどのように試して実装することができるのだろうかと思っています。または、私が何かを明らかにしていない場合。


編集:一部further reading後、私は私が説明するような通常の損失は、検証で、真の損失が使用されているのと同じ場所に最小限代理損失の訓練に使用されていることがわかります。誰かが私のような編集距離ベースのシナリオに代理損失がどのように使われているか知っていますか?

+0

'あなた '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.

なぜそれが問題なのか少し詳しくお聞かせください。

`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)で
関連する問題