#include
#include "caffe/blob.hpp"
#include "caffe/common.hpp"
#include "caffe/filler.hpp"
#include "caffe/layers/conv_layer.hpp"
#include
extern "C" {
#include "testbed.h"
}
#define TYPED_TEST(a,b) template void a :: b (void)
#define EXPECT_NEAR(a,b,c) {}
#define EXPECT_EQ(a,b) {}
namespace caffe {
template
struct CPUDevice {
typedef TypeParam Dtype;
static const Caffe::Brew device = Caffe::CPU;
};
template
class ConvolutionLayerTest {
typedef typename TypeParam::Dtype Dtype;
public:
void TestSimpleConvolution(void);
void TestDilatedConvolution(void);
void Test0DConvolution(void);
void TestSimple3DConvolution(void);
void TestDilated3DConvolution(void);
void Test1x1Convolution(void);
void TestSimpleConvolutionGroup(void);
void TestNDAgainst2D(void);
void RunConvolution(void);
ConvolutionLayerTest()
: blob_bottom_(new Blob(2, 3, 6, 4)),
blob_bottom_2_(new Blob(2, 3, 6, 4)),
blob_top_(new Blob()),
blob_top_2_(new Blob()) {}
virtual void SetUp() {
// fill the values
FillerParameter filler_param;
filler_param.set_value(1.);
GaussianFiller filler(filler_param);
filler.Fill(this->blob_bottom_);
filler.Fill(this->blob_bottom_2_);
blob_bottom_vec_.push_back(blob_bottom_);
blob_top_vec_.push_back(blob_top_);
}
virtual ~ConvolutionLayerTest() {
delete blob_bottom_;
delete blob_bottom_2_;
delete blob_top_;
delete blob_top_2_;
}
virtual Blob* MakeReferenceTop(Blob* top) {
this->ref_blob_top_.reset(new Blob());
this->ref_blob_top_->ReshapeLike(*top);
return this->ref_blob_top_.get();
}
Blob* const blob_bottom_;
Blob* const blob_bottom_2_;
Blob* const blob_top_;
Blob* const blob_top_2_;
shared_ptr > ref_blob_top_;
vector*> blob_bottom_vec_;
vector*> blob_top_vec_;
shared_ptr > layer;
};
TYPED_TEST(ConvolutionLayerTest, RunConvolution) {
layer->Forward(this->blob_bottom_vec_, this->blob_top_vec_);
}
TYPED_TEST(ConvolutionLayerTest, TestSimpleConvolution) {
typedef typename TypeParam::Dtype Dtype;
this->blob_bottom_vec_.push_back(this->blob_bottom_2_);
this->blob_top_vec_.push_back(this->blob_top_2_);
LayerParameter layer_param;
ConvolutionParameter* convolution_param =
layer_param.mutable_convolution_param();
convolution_param->add_kernel_size(3);
convolution_param->add_stride(2);
convolution_param->set_num_output(4);
convolution_param->mutable_weight_filler()->set_type("gaussian");
convolution_param->mutable_bias_filler()->set_type("constant");
convolution_param->mutable_bias_filler()->set_value(0.1);
layer=shared_ptr > (new ConvolutionLayer(layer_param));
layer->SetUp(this->blob_bottom_vec_, this->blob_top_vec_);
}
TYPED_TEST(ConvolutionLayerTest, TestDilatedConvolution) {
typedef typename TypeParam::Dtype Dtype;
vector bottom_shape;
bottom_shape.push_back(2);
bottom_shape.push_back(3);
bottom_shape.push_back(8);
bottom_shape.push_back(7);
this->blob_bottom_vec_.push_back(this->blob_bottom_2_);
this->blob_top_vec_.push_back(this->blob_top_2_);
for (int i = 0; i < this->blob_bottom_vec_.size(); ++i) {
this->blob_bottom_vec_[i]->Reshape(bottom_shape);
}
LayerParameter layer_param;
ConvolutionParameter* convolution_param =
layer_param.mutable_convolution_param();
convolution_param->add_kernel_size(3);
convolution_param->add_dilation(2);
convolution_param->set_num_output(4);
convolution_param->mutable_weight_filler()->set_type("gaussian");
convolution_param->mutable_bias_filler()->set_type("constant");
convolution_param->mutable_bias_filler()->set_value(0.1);
layer=shared_ptr > (new ConvolutionLayer(layer_param));
layer->SetUp(this->blob_bottom_vec_, this->blob_top_vec_);
}
TYPED_TEST(ConvolutionLayerTest, Test0DConvolution) {
typedef typename TypeParam::Dtype Dtype;
LayerParameter layer_param;
ConvolutionParameter* convolution_param =
layer_param.mutable_convolution_param();
const int kNumOutput = 3;
convolution_param->set_num_output(kNumOutput);
convolution_param->set_axis(3);
convolution_param->mutable_weight_filler()->set_type("gaussian");
convolution_param->mutable_bias_filler()->set_type("gaussian");
layer=shared_ptr > (
new ConvolutionLayer(layer_param));
vector top_shape = this->blob_bottom_->shape();
top_shape[3] = kNumOutput;
layer->SetUp(this->blob_bottom_vec_, this->blob_top_vec_);
EXPECT_EQ(top_shape, this->blob_top_->shape());
}
TYPED_TEST(ConvolutionLayerTest, TestSimple3DConvolution) {
typedef typename TypeParam::Dtype Dtype;
this->blob_bottom_vec_.push_back(this->blob_bottom_2_);
this->blob_top_vec_.push_back(this->blob_top_2_);
vector bottom_shape(5);
bottom_shape[0] = this->blob_bottom_vec_[0]->shape(0);
bottom_shape[1] = this->blob_bottom_vec_[0]->shape(1);
bottom_shape[2] = 5;
bottom_shape[3] = this->blob_bottom_vec_[0]->shape(2);
bottom_shape[4] = this->blob_bottom_vec_[0]->shape(3);
FillerParameter filler_param;
GaussianFiller filler(filler_param);
for (int i = 0; i < this->blob_bottom_vec_.size(); ++i) {
this->blob_bottom_vec_[i]->Reshape(bottom_shape);
filler.Fill(this->blob_bottom_vec_[i]);
}
LayerParameter layer_param;
ConvolutionParameter* convolution_param =
layer_param.mutable_convolution_param();
convolution_param->add_kernel_size(3);
convolution_param->add_stride(2);
convolution_param->set_num_output(4);
convolution_param->mutable_weight_filler()->set_type("gaussian");
convolution_param->mutable_bias_filler()->set_type("gaussian");
layer=shared_ptr > (
new ConvolutionLayer(layer_param));
layer->SetUp(this->blob_bottom_vec_, this->blob_top_vec_);
}
TYPED_TEST(ConvolutionLayerTest, TestDilated3DConvolution) {
typedef typename TypeParam::Dtype Dtype;
this->blob_bottom_vec_.push_back(this->blob_bottom_2_);
this->blob_top_vec_.push_back(this->blob_top_2_);
vector bottom_shape(5);
bottom_shape[0] = this->blob_bottom_vec_[0]->shape(0);
bottom_shape[1] = this->blob_bottom_vec_[0]->shape(1);
bottom_shape[2] = 6;
bottom_shape[3] = 7;
bottom_shape[4] = 8;
FillerParameter filler_param;
GaussianFiller filler(filler_param);
for (int i = 0; i < this->blob_bottom_vec_.size(); ++i) {
this->blob_bottom_vec_[i]->Reshape(bottom_shape);
filler.Fill(this->blob_bottom_vec_[i]);
}
LayerParameter layer_param;
ConvolutionParameter* convolution_param =
layer_param.mutable_convolution_param();
convolution_param->add_kernel_size(3);
convolution_param->add_dilation(2);
convolution_param->set_num_output(4);
convolution_param->mutable_weight_filler()->set_type("gaussian");
convolution_param->mutable_bias_filler()->set_type("gaussian");
layer=shared_ptr > (
new ConvolutionLayer(layer_param));
layer->SetUp(this->blob_bottom_vec_, this->blob_top_vec_);
}
TYPED_TEST(ConvolutionLayerTest, Test1x1Convolution) {
typedef typename TypeParam::Dtype Dtype;
LayerParameter layer_param;
ConvolutionParameter* convolution_param =
layer_param.mutable_convolution_param();
convolution_param->add_kernel_size(1);
convolution_param->add_stride(1);
convolution_param->set_num_output(4);
convolution_param->mutable_weight_filler()->set_type("gaussian");
convolution_param->mutable_bias_filler()->set_type("constant");
convolution_param->mutable_bias_filler()->set_value(0.1);
layer=shared_ptr > (
new ConvolutionLayer(layer_param));
layer->SetUp(this->blob_bottom_vec_, this->blob_top_vec_);
}
TYPED_TEST(ConvolutionLayerTest, TestSimpleConvolutionGroup) {
typedef typename TypeParam::Dtype Dtype;
LayerParameter layer_param;
ConvolutionParameter* convolution_param =
layer_param.mutable_convolution_param();
convolution_param->add_kernel_size(3);
convolution_param->add_stride(2);
convolution_param->set_num_output(3);
convolution_param->set_group(3);
convolution_param->mutable_weight_filler()->set_type("gaussian");
convolution_param->mutable_bias_filler()->set_type("constant");
convolution_param->mutable_bias_filler()->set_value(0.1);
layer=shared_ptr > (
new ConvolutionLayer(layer_param));
layer->SetUp(this->blob_bottom_vec_, this->blob_top_vec_);
}
} // namespace caffe
using namespace caffe;
ConvolutionLayerTest > * g_convptr;
void single_forward(void * dummy )
{
g_convptr->RunConvolution();
}
void forward_convolution(void)
{
run_test(16,0,single_forward,NULL);
}
#define RUN_FUNC(test_case) test_ ## test_case ()
#define DEF_TEST_FUNC(test_case) \
void test_## test_case (void)\
{\
std::cout<<__FUNCTION__<<" start ..."<<:endl g_convptr="new" convolutionlayertest> >;\
g_convptr->SetUp();\
g_convptr->Test ## test_case ();\
forward_convolution();\
delete g_convptr;\
std::cout<<__FUNCTION__<<" DONE"<<:endl def_test_func int main argc char argv caffe::globalinit init_testbed run_func release_testbed return>