|
|
|
@ -1029,14 +1029,51 @@ void GpuMatrix::maxPoolForward(Matrix& inputMat,
|
|
|
|
|
size_t outputW,
|
|
|
|
|
size_t paddingH,
|
|
|
|
|
size_t paddingW) {
|
|
|
|
|
maxPoolForward(inputMat,
|
|
|
|
|
imgSizeH,
|
|
|
|
|
imgSizeW,
|
|
|
|
|
channels,
|
|
|
|
|
sizeX,
|
|
|
|
|
sizeY,
|
|
|
|
|
strideH,
|
|
|
|
|
strideW,
|
|
|
|
|
outputH,
|
|
|
|
|
outputW,
|
|
|
|
|
paddingH,
|
|
|
|
|
paddingW,
|
|
|
|
|
NULL,
|
|
|
|
|
false);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void GpuMatrix::maxPoolForward(Matrix& inputMat,
|
|
|
|
|
size_t imgSizeH,
|
|
|
|
|
size_t imgSizeW,
|
|
|
|
|
size_t channels,
|
|
|
|
|
size_t sizeX,
|
|
|
|
|
size_t sizeY,
|
|
|
|
|
size_t strideH,
|
|
|
|
|
size_t strideW,
|
|
|
|
|
size_t outputH,
|
|
|
|
|
size_t outputW,
|
|
|
|
|
size_t paddingH,
|
|
|
|
|
size_t paddingW,
|
|
|
|
|
MatrixPtr maskMatP,
|
|
|
|
|
bool withMask) {
|
|
|
|
|
CHECK(inputMat.useGpu_ == true) << "Matrix type are not equal";
|
|
|
|
|
|
|
|
|
|
real* inputData = inputMat.getData();
|
|
|
|
|
real* maskData = NULL;
|
|
|
|
|
size_t frameNum = inputMat.getHeight();
|
|
|
|
|
CHECK(imgSizeH * imgSizeW * channels == inputMat.getWidth());
|
|
|
|
|
CHECK(height_ == inputMat.getHeight());
|
|
|
|
|
CHECK(width_ == outputH * outputW * channels);
|
|
|
|
|
|
|
|
|
|
if (withMask) {
|
|
|
|
|
CHECK(maskMatP->useGpu_ == true) << "Matrix type are not equal";
|
|
|
|
|
CHECK(outputH * outputW * channels == maskMatP->getWidth());
|
|
|
|
|
maskData = maskMatP->getData();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
hl_maxpool_forward(frameNum,
|
|
|
|
|
inputData,
|
|
|
|
|
channels,
|
|
|
|
@ -1051,7 +1088,9 @@ void GpuMatrix::maxPoolForward(Matrix& inputMat,
|
|
|
|
|
paddingH,
|
|
|
|
|
paddingW,
|
|
|
|
|
data_,
|
|
|
|
|
getStride());
|
|
|
|
|
getStride(),
|
|
|
|
|
maskData,
|
|
|
|
|
withMask);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void GpuMatrix::maxPoolBackward(Matrix& inputMat,
|
|
|
|
@ -1974,8 +2013,39 @@ void CpuMatrix::maxPoolForward(Matrix& inputMat,
|
|
|
|
|
size_t outputW,
|
|
|
|
|
size_t paddingH,
|
|
|
|
|
size_t paddingW) {
|
|
|
|
|
maxPoolForward(inputMat,
|
|
|
|
|
imgSizeH,
|
|
|
|
|
imgSizeW,
|
|
|
|
|
channels,
|
|
|
|
|
sizeX,
|
|
|
|
|
sizeY,
|
|
|
|
|
strideH,
|
|
|
|
|
strideW,
|
|
|
|
|
outputH,
|
|
|
|
|
outputW,
|
|
|
|
|
paddingH,
|
|
|
|
|
paddingW,
|
|
|
|
|
NULL,
|
|
|
|
|
false);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void CpuMatrix::maxPoolForward(Matrix& inputMat,
|
|
|
|
|
size_t imgSizeH,
|
|
|
|
|
size_t imgSizeW,
|
|
|
|
|
size_t channels,
|
|
|
|
|
size_t sizeX,
|
|
|
|
|
size_t sizeY,
|
|
|
|
|
size_t strideH,
|
|
|
|
|
size_t strideW,
|
|
|
|
|
size_t outputH,
|
|
|
|
|
size_t outputW,
|
|
|
|
|
size_t paddingH,
|
|
|
|
|
size_t paddingW,
|
|
|
|
|
MatrixPtr maskMatP,
|
|
|
|
|
bool withMask) {
|
|
|
|
|
real* inputData = inputMat.getData();
|
|
|
|
|
real* outData = data_;
|
|
|
|
|
real* maskData = NULL;
|
|
|
|
|
size_t num = inputMat.getHeight();
|
|
|
|
|
size_t inLength = imgSizeH * imgSizeW;
|
|
|
|
|
size_t outLength = outputH * outputW;
|
|
|
|
@ -1984,6 +2054,11 @@ void CpuMatrix::maxPoolForward(Matrix& inputMat,
|
|
|
|
|
CHECK_EQ(channels * outLength, this->getWidth());
|
|
|
|
|
size_t outStride = getStride();
|
|
|
|
|
|
|
|
|
|
if (withMask) {
|
|
|
|
|
maskData = maskMatP->getData();
|
|
|
|
|
CHECK_EQ(channels * outLength, maskMatP->getWidth());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* initialize the data_ */
|
|
|
|
|
for (size_t i = 0; i < height_; i++) {
|
|
|
|
|
for (size_t j = 0; j < width_; j++) {
|
|
|
|
@ -2005,17 +2080,30 @@ void CpuMatrix::maxPoolForward(Matrix& inputMat,
|
|
|
|
|
int wstart = pw * strideW - paddingW;
|
|
|
|
|
int wend = std::min(wstart + sizeX, imgSizeW);
|
|
|
|
|
wstart = std::max(wstart, 0);
|
|
|
|
|
if (!withMask) {
|
|
|
|
|
for (int h = hstart; h < hend; ++h) {
|
|
|
|
|
for (int w = wstart; w < wend; ++w) {
|
|
|
|
|
outData[ph * outputW + pw] = std::max(
|
|
|
|
|
outData[ph * outputW + pw], inputData[h * imgSizeW + w]);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
for (int h = hstart; h < hend; ++h) {
|
|
|
|
|
for (int w = wstart; w < wend; ++w) {
|
|
|
|
|
if (outData[ph * outputW + pw] < inputData[h * imgSizeW + w]) {
|
|
|
|
|
outData[ph * outputW + pw] = inputData[h * imgSizeW + w];
|
|
|
|
|
maskData[ph * outputW + pw] = h * imgSizeW + w;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
// compute offset
|
|
|
|
|
inputData += inLength;
|
|
|
|
|
outData += outLength;
|
|
|
|
|
|
|
|
|
|
if (withMask) maskData += outLength;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|