|
|
|
@ -1024,61 +1024,63 @@ void GpuMatrix::check(std::ostream& os, Matrix& refMat, bool printDiff) {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void GpuMatrix::upsampleForward(Matrix& input,
|
|
|
|
|
Matrix& mask,
|
|
|
|
|
size_t imgSizeH,
|
|
|
|
|
size_t imgSizeW,
|
|
|
|
|
size_t channels,
|
|
|
|
|
size_t outputH,
|
|
|
|
|
size_t outputW) {
|
|
|
|
|
CHECK(input.useGpu_ == true) << "Matrix type are not equal";
|
|
|
|
|
CHECK(mask.useGpu_ == true) << "Matrix type are not equal";
|
|
|
|
|
|
|
|
|
|
real *inputData = input.getData();
|
|
|
|
|
real *maskData = mask.getData();
|
|
|
|
|
real *outData = data_;
|
|
|
|
|
|
|
|
|
|
size_t batch = input.getHeight();
|
|
|
|
|
|
|
|
|
|
CHECK(imgSizeH * imgSizeW * channels == input.getWidth());
|
|
|
|
|
CHECK(imgSizeH * imgSizeW * channels == mask.getWidth());
|
|
|
|
|
CHECK_EQ(batch, this->getHeight());
|
|
|
|
|
CHECK(width_ == outputH * outputW * channels);
|
|
|
|
|
hl_upsample_forward(inputData, maskData,
|
|
|
|
|
batch,
|
|
|
|
|
imgSizeH,
|
|
|
|
|
imgSizeW,
|
|
|
|
|
channels,
|
|
|
|
|
outputH,
|
|
|
|
|
outputW,
|
|
|
|
|
outData);
|
|
|
|
|
Matrix& mask,
|
|
|
|
|
size_t imgSizeH,
|
|
|
|
|
size_t imgSizeW,
|
|
|
|
|
size_t channels,
|
|
|
|
|
size_t outputH,
|
|
|
|
|
size_t outputW) {
|
|
|
|
|
CHECK(input.useGpu_ == true) << "Matrix type are not equal";
|
|
|
|
|
CHECK(mask.useGpu_ == true) << "Matrix type are not equal";
|
|
|
|
|
|
|
|
|
|
real* inputData = input.getData();
|
|
|
|
|
real* maskData = mask.getData();
|
|
|
|
|
real* outData = data_;
|
|
|
|
|
|
|
|
|
|
size_t batch = input.getHeight();
|
|
|
|
|
|
|
|
|
|
CHECK(imgSizeH * imgSizeW * channels == input.getWidth());
|
|
|
|
|
CHECK(imgSizeH * imgSizeW * channels == mask.getWidth());
|
|
|
|
|
CHECK_EQ(batch, this->getHeight());
|
|
|
|
|
CHECK(width_ == outputH * outputW * channels);
|
|
|
|
|
hl_upsample_forward(inputData,
|
|
|
|
|
maskData,
|
|
|
|
|
batch,
|
|
|
|
|
imgSizeH,
|
|
|
|
|
imgSizeW,
|
|
|
|
|
channels,
|
|
|
|
|
outputH,
|
|
|
|
|
outputW,
|
|
|
|
|
outData);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void GpuMatrix::upsampleBackward(Matrix& outputGrad,
|
|
|
|
|
Matrix& mask,
|
|
|
|
|
size_t imgSizeH,
|
|
|
|
|
size_t imgSizeW,
|
|
|
|
|
size_t channels,
|
|
|
|
|
size_t outputH,
|
|
|
|
|
size_t outputW) {
|
|
|
|
|
CHECK(outputGrad.useGpu_ == true) << "Matrix type are not equal";
|
|
|
|
|
CHECK(mask.useGpu_ == true) << "Matrix type are not equal";
|
|
|
|
|
|
|
|
|
|
real *outputGradData = outputGrad.getData();
|
|
|
|
|
real *maskData = mask.getData();
|
|
|
|
|
real *inputGradData = data_;
|
|
|
|
|
size_t batch = outputGrad.getHeight();
|
|
|
|
|
|
|
|
|
|
CHECK(imgSizeH * imgSizeW == this->getWidth()/channels);
|
|
|
|
|
CHECK_EQ(batch, this->getHeight());
|
|
|
|
|
CHECK_EQ(channels * outputH * outputW, outputGrad.getWidth());
|
|
|
|
|
hl_upsample_backward(outputGradData, maskData,
|
|
|
|
|
batch,
|
|
|
|
|
imgSizeH,
|
|
|
|
|
imgSizeW,
|
|
|
|
|
channels,
|
|
|
|
|
outputH,
|
|
|
|
|
outputW,
|
|
|
|
|
inputGradData);
|
|
|
|
|
Matrix& mask,
|
|
|
|
|
size_t imgSizeH,
|
|
|
|
|
size_t imgSizeW,
|
|
|
|
|
size_t channels,
|
|
|
|
|
size_t outputH,
|
|
|
|
|
size_t outputW) {
|
|
|
|
|
CHECK(outputGrad.useGpu_ == true) << "Matrix type are not equal";
|
|
|
|
|
CHECK(mask.useGpu_ == true) << "Matrix type are not equal";
|
|
|
|
|
|
|
|
|
|
real* outputGradData = outputGrad.getData();
|
|
|
|
|
real* maskData = mask.getData();
|
|
|
|
|
real* inputGradData = data_;
|
|
|
|
|
size_t batch = outputGrad.getHeight();
|
|
|
|
|
|
|
|
|
|
CHECK(imgSizeH * imgSizeW == this->getWidth() / channels);
|
|
|
|
|
CHECK_EQ(batch, this->getHeight());
|
|
|
|
|
CHECK_EQ(channels * outputH * outputW, outputGrad.getWidth());
|
|
|
|
|
hl_upsample_backward(outputGradData,
|
|
|
|
|
maskData,
|
|
|
|
|
batch,
|
|
|
|
|
imgSizeH,
|
|
|
|
|
imgSizeW,
|
|
|
|
|
channels,
|
|
|
|
|
outputH,
|
|
|
|
|
outputW,
|
|
|
|
|
inputGradData);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void GpuMatrix::maxPoolForward(Matrix& inputMat,
|
|
|
|
@ -2040,71 +2042,69 @@ void CpuMatrix::inverse(MatrixPtr& matInv, bool memAlloc) {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void CpuMatrix::upsampleForward(Matrix& input,
|
|
|
|
|
Matrix& mask,
|
|
|
|
|
size_t imgSizeH,
|
|
|
|
|
size_t imgSizeW,
|
|
|
|
|
size_t channels,
|
|
|
|
|
size_t outputH,
|
|
|
|
|
size_t outputW) {
|
|
|
|
|
real *inputData = input.getData();
|
|
|
|
|
real *maskData = mask.getData();
|
|
|
|
|
real *outData = data_;
|
|
|
|
|
size_t inLength = imgSizeH * imgSizeW;
|
|
|
|
|
size_t outLength = outputH * outputW;
|
|
|
|
|
size_t batch = input.getHeight();
|
|
|
|
|
CHECK(inLength == input.getWidth() / channels);
|
|
|
|
|
CHECK_EQ(batch, this->getHeight());
|
|
|
|
|
CHECK_EQ(channels * outLength, this->getWidth());
|
|
|
|
|
|
|
|
|
|
for (size_t k = 0; k < batch; k++) {
|
|
|
|
|
for (size_t c = 0; c < channels; c++) {
|
|
|
|
|
for (size_t i = 0; i < inLength; i++) {
|
|
|
|
|
size_t out_index = static_cast<int>(maskData[i]);
|
|
|
|
|
if (out_index >= outLength) {
|
|
|
|
|
LOG(FATAL) << "upsample index " << out_index
|
|
|
|
|
<< " out of range.";
|
|
|
|
|
}
|
|
|
|
|
outData[out_index] = inputData[i];
|
|
|
|
|
}
|
|
|
|
|
inputData += inLength;
|
|
|
|
|
maskData += inLength;
|
|
|
|
|
outData += outLength;
|
|
|
|
|
Matrix& mask,
|
|
|
|
|
size_t imgSizeH,
|
|
|
|
|
size_t imgSizeW,
|
|
|
|
|
size_t channels,
|
|
|
|
|
size_t outputH,
|
|
|
|
|
size_t outputW) {
|
|
|
|
|
real* inputData = input.getData();
|
|
|
|
|
real* maskData = mask.getData();
|
|
|
|
|
real* outData = data_;
|
|
|
|
|
size_t inLength = imgSizeH * imgSizeW;
|
|
|
|
|
size_t outLength = outputH * outputW;
|
|
|
|
|
size_t batch = input.getHeight();
|
|
|
|
|
CHECK(inLength == input.getWidth() / channels);
|
|
|
|
|
CHECK_EQ(batch, this->getHeight());
|
|
|
|
|
CHECK_EQ(channels * outLength, this->getWidth());
|
|
|
|
|
|
|
|
|
|
for (size_t k = 0; k < batch; k++) {
|
|
|
|
|
for (size_t c = 0; c < channels; c++) {
|
|
|
|
|
for (size_t i = 0; i < inLength; i++) {
|
|
|
|
|
size_t out_index = static_cast<int>(maskData[i]);
|
|
|
|
|
if (out_index >= outLength) {
|
|
|
|
|
LOG(FATAL) << "upsample index " << out_index << " out of range.";
|
|
|
|
|
}
|
|
|
|
|
outData[out_index] = inputData[i];
|
|
|
|
|
}
|
|
|
|
|
inputData += inLength;
|
|
|
|
|
maskData += inLength;
|
|
|
|
|
outData += outLength;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void CpuMatrix::upsampleBackward(Matrix& outputGrad,
|
|
|
|
|
Matrix& mask,
|
|
|
|
|
size_t imgSizeH,
|
|
|
|
|
size_t imgSizeW,
|
|
|
|
|
size_t channels,
|
|
|
|
|
size_t outputH,
|
|
|
|
|
size_t outputW) {
|
|
|
|
|
real *outputGradData = outputGrad.getData();
|
|
|
|
|
real *maskData = mask.getData();
|
|
|
|
|
real *inputGradData = data_;
|
|
|
|
|
size_t inLength = imgSizeH * imgSizeW;
|
|
|
|
|
size_t outLength = outputH * outputW;
|
|
|
|
|
size_t batch = outputGrad.getHeight();
|
|
|
|
|
CHECK(inLength == this->getWidth()/channels);
|
|
|
|
|
CHECK_EQ(batch, this->getHeight());
|
|
|
|
|
CHECK_EQ(channels * outLength, outputGrad.getWidth());
|
|
|
|
|
|
|
|
|
|
for (size_t k = 0; k < batch; k++) {
|
|
|
|
|
for (size_t c = 0; c < channels; c++) {
|
|
|
|
|
for (size_t i = 0; i < inLength; i++) {
|
|
|
|
|
size_t out_index = static_cast<int>(maskData[i]);
|
|
|
|
|
if (out_index >= outLength) {
|
|
|
|
|
LOG(FATAL) << "upsample index " << out_index
|
|
|
|
|
<< " out of range.";
|
|
|
|
|
}
|
|
|
|
|
inputGradData[i] = outputGradData[out_index];
|
|
|
|
|
}
|
|
|
|
|
inputGradData += inLength;
|
|
|
|
|
maskData += inLength;
|
|
|
|
|
outputGradData += outLength;
|
|
|
|
|
Matrix& mask,
|
|
|
|
|
size_t imgSizeH,
|
|
|
|
|
size_t imgSizeW,
|
|
|
|
|
size_t channels,
|
|
|
|
|
size_t outputH,
|
|
|
|
|
size_t outputW) {
|
|
|
|
|
real* outputGradData = outputGrad.getData();
|
|
|
|
|
real* maskData = mask.getData();
|
|
|
|
|
real* inputGradData = data_;
|
|
|
|
|
size_t inLength = imgSizeH * imgSizeW;
|
|
|
|
|
size_t outLength = outputH * outputW;
|
|
|
|
|
size_t batch = outputGrad.getHeight();
|
|
|
|
|
CHECK(inLength == this->getWidth() / channels);
|
|
|
|
|
CHECK_EQ(batch, this->getHeight());
|
|
|
|
|
CHECK_EQ(channels * outLength, outputGrad.getWidth());
|
|
|
|
|
|
|
|
|
|
for (size_t k = 0; k < batch; k++) {
|
|
|
|
|
for (size_t c = 0; c < channels; c++) {
|
|
|
|
|
for (size_t i = 0; i < inLength; i++) {
|
|
|
|
|
size_t out_index = static_cast<int>(maskData[i]);
|
|
|
|
|
if (out_index >= outLength) {
|
|
|
|
|
LOG(FATAL) << "upsample index " << out_index << " out of range.";
|
|
|
|
|
}
|
|
|
|
|
inputGradData[i] = outputGradData[out_index];
|
|
|
|
|
}
|
|
|
|
|
inputGradData += inLength;
|
|
|
|
|
maskData += inLength;
|
|
|
|
|
outputGradData += outLength;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void CpuMatrix::maxPoolForward(Matrix& inputMat,
|
|
|
|
|