Я не могу заставить свою обученную нейронную сеть работать. Я хочу передать массив numpy (по существу изображение) в мою обученную сеть.
with tf.Session() as sess:
# Unpersists graph from file
with tf.gfile.FastGFile(graph_path, 'rb') as f:
graph_def = tf.GraphDef()
graph_def.ParseFromString(f.read())
_ = tf.import_graph_def(graph_def, name='')
softmax_tensor = sess.graph.get_tensor_by_name('y_pred:0')
predictions = sess.run(softmax_tensor,
{'DecodeJpeg/contents:0': image_data})
Я всегда получаю эту ошибку:
TypeError: не может интерпретировать ключ feed_dict как тензор: имя "DecodeJpeg/contents: 0" относится к тензору, который не существует. Операция "DecodeJpeg/contents" не существует на графике.
Я пробовал много разных ключей для этого фид-дикта, но я не могу понять это правильно. Я тренировал сеть с помощью набора данных-api, это означает, что у меня нет tf.placeholder, который я могу заполнить. Вместо этого сеть проходит через итератор через набор данных, содержащий тензорные объекты. Файл tfrecord был создан с использованием этого скрипта из Google
Начало моей модели:
input_layer = tf.reshape(features["image"], [-1, _DEFAULT_IMAGE_SIZE, _DEFAULT_IMAGE_SIZE, 3])
Выдержка из конца:
predictions = {
# Generate predictions (for PREDICT and EVAL mode)
"classes": tf.argmax(input=logits, axis=1),
# Add 'softmax_tensor' to the graph. It is used for PREDICT and by the
# 'logging_hook'.
"probabilities": tf.nn.softmax(logits, name="y_pred")
}
if mode == tf.estimator.ModeKeys.PREDICT:
return tf.estimator.EstimatorSpec(mode=mode, predictions=predictions)
# Calculate Loss (for both TRAIN and EVAL modes)
onehot_labels = tf.one_hot(indices=tf.cast(labels, tf.int32), depth=2)
loss = tf.losses.softmax_cross_entropy(onehot_labels=onehot_labels, logits=logits)
Это Топология
Как я могу получить эти прогнозы/как я могу подать изображение в сеть?
Вы могли бы дать имя своему входному слою, получить его по имени, как вы это делаете для тензора softmax, а затем подать его в массив numpy. Вот как это выглядит:
# First, name your input tensor
input_layer = tf.reshape(features["image"], [-1, _DEFAULT_IMAGE_SIZE, _DEFAULT_IMAGE_SIZE, 3], name='input_layer')
...
predictions = sess.run('y_pred:0',
{'input_layer:0': image_data})
Это должно работать до тех пор, пока форма image_data будет [1, _DEFAULT_IMAGE_SIZE, _DEFAULT_IMAGE_SIZE, 3]
Объяснение того, почему вы не можете получить доступ к тензорам DecodedJpeg по имени, состоит в том, что операторы tf.Dataset не находятся в главном графике.
image_data
ожидается тензор. Вы можете прочитать jpeg-изображение в виде тензора, используя ниже сниппет (image_file
- это местоположение файла jpeg)
# decode the JPEG image as tensor
image_data = tf.cast(tf.image.decode_jpeg(image_file), tf.float32)