2017-01-27 3 views
1

Я работаю над нейронной сетью в Tensorflow с функцией пользовательских потерь, которая основана на метке входного изображения. Я пробовал вектор (из другого набора данных, соответствующего метке), и беру точечный продукт входного изображения (предварительная активация softmax) и дискретизированный вектор. Я также отрицательно проецирую вектор несоответствия, который конфликтует с входной меткой, а также другое встраивание входных изображений случайного обучения, чья метка отличается от текущей метки ввода. Очевидно, все они построены так же одномерные тензоров и пользовательские потери:Как получить доступ к значению метки в Tensorflow во время обучения/оценки?

Loss = max(0, input_embedding * mismatching_sample - input_embedding * matching_sample + 1) \ 
+ max(0, random_embedding * matching_sample - input_embedding * matching_sample + 1) 

Это было в основном для фона, но проблема у меня в том, как получить доступ к значениям меток, соответствующему входным изображениям ? Мне нужно иметь доступ к этим значениям меток, чтобы пробовать правильные векторы и вычислять мою потерю.

Я прочитал в документации, что вы можете использовать .eval(), чтобы получить значение тензора, запустив сеанс, но когда я попробовал это, мой терминал просто повесил ... Технически я уже запускаю сеанс, когда Я тренирую свою нейронную сеть, поэтому не уверен, что есть проблема с запуском второго сеанса внутри другого сеанса и попытки оценить значения, которые являются технически частью другого текущего сеанса. Во всяком случае, я полностью не в курсе, как я могу сделать эту работу. Любая помощь будет принята с благодарностью!

Вот моя оригинальная попытка, которая оказалась проблематичной:

# compute custom loss function using tensors and tensor operations 
def compute_loss(e_list, labels, i): 
    embedding = e_list[i] #getting the current embedding tensor 
    label = labels[i] #getting the matching label tensor, this is value I need. 
    y_index = np.nonzero(label)[0][0] #this always returns 0, doesn't work :(
    target = get_mnist_embedding(y_index) 
    wrong_mnist = get_mismatch_mnist_embedding(y_index) 
    wrong_spec = get_random_spec_embedding(y_index, e_list, labels) 
    # compute the loss: 
    zero = tf.constant(0,dtype="float32") 
    one = tf.constant(1,dtype="float32") 
    mul1 = tf.mul(wrong_mnist,embedding) 
    dot1 = tf.reduce_sum(mul1) 
    mul2 = tf.mul(target,embedding) 
    dot2 = tf.reduce_sum(mul2) 
    mul3 = tf.mul(target,wrong_spec) 
    dot3 = tf.reduce_sum(mul3) 
    max1 = tf.maximum(zero, tf.add_n([dot1, tf.negative(dot2), one])) 
    max2 = tf.maximum(zero, tf.add_n([dot3, tf.negative(dot2), one])) 
    loss = tf.add(max1,max2) 
    return loss 
+0

Возможно, вы повесили, потому что вы не запустили бегунов очереди. MNIST для начинающих показывает пример чтения меток. В основном у вас есть партии с надписью «label» и «image», и вы вытаскиваете их из очереди параллельно. –

+0

Спасибо @Yaroslav. Я использовал бегунов очереди, чтобы вытащить изображения и метки, но проблема заключалась в том, что я пытался оценить значения тензора метки во время выполнения, чтобы затем пробовать необходимые значения для расчета потерь, когда я должен был предварительно вычислить эти значения и передавая их с объектом feed_dict. Добавлено мое исправление ниже в качестве ответа. – kashkar

ответ

0

Этот вопрос я не использую feed_dict пройти в оцифрованных значений. Я пытался определить значение тензора для метки ввода во время вычисления потерь, чтобы сделать , затем пробовать другие значения, необходимые для моей функции потерь.

Я работал вокруг этого вопроса, предварительно рассчитав и организации значения mismatching_sample и matching_sample, например, с помощью tf.placeholder этих значений изначально, и передавая значения с помощью объекта feed_dict словаря, когда я исполняю sess.run([train_op, loss...], feed_dict=feed_dict) для доступа к значениям для моей потери расчет.

Смежные вопросы