15 #include <boost/numeric/conversion/cast.hpp> 25 template<
typename T,
typename TParseElementFunc>
26 std::vector<T> ParseArrayImpl(std::istream& stream, TParseElementFunc parseElementFunc,
const char * chars =
"\t ,:")
28 std::vector<T> result;
31 while (std::getline(stream, line))
33 std::vector<std::string> tokens;
37 boost::split(tokens, line, boost::algorithm::is_any_of(chars), boost::token_compress_on);
39 catch (
const std::exception& e)
41 ARMNN_LOG(error) <<
"An error occurred when splitting tokens: " << e.what();
44 for (
const std::string& token : tokens)
50 result.push_back(parseElementFunc(token));
52 catch (
const std::exception&)
54 ARMNN_LOG(error) <<
"'" << token <<
"' is not a valid number. It has been ignored.";
63 template<armnn::DataType NonQuantizedType>
64 auto ParseDataArray(std::istream & stream);
66 template<armnn::DataType QuantizedType>
67 auto ParseDataArray(std::istream& stream,
68 const float& quantizationScale,
69 const int32_t& quantizationOffset);
74 inline auto ParseDataArray<armnn::DataType::Float32>(std::istream & stream)
76 return ParseArrayImpl<float>(stream, [](
const std::string& s) {
return std::stof(s); });
80 inline auto ParseDataArray<armnn::DataType::Signed32>(std::istream & stream)
82 return ParseArrayImpl<int>(stream, [](
const std::string & s) {
return std::stoi(s); });
86 inline auto ParseDataArray<armnn::DataType::QAsymmU8>(std::istream& stream,
87 const float& quantizationScale,
88 const int32_t& quantizationOffset)
90 return ParseArrayImpl<uint8_t>(stream,
91 [&quantizationScale, &quantizationOffset](
const std::string & s)
93 return boost::numeric_cast<uint8_t>(
94 armnn::Quantize<u_int8_t>(std::stof(s),
100 struct DeepSpeechV1TestCaseData
102 DeepSpeechV1TestCaseData(
103 const LstmInput& inputData,
104 const LstmInput& expectedOutputData)
105 : m_InputData(inputData)
106 , m_ExpectedOutputData(expectedOutputData)
109 LstmInput m_InputData;
110 LstmInput m_ExpectedOutputData;
113 class DeepSpeechV1Database
116 explicit DeepSpeechV1Database(
const std::string& inputSeqDir,
const std::string& prevStateHDir,
117 const std::string& prevStateCDir,
const std::string& logitsDir,
118 const std::string& newStateHDir,
const std::string& newStateCDir);
120 std::unique_ptr<DeepSpeechV1TestCaseData> GetTestCaseData(
unsigned int testCaseId);
123 std::string m_InputSeqDir;
124 std::string m_PrevStateHDir;
125 std::string m_PrevStateCDir;
126 std::string m_LogitsDir;
127 std::string m_NewStateHDir;
128 std::string m_NewStateCDir;
131 DeepSpeechV1Database::DeepSpeechV1Database(
const std::string& inputSeqDir,
const std::string& prevStateHDir,
132 const std::string& prevStateCDir,
const std::string& logitsDir,
133 const std::string& newStateHDir,
const std::string& newStateCDir)
134 : m_InputSeqDir(inputSeqDir)
135 , m_PrevStateHDir(prevStateHDir)
136 , m_PrevStateCDir(prevStateCDir)
137 , m_LogitsDir(logitsDir)
138 , m_NewStateHDir(newStateHDir)
139 , m_NewStateCDir(newStateCDir)
142 std::unique_ptr<DeepSpeechV1TestCaseData> DeepSpeechV1Database::GetTestCaseData(
unsigned int testCaseId)
145 const std::string inputSeqPath = m_InputSeqDir +
"input_node_0_flat.txt";
146 const std::string prevStateCPath = m_PrevStateCDir +
"previous_state_c_0.txt";
147 const std::string prevStateHPath = m_PrevStateHDir +
"previous_state_h_0.txt";
149 std::vector<float> inputSeqData;
150 std::vector<float> prevStateCData;
151 std::vector<float> prevStateHData;
153 std::ifstream inputSeqFile(inputSeqPath);
154 std::ifstream prevStateCTensorFile(prevStateCPath);
155 std::ifstream prevStateHTensorFile(prevStateHPath);
159 inputSeqData = ParseDataArray<armnn::DataType::Float32>(inputSeqFile);
160 prevStateCData = ParseDataArray<armnn::DataType::Float32>(prevStateCTensorFile);
161 prevStateHData = ParseDataArray<armnn::DataType::Float32>(prevStateHTensorFile);
165 ARMNN_LOG(fatal) <<
"Failed to load image for test case " << testCaseId <<
". Error: " << e.
what();
170 const std::string logitsPath = m_LogitsDir +
"logits.txt";
171 const std::string newStateCPath = m_NewStateCDir +
"new_state_c.txt";
172 const std::string newStateHPath = m_NewStateHDir +
"new_state_h.txt";
174 std::vector<float> logitsData;
175 std::vector<float> expectedNewStateCData;
176 std::vector<float> expectedNewStateHData;
178 std::ifstream logitsTensorFile(logitsPath);
179 std::ifstream newStateCTensorFile(newStateCPath);
180 std::ifstream newStateHTensorFile(newStateHPath);
184 logitsData = ParseDataArray<armnn::DataType::Float32>(logitsTensorFile);
185 expectedNewStateCData = ParseDataArray<armnn::DataType::Float32>(newStateCTensorFile);
186 expectedNewStateHData = ParseDataArray<armnn::DataType::Float32>(newStateHTensorFile);
190 ARMNN_LOG(fatal) <<
"Failed to load image for test case " << testCaseId <<
". Error: " << e.
what();
195 LstmInput inputDataSingleTest(inputSeqData, prevStateHData, prevStateCData);
197 LstmInput expectedOutputsSingleTest(logitsData, expectedNewStateHData, expectedNewStateCData);
199 return std::make_unique<DeepSpeechV1TestCaseData>(inputDataSingleTest, expectedOutputsSingleTest);
#define ARMNN_LOG(severity)
virtual const char * what() const noexcept override