Implement Inception block E

This commit is contained in:
2024-05-27 22:02:55 +02:00
parent 2909147afe
commit 387990edbe

View File

@@ -433,8 +433,7 @@ class InceptionD : public CUDANet::Module {
); );
addLayer("", branch3x3_1); addLayer("", branch3x3_1);
branch3x3_2 = new BasicConv2d( branch3x3_2 = new BasicConv2d(
inputSize, 192, 320, {3, 3}, {2, 2}, {0, 0}, inputSize, 192, 320, {3, 3}, {2, 2}, {0, 0}, prefix + "branch3x3_2"
prefix + "branch3x3_2"
); );
addLayer("", branch3x3_2); addLayer("", branch3x3_2);
@@ -469,12 +468,10 @@ class InceptionD : public CUDANet::Module {
// Concat // Concat
concat_1 = new CUDANet::Layers::Concat( concat_1 = new CUDANet::Layers::Concat(
branch3x3_2->getOutputSize(), branch3x3_2->getOutputSize(), branch7x7x3_4->getOutputSize()
branch7x7x3_4->getOutputSize()
); );
concat_2 = new CUDANet::Layers::Concat( concat_2 = new CUDANet::Layers::Concat(
concat_1->getOutputSize(), concat_1->getOutputSize(), branchPool->getOutputSize()
branchPool->getOutputSize()
); );
} }
@@ -523,5 +520,147 @@ class InceptionD : public CUDANet::Module {
CUDANet::Layers::Concat *concat_1; CUDANet::Layers::Concat *concat_1;
CUDANet::Layers::Concat *concat_2; CUDANet::Layers::Concat *concat_2;
};
class InceptionE : public CUDANet::Module {
public:
InceptionE(shape2d inputSize, int inputChannels)
: inputSize(inputSize), inputChannels(inputChannels) {
// Branch 1x1
branch1x1 = new BasicConv2d(
inputSize, inputChannels, 320, {1, 1}, {1, 1}, {0, 0}, "branch1x1"
);
addLayer("", branch1x1);
// Branch 3x3
branch3x3_1 = new BasicConv2d(
inputSize, inputChannels, 384, {1, 1}, {1, 1}, {0, 0}, "branch3x3_1"
);
addLayer("", branch3x3_1);
branch3x3_2a = new BasicConv2d(
inputSize, 384, 384, {1, 3}, {1, 1}, {0, 1}, "branch3x3_2a"
);
addLayer("", branch3x3_2a);
branch3x3_2b = new BasicConv2d(
inputSize, 384, 384, {3, 1}, {1, 1}, {1, 0}, "branch3x3_2b"
);
addLayer("", branch3x3_2b);
branch_3x3_2_concat = new CUDANet::Layers::Concat(
branch3x3_2a->getOutputSize(), branch3x3_2b->getOutputSize()
);
// Branch 3x3dbl
branch3x3dbl_1 = new BasicConv2d(
inputSize, inputChannels, 448, {1, 1}, {1, 1}, {0, 0},
"branch3x3dbl_1"
);
addLayer("", branch3x3dbl_1);
branch3x3dbl_2 = new BasicConv2d(
inputSize, 448, 384, {3, 3}, {1, 1}, {1, 1}, "branch3x3dbl_2"
);
addLayer("", branch3x3dbl_2);
branch3x3dbl_3a = new BasicConv2d(
inputSize, 384, 384, {1, 3}, {1, 1}, {0, 1}, "branch3x3dbl_3a"
);
addLayer("", branch3x3dbl_3a);
branch3x3dbl_3b = new BasicConv2d(
inputSize, 384, 384, {3, 1}, {1, 1}, {1, 0}, "branch3x3dbl_3b"
);
addLayer("", branch3x3dbl_3b);
branch_3x3dbl_3_concat = new CUDANet::Layers::Concat(
branch3x3dbl_3a->getOutputSize(), branch3x3dbl_3b->getOutputSize()
);
// Branch Pool
branchPool_1 = new CUDANet::Layers::AvgPooling2d(
inputSize, inputChannels, {3, 3}, {1, 1}, {1, 1}, CUDANet::Layers::ActivationType::NONE
);
addLayer("", branchPool_1);
branchPool_2 = new BasicConv2d(
inputSize, inputChannels, 192, {1, 1}, {1, 1}, {0, 0}, "branchPool_2"
);
addLayer("", branchPool_2);
// Concat
concat_1 = new CUDANet::Layers::Concat(
branch1x1->getOutputSize(), branch_3x3_2_concat->getOutputSize()
);
concat_2 = new CUDANet::Layers::Concat(
concat_1->getOutputSize(), branch_3x3dbl_3_concat->getOutputSize()
);
concat_3 = new CUDANet::Layers::Concat(
concat_2->getOutputSize(), branchPool_2->getOutputSize()
);
}
~InceptionE() {
delete branch1x1;
delete branch3x3_1;
delete branch3x3_2a;
delete branch3x3_2b;
delete branch_3x3_2_concat;
delete branch3x3dbl_1;
delete branch3x3dbl_2;
delete branch3x3dbl_3a;
delete branch3x3dbl_3b;
delete branch_3x3dbl_3_concat;
delete branchPool_1;
delete branchPool_2;
delete concat_1;
delete concat_2;
delete concat_3;
}
float *forward(const float *d_input) {
float *branch1x1_output = branch1x1->forward(d_input);
float *branch3x3_output = branch3x3_1->forward(d_input);
float *branch3x3_2a_output = branch3x3_2a->forward(branch3x3_output);
float *branch3x3_2b_output = branch3x3_2b->forward(branch3x3_output);
branch3x3_output = branch_3x3_2_concat->forward(
branch3x3_2a_output, branch3x3_2b_output
);
float *branch3x3dbl_output = branch3x3dbl_1->forward(d_input);
branch3x3dbl_output = branch3x3dbl_2->forward(branch3x3dbl_output);
float *branch3x3dbl_3a_output = branch3x3dbl_3a->forward(branch3x3dbl_output);
float *branch3x3dbl_3b_output = branch3x3dbl_3b->forward(branch3x3dbl_output);
branch3x3dbl_output = branch_3x3dbl_3_concat->forward(
branch3x3dbl_3a_output, branch3x3dbl_3b_output
);
float *branchPool_output = branchPool_1->forward(d_input);
branchPool_output = branchPool_2->forward(branchPool_output);
float *d_output = concat_1->forward(branch1x1_output, branch3x3_output);
d_output = concat_2->forward(d_output, branch3x3dbl_output);
d_output = concat_3->forward(d_output, branchPool_output);
return d_output;
}
private:
shape2d inputSize;
int inputChannels;
BasicConv2d *branch1x1;
BasicConv2d *branch3x3_1;
BasicConv2d *branch3x3_2a;
BasicConv2d *branch3x3_2b;
CUDANet::Layers::Concat *branch_3x3_2_concat;
BasicConv2d *branch3x3dbl_1;
BasicConv2d *branch3x3dbl_2;
BasicConv2d *branch3x3dbl_3a;
BasicConv2d *branch3x3dbl_3b;
CUDANet::Layers::Concat *branch_3x3dbl_3_concat;
CUDANet::Layers::AvgPooling2d *branchPool_1;
BasicConv2d *branchPool_2;
CUDANet::Layers::Concat *concat_1;
CUDANet::Layers::Concat *concat_2;
CUDANet::Layers::Concat *concat_3;
}; };