Проблема с CTC Beam Search и Tensorflow C ++ API

Я заморозил модель тензорного потока, которая в качестве последнего узла выполняет поиск луча ctc. С помощью API Pyhton можно интерпретировать выходной тензор и преобразовать его в конечную последовательность меток. Поскольку я хочу использовать эту замороженную модель в C ++, мне интересно, как использовать API C ++ для обработки этого выходного тензора и получения окончательной последовательности меток. Используя python API, я называю эту функцию sparse_tensor_to_str, передавая тензор, который я получаю после запуска сессии. В моем случае конечная последовательность меток представляет собой строку символов.

    def sparse_tensor_to_str(self, spares_tensor: tf.SparseTensor):
""":param spares_tensor:
:return: a str
"""indices = spares_tensor.indices
values = spares_tensor.values
values = np.array([self.__ord_map[str(tmp)] for tmp in values])
dense_shape = spares_tensor.dense_shape

number_lists = np.ones(dense_shape, dtype=values.dtype)
str_lists = []
res = []
for i, index in enumerate(indices):
number_lists[index[0], index[1]] = values[i]
for number_list in number_lists:
str_lists.append([self.int_to_char(val) for val in number_list])
for str_list in str_lists:
res.append(''.join(c for c in str_list if c != '*'))
return res

В C ++ мне нравится следующее:

string input_layer = "input:0";
string output_layer = "CTCBeamSearchDecoder:0";
std::vector<Tensor> inputs;

Status read_tensor_status = ReadTensorFromMat(candidate_plates_mat[i],input_height,input_width,input_mean,input_std, &inputs);
if (!read_tensor_status.ok()) {
LOG(ERROR) << read_tensor_status;
return;
}

Tensor& resized_input_tensor = inputs[0];
std::vector<Tensor> outputs;
Status run_status = session->Run({{input_layer, resized_input_tensor}},{output_layer}, {}, &outputs);
if (!run_status.ok()) {
LOG(ERROR) << "Running model failed: " << run_status;
return;
}
std::cout<< outputs[0].tensor<tensorflow::int64, 2>() << std::endl

Я получаю выходной тензор, который является тензор 9×2, как это:

[[0, 0],
[0, 1],
[0, 2],
[0, 3],
[0, 4],
[0, 5],
[0, 6],
[0, 7],
[0, 8]]

где 9 — фактическая длина последней строки. Здесь я не способен получить правильную информацию, как в python, для эстраполяции финальной строки.

0

Решение

ты решил проблему?
я предоставляю свое решение для вашей справки

в Python ваш код должен выглядеть так

# remember to set seq_len to fit for your case
decoded, log_prob = tf.nn.ctc_beam_search_decoder(y, seq_len)
dense_decoded = tf.sparse_tensor_to_dense(decoded[0], default_value=-1)

в cpp ваш код должен выглядеть так

// you need to modify "outputName" if your model have prefix variable scope name
// SparseToDense is the name of tf.sparse_tensor_to_dense function
std::string outputName = "SparseToDense:0";
outputLayerNames_ = {outputName};std::vector<std::pair<std::string, tensorflow::Tensor>> inputDict_ = { std::make_pair(DefaultInputLayerName_, inputImageTensor_),
std::make_pair(DefaultTrainFlagName_, trainFlagTensor_),
std::make_pair(DefaultSeqLenName_, inputSeqLenTensor_)};
std::vector<tensorflow::Tensor> outputs_;
sess_->Run(inputDict_, outputLayerNames_, {}, &outputs_);
std::cout<< outputs_[0].tensor<tensorflow::int64, 2>() << std::endl;

Помните, что вы должны установить inputSeqLenTensor_ для sequence_length tf.nn.ctc_beam_search_decoder, иначе вы ничего не получите

0

Другие решения

Других решений пока нет …