Проблема не в маскировке, которая работает так, как вы ожидаете. Проблема в том, что вы используете случайные значения в вашем графике, что может показаться немного удивительным. Каждый раз, когда вы звоните eval()
, это действительно вызов run
в сеансе по умолчанию. Проблема в том, как случайные значения работают в TensorFlow. Каждый раз, когда run
вызывается в сеансе, генерируется новое случайное значение. Это означает, что каждый вызов eval
дает результаты, основанные на различных значениях box_confidence
, boxes
и box_class_probs
. Существуют возможные способы исправить это, либо просто не использовать генераторы случайных значений в качестве входных данных, либо оценивать все выходы в одном вызове для run
(а не для eval
). Поскольку вы, похоже, пишете тестовый код, один из простых способов его решения - заменить входные данные константами, созданными из случайных значений NumPy.
import tensorflow as tf
import numpy as np
def yolo_filter_boxes(box_confidence, boxes, box_class_probs, threshold = .6):
# ...
with tf.Session() as test_a:
np.random.seed(1)
box_confidence = tf.constant(np.random.normal(loc=1, scale=4, size=[3, 3, 5, 1]), dtype=tf.float32)
boxes = tf.constant(np.random.normal(loc=1, scale=4, size=[3, 3, 5, 4]), dtype=tf.float32)
box_class_probs = tf.constant(np.random.normal(loc=1, scale=4, size=[3, 3, 5, 80]), dtype=tf.float32
scores, boxes, classes = yolo_filter_boxes(box_confidence, boxes, box_class_probs, threshold = 0.5)
print("scores[2] = " + str(scores[2].eval()))
print("boxes[2] = " + str(boxes[2].eval()))
print("classes[2] = " + str(classes[2].eval()))
print("scores.shape = " + str(scores.shape))
print("boxes.shape = " + str(boxes.shape))
print("classes.shape = " + str(classes.shape))
Или вы все еще можете использовать случайные числа TensorFlow, но использовать переменные для ввода. Разница с переменными заключается в том, что они оценивают свое первоначальное значение только при инициализации, а затем сохраняют свое значение среди сеансов (до тех пор, пока оно не будет изменено снова), поэтому вы не будете генерировать новые случайные значения каждый раз.
import tensorflow as tf
def yolo_filter_boxes(box_confidence, boxes, box_class_probs, threshold = .6):
# ...
with tf.Session() as test_a:
box_confidence = tf.Variable(tf.random_normal([3, 3, 5, 1], mean=1, stddev=4, seed = 1)))
boxes = tf.Variable(tf.random_normal([3, 3, 5, 4], mean=1, stddev=4, seed = 1))
box_class_probs = tf.Variable(tf.random_normal([3, 3, 5, 80], mean=1, stddev=4, seed = 1))
# You must initialize the variables
test_a.run(tf.global_variables_initializer())
scores, boxes, classes = yolo_filter_boxes(box_confidence, boxes, box_class_probs, threshold = 0.5)
print("scores[2] = " + str(scores[2].eval()))
print("boxes[2] = " + str(boxes[2].eval()))
print("classes[2] = " + str(classes[2].eval()))
print("scores.shape = " + str(scores.shape))
print("boxes.shape = " + str(boxes.shape))
print("classes.shape = " + str(classes.shape))