Почему я получаю неправильный результат в TensorFlowInferenceInterface в этой демонстрации?

Вот программа, которая делает буфер протокола.

# -*- coding:utf-8 -*-
import tensorflow as tf

session = tf.Session()

matrix1 = tf.constant([[1., 3.]], name='input1')
matrix2 = tf.constant([[2., 2.]], name='input2')
mat_add = tf.add(matrix1, matrix2, name='output1')
mat_sub = tf.subtract(matrix1, matrix2, name='output2')

session.run(mat_add)
session.run(mat_sub)


tf.train.write_graph(session.graph.as_graph_def(), "./models/", "simple.pb", as_text=False)

session.close()

А вот основная часть java-кода, которая взаимодействует с TensorFlowInferenceInterface.

inferenceInterface = new TensorFlowInferenceInterface(getAssets(),MODEL_FILE);

input1[0] = (float) 5.0; input1[1] = (float) 6.0;
input2[0] = (float) 2.0; input2[1] = (float) 3.0;


inferenceInterface.feed("input1", input1, new long[]{1,2});
inferenceInterface.feed("input2", input2, new long[]{1,2});

inferenceInterface.run(new String[]{"output1","output2"});

inferenceInterface.fetch("output1", output1);
inferenceInterface.fetch("output2", output2);


for(float f : output1)
    Log.i(TAG, "output1: " + f);
for(float f : output2)
    Log.i(TAG, "output2: " + f);

А это результат

Результат сложения всегда будет правильным, но результат вычитания всегда будет [1.0,1.0], и поэтому я не могу понять, операции сложения и вычитания почти одинаковы, в то время как вычитание всегда неверно и является фиксированное значение. Любые мнения будут полезны! Скажите, пожалуйста, причину. Заранее спасибо!

Какую версию TensorFlow вы используете? Кажется, я не могу воспроизвести вашу проблему в более новых версиях, таких как 1.4, 1.5 или 1.6. Помогает ли использование более новой версии? Кроме того, при этом ваш график определяется с входными данными как константами, что означает, что может возникнуть оптимизация графа (например, сворачивание констант). Если вы действительно хотите «скармливать» входы, то определите их с помощью tf.placeholder вместо tf.constant на вашем графике, чтобы посмотреть, поможет ли это. Надеюсь, это поможет.

ash 11.03.2018 01:35

Большое спасибо! Я использую Tensorflow 1.2, и результаты становятся правильными, когда я использую tf.placeholder вместо tf.constant. Еще раз спасибо за помощь!

jason 11.03.2018 05:43
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
2
113
1

Ответы 1

Спасибо, Эш! Проблема решена изменением кода

matrix1 = tf.constant([[1., 3.]], name='input1')
matrix2 = tf.constant([[2., 2.]], name='input2')

к

matrix1 = tf.placeholder(dtype=tf.float32, shape=(1,2), name='input1')
matrix2 = tf.placeholder(dtype=tf.float32, shape=(1,2), name='input2')

Другие вопросы по теме