У меня есть проблема с выводом на размер пакета больше 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? Возможно, выходной сигнал должен был быть -1×1, чтобы принять любое количество выборок, таких как входные плоскости). Я получил код конвертера по следующей ссылке: 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
Задача ещё не решена.
Других решений пока нет …