Tensorflow: Как передать Tensor в обученную нейронную сеть?

1

Я не могу заставить свою обученную нейронную сеть работать. Я хочу передать массив 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)

Это Топология

Как я могу получить эти прогнозы/как я могу подать изображение в сеть?

Теги:
tensorflow
machine-learning
neural-network

2 ответа

0
Лучший ответ

Вы могли бы дать имя своему входному слою, получить его по имени, как вы это делаете для тензора 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 не находятся в главном графике.

  • 0
    Поскольку ваша модель ожидает пакеты разных размеров, при подаче одного изображения она выдает ошибку. Простой обходной путь - добавить измерение к вашему изображению. Попробуйте: image_data = np.expand_dims (image_data, 0)
  • 0
    это, большое спасибо. Значения не являются удовлетворительными, но это еще одна проблема. +1
0

image_data ожидается тензор. Вы можете прочитать jpeg-изображение в виде тензора, используя ниже сниппет (image_file - это местоположение файла jpeg)

# decode the JPEG image as tensor
image_data = tf.cast(tf.image.decode_jpeg(image_file), tf.float32)
  • 0
    Большое спасибо за ваше предложение, но если я сделаю это, я получу эту ошибку: TypeError: Значение канала не может быть объектом tf.Tensor. Приемлемые значения подачи включают скаляры Python, строки, списки, numy ndarrays или TensorHandles. Для справки, тензорным объектом был Tensor ("Cast: 0", shape = (?,?,?), Dtype = float32), который был передан в подача с ключом input_layer: 0.
  • 0
    image_data не должен быть тензором вообще. Если вы хотите использовать decode_jpeg, вы должны сначала вычислить тензор, который он возвращает, а затем передать значение input_layer.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню