Я работаю над нейронной сетью в 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
Возможно, вы повесили, потому что вы не запустили бегунов очереди. MNIST для начинающих показывает пример чтения меток. В основном у вас есть партии с надписью «label» и «image», и вы вытаскиваете их из очереди параллельно. –
Спасибо @Yaroslav. Я использовал бегунов очереди, чтобы вытащить изображения и метки, но проблема заключалась в том, что я пытался оценить значения тензора метки во время выполнения, чтобы затем пробовать необходимые значения для расчета потерь, когда я должен был предварительно вычислить эти значения и передавая их с объектом feed_dict. Добавлено мое исправление ниже в качестве ответа. – kashkar