mirror of https://github.com/opencv/opencv.git
Open Source Computer Vision Library
https://opencv.org/
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
90 lines
2.5 KiB
90 lines
2.5 KiB
// This file is part of OpenCV project. |
|
// It is subject to the license terms in the LICENSE file found in the top-level directory |
|
// of this distribution and at http://opencv.org/license.html. |
|
|
|
#include "perf_precomp.hpp" |
|
|
|
namespace opencv_test { |
|
|
|
struct LstmParams { |
|
// Batch size |
|
int nrSamples; |
|
|
|
// Size of the input vector |
|
int inputSize; |
|
|
|
// Size of the internal state vector |
|
int hiddenSize; |
|
|
|
// Number of timesteps for the LSTM |
|
int nrSteps; |
|
}; |
|
|
|
static inline void PrintTo(const LstmParams& params, ::std::ostream* os) { |
|
(*os) << "BATCH=" << params.nrSamples |
|
<< ", IN=" << params.inputSize |
|
<< ", HIDDEN=" << params.hiddenSize |
|
<< ", TS=" << params.nrSteps; |
|
} |
|
|
|
static const LstmParams testLstmConfigs[] = { |
|
{1, 192, 192, 100}, |
|
{1, 1024, 192, 100}, |
|
{1, 64, 192, 100}, |
|
{1, 192, 512, 100}, |
|
{64, 192, 192, 2}, |
|
{64, 1024, 192, 2}, |
|
{64, 64, 192, 2}, |
|
{64, 192, 512, 2}, |
|
{128, 192, 192, 2}, |
|
{128, 1024, 192, 2}, |
|
{128, 64, 192, 2}, |
|
{128, 192, 512, 2} |
|
}; |
|
|
|
class Layer_LSTM : public TestBaseWithParam<LstmParams> {}; |
|
|
|
PERF_TEST_P_(Layer_LSTM, lstm) { |
|
const LstmParams& params = GetParam(); |
|
LayerParams lp; |
|
lp.type = "LSTM"; |
|
lp.name = "testLstm"; |
|
lp.set("produce_cell_output", false); |
|
lp.set("use_timestamp_dim", true); |
|
|
|
Mat weightH(params.hiddenSize * 4, params.hiddenSize, CV_32FC1, cv::Scalar(0)); |
|
Mat weightX(params.hiddenSize * 4, params.inputSize, CV_32FC1, cv::Scalar(0)); |
|
Mat bias(params.hiddenSize * 4, 1, CV_32FC1, cv::Scalar(0)); |
|
Mat hInternal(params.nrSteps, params.hiddenSize, CV_32FC1, cv::Scalar(0)); |
|
Mat cInternal(params.nrSteps, params.hiddenSize, CV_32FC1, cv::Scalar(0)); |
|
lp.blobs.push_back(weightH); |
|
lp.blobs.push_back(weightX); |
|
lp.blobs.push_back(bias); |
|
lp.blobs.push_back(hInternal); |
|
lp.blobs.push_back(cInternal); |
|
|
|
std::vector<int> inputDims; |
|
inputDims.push_back(params.nrSamples); |
|
inputDims.push_back(params.nrSteps); |
|
inputDims.push_back(params.inputSize); |
|
Mat input(inputDims.size(), inputDims.data(), CV_32FC1); |
|
input = cv::Scalar(0); |
|
|
|
Net net; |
|
net.addLayerToPrev(lp.name, lp.type, lp); |
|
net.setInput(input); |
|
|
|
// Warm up |
|
std::vector<Mat> outputs(2); |
|
net.forward(outputs, "testLstm"); |
|
|
|
TEST_CYCLE() |
|
{ |
|
net.forward(outputs, "testLstm"); |
|
} |
|
SANITY_CHECK_NOTHING(); |
|
} |
|
|
|
INSTANTIATE_TEST_CASE_P(/**/, Layer_LSTM, testing::ValuesIn(testLstmConfigs)); |
|
|
|
} // namespace
|
|
|