Тензор потока с ++ пакетного вывода - PullRequest
0 голосов
/ 08 мая 2018

У меня проблема с выводом на пакетный размер больше 1 с использованием API тензорного потока c ++.Сетевые входные плоскости имеют размер 8x8x13, а выходной сигнал является одним плавающим.Когда я пытаюсь сделать вывод о нескольких выборках следующим образом, результат верен только для первой выборки.Я использовал инструмент keras2tensorflow для конвертации графика в формат .pb.

node {
  name: "main_input"
  op: "Placeholder"
  attr {
    key: "dtype"
    value {
      type: DT_FLOAT
    }
  }
  attr {
    key: "shape"
    value {
      shape {
        dim {
          size: -1
        }
        dim {
          size: 8
        }
        dim {
          size: 8
        }
        dim {
          size: 12
        }
      }
    }
  }
}

Редактировать: Выходной узел - скаляр.Может ли виновником быть код keras2tensorflow, который я использовал для преобразования файла keras hdf5 в pb?Возможно, выход должен был быть -1x1, чтобы принять любое количество выборок, как входные плоскости).Я получил код конвертера по следующей ссылке: keras_to_tensorflow

node {
  name: "value_0"
  op: "Identity"
  input: "strided_slice"
  attr { 
    key: "T"
    value {
      type: DT_FLOAT
    }
  }
}

Размер плоскости ввода правильно установлен на -1 x 8 x 8 x 13.

void test() {

    //input planes
    const int nmoves = pstack->count; //This is the number of samples
    TensorShape input_shape({nmoves, 8, 8, CHANNELS});
    Tensor inputs(DT_FLOAT, input_shape);

    //.... Initialize input planes

    //output
    std::vector<Tensor> outputs;

    //run session
    TF_CHECK_OK( session->Run(
        {{input_layer, inputs}}, {output_layer}, {}, &outputs) 
    );

    //get results
    auto outd = outputs[0].flat<float>().data(); //is this correct way to access the data for multiple samples ?
    for(int i = 0;i < nmoves; i++) {
        float p = outd[i];    //The value of p is wrong for all but the first one
        std::cout << "I" << i << " == " << p << std::endl;
    }
}

Пример выходных данных (p) для каждой выборки, где результат должен быть между 0 и 1, показан ниже.Только I0 является правильным, в то время как I16 и I18 имеют очень большие значения. Я думаю, что проблема в том, что после запуска сеанса размер выходных данных все еще равен 1, должен был быть 20. Можно ли вообще сделать вывод для нескольких выборок, используя API c ++?

I0 == 0.434162
I1 == 0
I2 == 0
I3 == 0.0640963
I4 == 0.0718748
I5 == 0.325485
I6 == 0
I7 == 0
I8 == 0
I9 == 0
I10 == 0.141193
I11 == 0.398055
I12 == 0.237758
I13 == 0.530693
I14 == 2.44527e-42
I15 == 0
I16 == -5.62959e+14
I17 == 4.56697e-41
I18 == -5.62959e+14
I19 == 4.56697e-41

1 Ответ

0 голосов
/ 29 июня 2019

Проблема оказалась из-за ошибки в keras_to_tensorflow, которую я использовал для конвертации. Я сообщил о проблеме здесь . Ошибка все еще есть в keras_to_tensorflow

В строке 68:

pred[i] = tf.identity(net_model.output[i], name=pred_node_names[i])

«Выход» должен был быть «выходом»

pred[i] = tf.identity(net_model.outputs[i], name=pred_node_names[i])
...