CTC梁搜索和TensorFlow C API的问题
Issue with CTC Beam Search and Tensorflow C++ API
我已经冻结了一个tensorflow模型,该模型具有最后一个节点的CTC梁搜索。使用Pyhton API可以解释输出张量并转换为标签的最终序列。由于我想在C 中使用此冷冻模型,因此我想如何使用C API来处理此输出张量并获得标签的最终顺序。使用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
我得到的是一个9x2张量的输出张量:
[[0, 0],
[0, 1],
[0, 2],
[0, 3],
[0, 4],
[0, 5],
[0, 6],
[0, 7],
[0, 8]]
其中9是最终字符串的实际长度。在这里,我无法获取正确的信息,例如在python中,用于隔离最终字符串。
您解决了问题吗?我为您的参考提供解决方案
在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 _ to tf.nn.ctc_beam_search_decoder的sequence_length
相关文章:
- Tensorflow c++ api undefined reference to 'tflite::D efaultErrorReporter()'
- 分段错误(核心转储) - 使用 SavedModel 的 Tensorflow C++ API 进行推断
- TensorFlow c++ API 在 session->run() 上崩溃
- tensorflow and tflearn c++ API
- Tensorflow C++ API 和 Caffe 兼容性问题与 Glog 相关
- 无法在 Windows 10/Visual C++ 2017 上使用 tensorflow C++ API tensor
- Tensorflow C++ API assign variable value
- 是否可以在QT项目中使用Tensorflow C++ API?
- 使用 Bazel (Windows) 构建 Tensorflow 的问题 => 使用 Tensorflow C++ API
- Tensorflow C++ 用于动态输入形状的 API
- 无法在窗口中构建 Tensorflow C++ API
- C++ Tensorflow API with TensorRT
- 在Android Studio项目中使用tensorflow lite C++API的问题
- Tensorflow C++ API:如何使用Dimesion=3迭代张量
- TensorFlow C API:``fetch_outputs`和run_outputs''session ::
- 如何在TensorFlow C API(例如Python)中设置轴
- 如何使用C API限制Tensorflow(R1.1)中的GPU使用率
- Tensorflow c++ API 失败设置 gpu/cpu 编号:SetDefaultDevice 错误:具有相同优
- Tensorflow C++ API 示例行尾
- 直接在Android NDK端使用tensorflow(不使用JAVA api)