From bc39fbe3ef7f214597ef73f8392d54d629e6711f Mon Sep 17 00:00:00 2001 From: Siddhartha Rao Kamalakara Date: Wed, 25 Jul 2018 19:25:20 +0530 Subject: [PATCH 1/8] Initial padding commit --- tmva/tmva/inc/TMVA/DNN/Architectures/Cpu.h | 29 +++++++++++++ tmva/tmva/inc/TMVA/DNN/Architectures/Cuda.h | 29 +++++++++++++ .../inc/TMVA/DNN/Architectures/Reference.h | 31 +++++++++++++ .../src/DNN/Architectures/Cpu/Propagation.cxx | 19 ++++++++ .../Architectures/Reference/Propagation.cxx | 43 +++++++++++++++++++ 5 files changed, 151 insertions(+) diff --git a/tmva/tmva/inc/TMVA/DNN/Architectures/Cpu.h b/tmva/tmva/inc/TMVA/DNN/Architectures/Cpu.h index 45ffe910de82a..1bbc21804a336 100644 --- a/tmva/tmva/inc/TMVA/DNN/Architectures/Cpu.h +++ b/tmva/tmva/inc/TMVA/DNN/Architectures/Cpu.h @@ -403,6 +403,35 @@ class TCpu ///@} + //____________________________________________________________________________ + // + // Zero Padding Layer Propagation + //____________________________________________________________________________ + /** @name Forward Propagation in Zero Padding Layer + */ + ///@{ + + /** Zero Pad the matrix \p B to the matrix \p A, using the + * padding dimensions specified. + * */ + static void ZeroPad2DForward(TCpuMatrix &A, const TCpuMatrix &B, + size_t topPad, size_t bottomPad, size_t leftPad, + size_t rightPad); + + ///@} + + /** @name Backward Propagation in Zero Padding Layer + */ + ///@{ + + /** Perform the complete backward propagation step in a Zero Padding Layer. The gradients + * at the padded positions get discarded. */ + static void ZeroPad2DBackward(std::vector> &activationGradientsBackward, + const std::vector> &activationGradients, + const std::vector> &indexMatrix, size_t batchSize, size_t depth, + size_t nLocalViews); + ///@} + //____________________________________________________________________________ // // Reshape Layer Propagation diff --git a/tmva/tmva/inc/TMVA/DNN/Architectures/Cuda.h b/tmva/tmva/inc/TMVA/DNN/Architectures/Cuda.h index 0a17eed5db012..b5eafe016aa5a 100644 --- a/tmva/tmva/inc/TMVA/DNN/Architectures/Cuda.h +++ b/tmva/tmva/inc/TMVA/DNN/Architectures/Cuda.h @@ -412,6 +412,35 @@ class TCuda ///@} + //____________________________________________________________________________ + // + // Zero Padding Layer Propagation + //____________________________________________________________________________ + /** @name Forward Propagation in Zero Padding Layer + */ + ///@{ + + /** Zero Pad the matrix \p B to the matrix \p A, using the + * padding dimensions specified. + * */ + static void ZeroPad2DForward(TCudaMatrix &A, const TCudaMatrix &B, + size_t topPad, size_t bottomPad, size_t leftPad, + size_t rightPad); + + ///@} + + /** @name Backward Propagation in Zero Padding Layer + */ + ///@{ + + /** Perform the complete backward propagation step in a Zero Padding Layer. The gradients + * at the padded positions get discarded. */ + static void ZeroPad2DBackward(std::vector> &activationGradientsBackward, + const std::vector> &activationGradients, + const std::vector> &indexMatrix, size_t batchSize, size_t depth, + size_t nLocalViews); + ///@} + //____________________________________________________________________________ // // Reshape Layer Propagation diff --git a/tmva/tmva/inc/TMVA/DNN/Architectures/Reference.h b/tmva/tmva/inc/TMVA/DNN/Architectures/Reference.h index 294c1839a23ae..47a5c5f5a4d3f 100644 --- a/tmva/tmva/inc/TMVA/DNN/Architectures/Reference.h +++ b/tmva/tmva/inc/TMVA/DNN/Architectures/Reference.h @@ -432,6 +432,37 @@ class TReference const std::vector> &indexMatrix, size_t batchSize, size_t depth, size_t nLocalViews); ///@} + + + //____________________________________________________________________________ + // + // Zero Padding Layer Propagation + //____________________________________________________________________________ + /** @name Forward Propagation in Zero Padding Layer + */ + ///@{ + + /** Zero Pad the matrix \p B to the matrix \p A, using the + * padding dimensions specified. + * */ + static void ZeroPad2DForward(TMatrixT &A, const TMatrixT &B, + size_t topPad, size_t bottomPad, size_t leftPad, + size_t rightPad); + + ///@} + + /** @name Backward Propagation in Zero Padding Layer + */ + ///@{ + + /** Perform the complete backward propagation step in a Zero Padding Layer. The gradients + * at the padded positions get discarded. */ + static void ZeroPad2DBackward(std::vector> &activationGradientsBackward, + const std::vector> &activationGradients, + const std::vector> &indexMatrix, size_t batchSize, size_t depth, + size_t nLocalViews); + ///@} + //____________________________________________________________________________ // // Reshape Layer Propagation diff --git a/tmva/tmva/src/DNN/Architectures/Cpu/Propagation.cxx b/tmva/tmva/src/DNN/Architectures/Cpu/Propagation.cxx index cacbf34bb2843..a0d05171ae010 100644 --- a/tmva/tmva/src/DNN/Architectures/Cpu/Propagation.cxx +++ b/tmva/tmva/src/DNN/Architectures/Cpu/Propagation.cxx @@ -579,6 +579,25 @@ void TCpu::MaxPoolLayerBackward(std::vector> &activat } } +//______________________________________________________________________________ +template +void TCpu::ZeroPad2DForward(TCpuMatrix &A, const TCpuMatrix &B, size_t topPad, size_t bottomPad, size_t leftPad, size_t rightPad) +{ + size_t nColsA = A.GetNcols(); + size_t nColsB = B.GetNcols(); + + for (size_t i = 0; i < A.GetNrows(); i++) { + for (size_t j = 0; j < A.GetNcols(); j++) { + if(iB.GetNrows() && iB.GetNcols() && j void TCpu::Reshape(TCpuMatrix &A, const TCpuMatrix &B) diff --git a/tmva/tmva/src/DNN/Architectures/Reference/Propagation.cxx b/tmva/tmva/src/DNN/Architectures/Reference/Propagation.cxx index 88404efc12803..6b95d498edd91 100644 --- a/tmva/tmva/src/DNN/Architectures/Reference/Propagation.cxx +++ b/tmva/tmva/src/DNN/Architectures/Reference/Propagation.cxx @@ -398,6 +398,49 @@ void TReference::MaxPoolLayerBackward(std::vector> &activ } } +//______________________________________________________________________________ +template +void TReference::ZeroPad2DForward(TMatrixT &A, const TMatrixT &B, + size_t topPad, size_t bottomPad, size_t leftPad, + size_t rightPad, size_t outputHeight, size_t outputWidth) +{ + auto nColsA = A.GetNcols(); + auto nColsB = B.GetNcols(); + + for (Int_t i = 0; i < A.GetNrows(); i++) { + Int_t original_idx = 0; + for (Int_t j = 0; j < A.GetNcols(); j++) { + Int_t row = j / outputHeight; + Int_t col = j - (row*outputWidth); + if(row(outputHeight-topPad-bottomPad) && row(outputWidth-leftPad-rightPad) && col +void TReference::ZeroPad2DBackward(std::vector> &activationGradientsBackward, + const std::vector> &activationGradients, + size_t batchSize, size_t depth) +{ + for (size_t i = 0; i < batchSize; i++) { + for (size_t j = 0; j < depth; j++) { + + // initialize to zeros + for (size_t t = 0; t < (size_t)activationGradientsBackward[i].GetNcols(); t++) { + activationGradientsBackward[i][j][t] = activationGradients[i][j][t]; + } + + } + } +} + //______________________________________________________________________________ template void TReference::Reshape(TMatrixT &A, const TMatrixT &B) From 7d6ebb62f9418177cf665e1218986aaa572a8c3b Mon Sep 17 00:00:00 2001 From: Siddhartha Rao Kamalakara Date: Wed, 25 Jul 2018 19:26:36 +0530 Subject: [PATCH 2/8] Add Padding layer skeleton --- tmva/tmva/inc/TMVA/DNN/CNN/PaddingLayer.h | 217 ++++++++++++++++++++++ 1 file changed, 217 insertions(+) create mode 100644 tmva/tmva/inc/TMVA/DNN/CNN/PaddingLayer.h diff --git a/tmva/tmva/inc/TMVA/DNN/CNN/PaddingLayer.h b/tmva/tmva/inc/TMVA/DNN/CNN/PaddingLayer.h new file mode 100644 index 0000000000000..db5fcaa6b544d --- /dev/null +++ b/tmva/tmva/inc/TMVA/DNN/CNN/PaddingLayer.h @@ -0,0 +1,217 @@ +// @(#)root/tmva/tmva/dnn:$Id$ +// Author: Siddhartha Rao Kamalakara + +/********************************************************************************** + * Project: TMVA - a Root-integrated toolkit for multivariate data analysis * + * Package: TMVA * + * Class : TConvLayer * + * Web : http://tmva.sourceforge.net * + * * + * Description: * + * Convolutional Deep Neural Network Layer * + * * + * Authors (alphabetical): * + * Siddhartha Rao Kamalakara - CERN, Switzerland * + * * + * Copyright (c) 2005-2015: * + * CERN, Switzerland * + * U. of Victoria, Canada * + * MPI-K Heidelberg, Germany * + * U. of Bonn, Germany * + * * + * Redistribution and use in source and binary forms, with or without * + * modification, are permitted according to the terms listed in LICENSE * + * (http://tmva.sourceforge.net/LICENSE) * + **********************************************************************************/ + +#ifndef TMVA_CNN_CONVLAYER +#define TMVA_CNN_CONVLAYER + +#include "TMatrix.h" + +#include "TMVA/DNN/GeneralLayer.h" +#include "TMVA/DNN/Functions.h" + +#include +#include + +namespace TMVA { +namespace DNN { +namespace CNN { + +template +class TPaddingLayer : public VGeneralLayer +{ + +public: + using Matrix_t = typename Architecture_t::Matrix_t; + using Scalar_t = typename Architecture_t::Scalar_t; + +private: + size_t fTopPad; + size_t fBottomPad; + size_t fLeftPad; + size_t fRightPad; + size_t outputWidth; + size_t outputHeight; + + size_t calculateDimension(size_t imgHeight, size_t imgWidth, size_t pad_left, size_t pad_right, size_t pad_top, size_t pad_bottom); + +public: + /*! Constructor. */ + TPaddingLayer(size_t BatchSize, size_t inputDepth, size_t inputHeight, size_t inputWidth, size_t TopPad, size_t BottomPad, size_t LeftPad, size_t RightPad); + + /*! Copy the conv layer provided as a pointer */ + TPaddingLayer(TPaddingLayer *layer); + + /*! Copy constructor. */ + TPaddingLayer(const TPaddingLayer &); + + /*! Destructor. */ + ~TPaddingLayer(); + + /*! Pads the input array with the dimensions given by + * the user. Padding is done in two dimensions for each + * example in the batch */ + void Forward(std::vector &input, bool applyDropout = false); + + /*! Discards the gradients through the padded inputs + * since they are zero padded */ + void Backward(std::vector &gradients_backward, + const std::vector & /*activations_backward*/, + std::vector & /*inp1*/, std::vector & + /*inp2*/); + + /*! Prints the info about the layer. */ + void Print() const; + + size_t GetTopPadding() const {return fTopPad;} + + size_t GetBottomPadding() const {return fBottomPad;} + + size_t GetLeftPadding() const {return fLeftPad;} + + size_t GetRightPadding() const {return fRightPad;} + + size_t GetOutputHeight() const {return outputHeight;} + + size_t GetOutputWidth() const {return outputWidth;} + + +}; + +template +TPaddingLayer::TPaddingLayer(size_t batchSize, size_t inputDepth, size_t inputHeight, size_t inputWidth, + size_t topPad, size_t bottomPad, size_t leftPad, size_t rightPad) + : VGeneralLayer(batchSize, inputDepth, inputHeight, inputWidth, 0, 0, 0, 0, 0, 0, 0, 0, + 0, batchSize, inputDepth, calculateDimension(inputHeight, inputWidth, leftPad, rightPad, topPad, bottomPad), EInitialization::kZero), + fTopPad(topPad), fBottomPad(bottomPad), fLeftPad(leftPad), fRightPad(rightPad) +{ + + this->outputHeight = inputHeight + topPad + bottomPad; + this->outputWidth = inputWidth + leftPad + rightPad; +} + + +//_________________________________________________________________________________________________ +template +TPaddingLayer::TPaddingLayer(TPadding *layer) + : VGeneralLayer(layer), fTopPad(layer->GetTopPadding()), fBottomPad(layer->GetBottomPadding()), + fLeftPad(layer->GetLeftPadding()), fRightPad(layer->GetRightPadding()) +{ +} + +//_________________________________________________________________________________________________ +template +TPaddingLayer::TPaddingLayer(const TPaddingLayer &layer) + : VGeneralLayer(layer), fTopPad(layer.fTopPad), fBottomPad(layer.fBottomPad), + fLeftPad(layer.fLeftPad), fRightPad(layer.fRightPad) +{ + // Nothing to do here. +} + +//_________________________________________________________________________________________________ +template +TPaddingLayer::~TPaddingLayer() +{ + // Nothing to do here. +} + +//_________________________________________________________________________________________________ +template +auto TReshapeLayer::Forward(std::vector &input, bool /*applyDropout*/) -> void +{ + + for (size_t i = 0; i < this->GetBatchSize(); i++) { + Architecture_t::ZeroPad2DForward(this->GetOutputAt(i), input[i], fTopPad, fBottomPad, fRightPad, fLeftPad, this->GetOutputHeight(), this->GetOutputWidth()); + } + +} + +//_________________________________________________________________________________________________ +template +auto TPaddingLayer::Backward(std::vector &gradients_backward, + const std::vector & /*activations_backward*/, + std::vector & /*inp1*/, std::vector & + /*inp2*/) -> void +{ + // in case of first layer size is zero - do nothing + if (gradients_backward.size() == 0) return; + if (fFlattening) { + size_t size = gradients_backward.size(); + size_t nRows = gradients_backward[0].GetNrows(); + size_t nCols = gradients_backward[0].GetNcols(); + Architecture_t::Deflatten(gradients_backward, this->GetActivationGradientsAt(0), size, nRows, nCols); + } else { + for (size_t i = 0; i < this->GetBatchSize(); i++) { + Architecture_t::Reshape(gradients_backward[i], this->GetActivationGradientsAt(i)); + } + } +} + +//_________________________________________________________________________________________________ +template +auto TReshapeLayer::Print() const -> void +{ + std::cout << " PADDING Layer \t "; + std::cout << "Input = ( " << this->GetInputDepth() << " , " << this->GetInputHeight() << " , " << this->GetInputWidth() << " ) "; + if (this->GetOutput().size() > 0) { + std::cout << "\tOutput = ( " << this->GetOutput().size() << " , " << this->GetOutput()[0].GetNrows() << " , " << this->GetOutput()[0].GetNcols() << " ) "; + } + std::cout << std::endl; +} + +template +auto TReshapeLayer::AddWeightsXMLTo(void *parent) -> void +{ + auto layerxml = gTools().xmlengine().NewChild(parent, 0, "PaddingLayer"); + + // write info for reshapelayer + gTools().xmlengine().NewAttr(layerxml, 0, "Depth", gTools().StringFromInt(this->GetDepth())); + gTools().xmlengine().NewAttr(layerxml, 0, "Height", gTools().StringFromInt(this->GetHeight())); + gTools().xmlengine().NewAttr(layerxml, 0, "Width", gTools().StringFromInt(this->GetWidth())); + gTools().xmlengine().NewAttr(layerxml, 0, "Flattening", gTools().StringFromInt(this->isFlattening())); + + +} + +//______________________________________________________________________________ +template +void TPaddingLayer::ReadWeightsFromXML(void * /*parent*/) +{ + // no info to read +} + + +template +size_t TPaddingLayer::calculateDimension(size_t imgHeight, size_t imgWidth, size_t pad_left, size_t pad_right, size_t pad_top, size_t pad_bottom){ + + size_t height = imgHeight + pad_top + pad_bottom; + size_t width = imgWidth + pad_left + pad_right; + + return height*width; +} + + +} // namespace DNN +} // namespace TMVA \ No newline at end of file From de9688115f1eda0f9f37e91240c4e83402a5b8b3 Mon Sep 17 00:00:00 2001 From: Siddhartha Rao Kamalakara Date: Thu, 26 Jul 2018 01:51:23 +0530 Subject: [PATCH 3/8] Implementation of Padding Layer --- tmva/tmva/inc/TMVA/DNN/Architectures/Cpu.h | 11 ++-- tmva/tmva/inc/TMVA/DNN/Architectures/Cuda.h | 13 +++-- .../inc/TMVA/DNN/Architectures/Reference.h | 13 +++-- tmva/tmva/inc/TMVA/DNN/CNN/PaddingLayer.h | 41 ++++++-------- tmva/tmva/inc/TMVA/DNN/DeepNet.h | 54 ++++++++++++++++++ tmva/tmva/inc/TMVA/MethodDL.h | 5 ++ .../src/DNN/Architectures/Cpu/Propagation.cxx | 47 +++++++++++++--- .../Architectures/Reference/Propagation.cxx | 8 ++- tmva/tmva/src/MethodDL.cxx | 55 +++++++++++++++++++ 9 files changed, 196 insertions(+), 51 deletions(-) diff --git a/tmva/tmva/inc/TMVA/DNN/Architectures/Cpu.h b/tmva/tmva/inc/TMVA/DNN/Architectures/Cpu.h index 1bbc21804a336..127c1654cd56b 100644 --- a/tmva/tmva/inc/TMVA/DNN/Architectures/Cpu.h +++ b/tmva/tmva/inc/TMVA/DNN/Architectures/Cpu.h @@ -415,8 +415,8 @@ class TCpu * padding dimensions specified. * */ static void ZeroPad2DForward(TCpuMatrix &A, const TCpuMatrix &B, - size_t topPad, size_t bottomPad, size_t leftPad, - size_t rightPad); + size_t topPad, size_t bottomPad, size_t leftPad, + size_t rightPad, size_t outputHeight, size_t outputWidth); ///@} @@ -427,9 +427,10 @@ class TCpu /** Perform the complete backward propagation step in a Zero Padding Layer. The gradients * at the padded positions get discarded. */ static void ZeroPad2DBackward(std::vector> &activationGradientsBackward, - const std::vector> &activationGradients, - const std::vector> &indexMatrix, size_t batchSize, size_t depth, - size_t nLocalViews); + const std::vector> &activationGradients, + size_t topPad, size_t bottomPad, size_t leftPad, + size_t rightPad, size_t outputHeight, size_t outputWidth, + size_t batchSize, size_t depth); ///@} //____________________________________________________________________________ diff --git a/tmva/tmva/inc/TMVA/DNN/Architectures/Cuda.h b/tmva/tmva/inc/TMVA/DNN/Architectures/Cuda.h index b5eafe016aa5a..58e3eb55e2c2a 100644 --- a/tmva/tmva/inc/TMVA/DNN/Architectures/Cuda.h +++ b/tmva/tmva/inc/TMVA/DNN/Architectures/Cuda.h @@ -424,8 +424,8 @@ class TCuda * padding dimensions specified. * */ static void ZeroPad2DForward(TCudaMatrix &A, const TCudaMatrix &B, - size_t topPad, size_t bottomPad, size_t leftPad, - size_t rightPad); + size_t topPad, size_t bottomPad, size_t leftPad, + size_t rightPad, size_t outputHeight, size_t outputWidth); ///@} @@ -435,10 +435,11 @@ class TCuda /** Perform the complete backward propagation step in a Zero Padding Layer. The gradients * at the padded positions get discarded. */ - static void ZeroPad2DBackward(std::vector> &activationGradientsBackward, - const std::vector> &activationGradients, - const std::vector> &indexMatrix, size_t batchSize, size_t depth, - size_t nLocalViews); + static void ZeroPad2DBackward(std::vector> &activationGradientsBackward, + const std::vector> &activationGradients, + size_t topPad, size_t bottomPad, size_t leftPad, + size_t rightPad, size_t outputHeight, size_t outputWidth, + size_t batchSize, size_t depth); ///@} //____________________________________________________________________________ diff --git a/tmva/tmva/inc/TMVA/DNN/Architectures/Reference.h b/tmva/tmva/inc/TMVA/DNN/Architectures/Reference.h index 47a5c5f5a4d3f..c5ebc32e58881 100644 --- a/tmva/tmva/inc/TMVA/DNN/Architectures/Reference.h +++ b/tmva/tmva/inc/TMVA/DNN/Architectures/Reference.h @@ -446,8 +446,8 @@ class TReference * padding dimensions specified. * */ static void ZeroPad2DForward(TMatrixT &A, const TMatrixT &B, - size_t topPad, size_t bottomPad, size_t leftPad, - size_t rightPad); + size_t topPad, size_t bottomPad, size_t leftPad, + size_t rightPad, size_t outputHeight, size_t outputWidth); ///@} @@ -458,11 +458,12 @@ class TReference /** Perform the complete backward propagation step in a Zero Padding Layer. The gradients * at the padded positions get discarded. */ static void ZeroPad2DBackward(std::vector> &activationGradientsBackward, - const std::vector> &activationGradients, - const std::vector> &indexMatrix, size_t batchSize, size_t depth, - size_t nLocalViews); + const std::vector> &activationGradients, + size_t topPad, size_t bottomPad, size_t leftPad, + size_t rightPad, size_t outputHeight, size_t outputWidth, + size_t batchSize, size_t depth); ///@} - + //____________________________________________________________________________ // // Reshape Layer Propagation diff --git a/tmva/tmva/inc/TMVA/DNN/CNN/PaddingLayer.h b/tmva/tmva/inc/TMVA/DNN/CNN/PaddingLayer.h index db5fcaa6b544d..207656df993cf 100644 --- a/tmva/tmva/inc/TMVA/DNN/CNN/PaddingLayer.h +++ b/tmva/tmva/inc/TMVA/DNN/CNN/PaddingLayer.h @@ -8,7 +8,7 @@ * Web : http://tmva.sourceforge.net * * * * Description: * - * Convolutional Deep Neural Network Layer * + * Padding Layer * * * * Authors (alphabetical): * * Siddhartha Rao Kamalakara - CERN, Switzerland * @@ -24,8 +24,8 @@ * (http://tmva.sourceforge.net/LICENSE) * **********************************************************************************/ -#ifndef TMVA_CNN_CONVLAYER -#define TMVA_CNN_CONVLAYER +#ifndef TMVA_CNN_PADDINGLAYER +#define TMVA_CNN_PADDINGLAYER #include "TMatrix.h" @@ -139,11 +139,11 @@ TPaddingLayer::~TPaddingLayer() //_________________________________________________________________________________________________ template -auto TReshapeLayer::Forward(std::vector &input, bool /*applyDropout*/) -> void +auto TPaddingLayer::Forward(std::vector &input, bool /*applyDropout*/) -> void { for (size_t i = 0; i < this->GetBatchSize(); i++) { - Architecture_t::ZeroPad2DForward(this->GetOutputAt(i), input[i], fTopPad, fBottomPad, fRightPad, fLeftPad, this->GetOutputHeight(), this->GetOutputWidth()); + Architecture_t::ZeroPad2DForward(this->GetOutputAt(i), input[i], fTopPad, fBottomPad, fLeftPad, fRightPad, this->GetOutputHeight(), this->GetOutputWidth()); } } @@ -155,42 +155,33 @@ auto TPaddingLayer::Backward(std::vector &gradients_ba std::vector & /*inp1*/, std::vector & /*inp2*/) -> void { - // in case of first layer size is zero - do nothing - if (gradients_backward.size() == 0) return; - if (fFlattening) { - size_t size = gradients_backward.size(); - size_t nRows = gradients_backward[0].GetNrows(); - size_t nCols = gradients_backward[0].GetNcols(); - Architecture_t::Deflatten(gradients_backward, this->GetActivationGradientsAt(0), size, nRows, nCols); - } else { - for (size_t i = 0; i < this->GetBatchSize(); i++) { - Architecture_t::Reshape(gradients_backward[i], this->GetActivationGradientsAt(i)); - } - } + Architecture_t::ZeroPad2DBackward(gradients_backward, this->GetActivationGradients(), fTopPad, fBottomPad, fLeftPad, + fRightPad, this->GetOutputHeight(), this->GetOutputWidth(), this->GetBatchSize(), + this->GetDepth()) } //_________________________________________________________________________________________________ template -auto TReshapeLayer::Print() const -> void +auto TPaddingLayer::Print() const -> void { std::cout << " PADDING Layer \t "; std::cout << "Input = ( " << this->GetInputDepth() << " , " << this->GetInputHeight() << " , " << this->GetInputWidth() << " ) "; if (this->GetOutput().size() > 0) { - std::cout << "\tOutput = ( " << this->GetOutput().size() << " , " << this->GetOutput()[0].GetNrows() << " , " << this->GetOutput()[0].GetNcols() << " ) "; + std::cout << "\tOutput = ( " << this->GetOutput().size() << " , " << this->GetOutputHeight() << " , " << this->GetOutputWidth() << " ) "; } std::cout << std::endl; } template -auto TReshapeLayer::AddWeightsXMLTo(void *parent) -> void +auto TPaddingLayer::AddWeightsXMLTo(void *parent) -> void { auto layerxml = gTools().xmlengine().NewChild(parent, 0, "PaddingLayer"); - // write info for reshapelayer - gTools().xmlengine().NewAttr(layerxml, 0, "Depth", gTools().StringFromInt(this->GetDepth())); - gTools().xmlengine().NewAttr(layerxml, 0, "Height", gTools().StringFromInt(this->GetHeight())); - gTools().xmlengine().NewAttr(layerxml, 0, "Width", gTools().StringFromInt(this->GetWidth())); - gTools().xmlengine().NewAttr(layerxml, 0, "Flattening", gTools().StringFromInt(this->isFlattening())); + // write info for padding layer + gTools().xmlengine().NewAttr(layerxml, 0, "Left Pad", gTools().StringFromInt(this->GetLeftPadding())); + gTools().xmlengine().NewAttr(layerxml, 0, "Right Pad", gTools().StringFromInt(this->GetRightPadding())); + gTools().xmlengine().NewAttr(layerxml, 0, "Top Pad", gTools().StringFromInt(this->GetTopPadding())); + gTools().xmlengine().NewAttr(layerxml, 0, "Bottom Pad", gTools().StringFromInt(this->GetBottomPadding())); } diff --git a/tmva/tmva/inc/TMVA/DNN/DeepNet.h b/tmva/tmva/inc/TMVA/DNN/DeepNet.h index 400546ce343f3..213c2391dca42 100644 --- a/tmva/tmva/inc/TMVA/DNN/DeepNet.h +++ b/tmva/tmva/inc/TMVA/DNN/DeepNet.h @@ -14,6 +14,7 @@ * Akshay Vashistha - CERN, Switzerland * * Vladimir Ilievski - CERN, Switzerland * * Saurav Shekhar - CERN, Switzerland * + * Siddhartha Rao Kamalakara - CERN, Switzerland * * * * Copyright (c) 2005-2015: * * CERN, Switzerland * @@ -40,6 +41,7 @@ #include "TMVA/DNN/CNN/ConvLayer.h" #include "TMVA/DNN/CNN/MaxPoolLayer.h" +#include "TMVA/DNN/CNN/PaddingLayer.h" #include "TMVA/DNN/RNN/RNNLayer.h" @@ -167,6 +169,15 @@ class TDeepNet { * the layer is already created. */ void AddReshapeLayer(TReshapeLayer *reshapeLayer); + /*! Function for adding Padding Layer in the Deep Neural Network, with a given + * top, bottom, left and right paddings. It will take every matrix from the + * previous layer and pad it with zeros to a matrix with new dimensions. */ + TPaddingLayer *AddPaddingLayer(size_t topPad, size_t bottomPad, size_t leftPad, bool rightPad); + + /*! Function for adding Padding Layer in the Deep Neural Network, when + * the layer is already created. */ + void AddPaddingLayer(TPaddingLayer *paddingLayer); + #ifdef HAVE_DAE /// DAE functions /*! Function for adding Corruption layer in the Deep Neural Network, * with given number of visibleUnits and hiddenUnits. It corrupts input @@ -545,6 +556,49 @@ void TDeepNet::AddBasicRNNLayer(TBasicRNNLayer +TPaddingLayer *TDeepNet::AddPaddingLayer(size_t topPad, size_t bottomPad, + size_t leftPad, size_t rightPad) +{ + size_t batchSize = this->GetBatchSize(); + size_t inputDepth; + size_t inputHeight; + size_t inputWidth; + size_t height; + size_t width; + size_t outputNSlices = this->GetBatchSize(); + size_t outputNRows; + size_t outputNCols; + + if (fLayers.size() == 0) { + inputDepth = this->GetInputDepth(); + inputHeight = this->GetInputHeight(); + inputWidth = this->GetInputWidth(); + } else { + Layer_t *lastLayer = fLayers.back(); + inputDepth = lastLayer->GetDepth(); + inputHeight = lastLayer->GetHeight(); + inputWidth = lastLayer->GetWidth(); + } + + TPaddingLayer *paddingLayer = new TPaddingLayer( + batchSize, inputDepth, inputHeight, inputWidth, topPad, bottomPad, leftPad, rightPad); + + // But this creates a copy or what? + fLayers.push_back(paddingLayer); + + return paddingLayer; +} + +//______________________________________________________________________________ +template +void TDeepNet::AddPaddingLayer(TPaddingLayer *paddingLayer) +{ + fLayers.push_back(paddingLayer); +} + + //DAE #ifdef HAVE_DAE diff --git a/tmva/tmva/inc/TMVA/MethodDL.h b/tmva/tmva/inc/TMVA/MethodDL.h index 770233101eadd..3a54c1a05bf57 100644 --- a/tmva/tmva/inc/TMVA/MethodDL.h +++ b/tmva/tmva/inc/TMVA/MethodDL.h @@ -126,6 +126,11 @@ class MethodDL : public MethodBase { std::vector> &nets, TString layerString, TString delim); + template + void ParsePaddingLayer(DNN::TDeepNet &deepNet, + std::vector> &nets, TString layerString, + TString delim); + template void ParseRnnLayer(DNN::TDeepNet &deepNet, std::vector> &nets, TString layerString, TString delim); diff --git a/tmva/tmva/src/DNN/Architectures/Cpu/Propagation.cxx b/tmva/tmva/src/DNN/Architectures/Cpu/Propagation.cxx index a0d05171ae010..a5ab8f7442841 100644 --- a/tmva/tmva/src/DNN/Architectures/Cpu/Propagation.cxx +++ b/tmva/tmva/src/DNN/Architectures/Cpu/Propagation.cxx @@ -581,23 +581,54 @@ void TCpu::MaxPoolLayerBackward(std::vector> &activat //______________________________________________________________________________ template -void TCpu::ZeroPad2DForward(TCpuMatrix &A, const TCpuMatrix &B, size_t topPad, size_t bottomPad, size_t leftPad, size_t rightPad) +void TReference::ZeroPad2DForward(TCpuMatrix &A, const TCpuMatrix &B, + size_t topPad, size_t bottomPad, size_t leftPad, + size_t rightPad, size_t outputHeight, size_t outputWidth) { - size_t nColsA = A.GetNcols(); - size_t nColsB = B.GetNcols(); - - for (size_t i = 0; i < A.GetNrows(); i++) { - for (size_t j = 0; j < A.GetNcols(); j++) { - if(iB.GetNrows() && iB.GetNcols() && j(outputHeight-topPad-bottomPad) && row(outputWidth-leftPad-rightPad) && col +void TReference::ZeroPad2DBackward(std::vector> &activationGradientsBackward, + const std::vector> &activationGradients, + size_t topPad, size_t bottomPad, size_t leftPad, + size_t rightPad, size_t outputHeight, size_t outputWidth, + size_t batchSize, size_t depth) +{ + size_t inputHeight = outputHeight - topPad - bottomPad; + size_t inputWidth = outputWidth - leftPad - rightPad; + + for (size_t i = 0; i < batchSize; i++) { + for (size_t j = 0; j < depth; j++) { + + // initialize to zeros + for (size_t t = 0; t < (size_t)activationGradientsBackward[i].GetNcols(); t++) { + size_t idx = outputWidth * topPad + (t/inputWidth) * outputWidth + t%inputWidth + leftPad; + activationGradientsBackward[i][j][t] = activationGradients[i][j][idx]; + } + + } + } +} + + //____________________________________________________________________________ template void TCpu::Reshape(TCpuMatrix &A, const TCpuMatrix &B) diff --git a/tmva/tmva/src/DNN/Architectures/Reference/Propagation.cxx b/tmva/tmva/src/DNN/Architectures/Reference/Propagation.cxx index 6b95d498edd91..4866c753721c4 100644 --- a/tmva/tmva/src/DNN/Architectures/Reference/Propagation.cxx +++ b/tmva/tmva/src/DNN/Architectures/Reference/Propagation.cxx @@ -427,14 +427,20 @@ void TReference::ZeroPad2DForward(TMatrixT &A, const TMatrixT void TReference::ZeroPad2DBackward(std::vector> &activationGradientsBackward, const std::vector> &activationGradients, + size_t topPad, size_t bottomPad, size_t leftPad, + size_t rightPad, size_t outputHeight, size_t outputWidth, size_t batchSize, size_t depth) { + size_t inputHeight = outputHeight - topPad - bottomPad; + size_t inputWidth = outputWidth - leftPad - rightPad; + for (size_t i = 0; i < batchSize; i++) { for (size_t j = 0; j < depth; j++) { // initialize to zeros for (size_t t = 0; t < (size_t)activationGradientsBackward[i].GetNcols(); t++) { - activationGradientsBackward[i][j][t] = activationGradients[i][j][t]; + size_t idx = outputWidth * topPad + (t/inputWidth) * outputWidth + t%inputWidth + leftPad; + activationGradientsBackward[i][j][t] = activationGradients[i][j][idx]; } } diff --git a/tmva/tmva/src/MethodDL.cxx b/tmva/tmva/src/MethodDL.cxx index dac6332e00381..a71c1cca7a821 100644 --- a/tmva/tmva/src/MethodDL.cxx +++ b/tmva/tmva/src/MethodDL.cxx @@ -496,6 +496,8 @@ void MethodDL::CreateDeepNet(DNN::TDeepNet &deepNet, } else if (strLayerType == "LSTM") { Log() << kFATAL << "LSTM Layer is not yet fully implemented" << Endl; //ParseLstmLayer(deepNet, nets, layerString->GetString(), subDelimiter); + } else if (strLayerType == "PADDING") { + ParseRnnLayer(deepNet, nets, layerString->GetString(), subDelimiter); } } } @@ -878,6 +880,59 @@ void MethodDL::ParseLstmLayer(DNN::TDeepNet & /*deepNet } } +//////////////////////////////////////////////////////////////////////////////// +/// Pases the layer string and creates the appropriate padding layer +template +void MethodDL::ParsePaddingLayer(DNN::TDeepNet &deepNet, + std::vector> & /*nets*/, TString layerString, + TString delim) +{ + int topPad = 0; + int bottomPad = 0; + int leftPad = 0; + int rightPad = 0; + + // Split layer details + TObjArray *subStrings = layerString.Tokenize(delim); + TIter nextToken(subStrings); + TObjString *token = (TObjString *)nextToken(); + int idxToken = 0; + + for (; token != nullptr; token = (TObjString *)nextToken()) { + + switch (idxToken) { + case 1: // top padding + { + TString strTopPad(token->GetString()); + topPad = strTopPad.Atoi(); + } break; + case 2: // bottom padding + { + TString strBottomPad(token->GetString()); + bottomPad = strBottomPad.Atoi(); + } break; + case 3: // left padding + { + TString strLeftPad(token->GetString()); + leftPad = strLeftPad.Atoi(); + } break; + case 4: // right padding + { + TString strRightPad(token->GetString()); + rightPad = strRightPad.Atoi(); + } break; + } + ++idxToken; + } + + // Add the padding layer + deepNet.AddPaddingLayer(topPad, bottomPad, leftPad, rightPad); + + // Add the same layer to fNet + if (fBuildNet) fNet->AddPaddingLayer(topPad, bottomPad, leftPad, rightPad); + +} + //////////////////////////////////////////////////////////////////////////////// /// Standard constructor. MethodDL::MethodDL(const TString &jobName, const TString &methodTitle, DataSetInfo &theData, const TString &theOption) From d894b7dbe60cf8c708a1c3619fb521977ae66c84 Mon Sep 17 00:00:00 2001 From: Siddhartha Rao Kamalakara Date: Thu, 26 Jul 2018 22:20:01 +0530 Subject: [PATCH 4/8] Fix build errors --- tmva/tmva/inc/TMVA/DNN/CNN/PaddingLayer.h | 30 ++++++++++++++--------- 1 file changed, 19 insertions(+), 11 deletions(-) diff --git a/tmva/tmva/inc/TMVA/DNN/CNN/PaddingLayer.h b/tmva/tmva/inc/TMVA/DNN/CNN/PaddingLayer.h index 207656df993cf..5788fdf5b2e62 100644 --- a/tmva/tmva/inc/TMVA/DNN/CNN/PaddingLayer.h +++ b/tmva/tmva/inc/TMVA/DNN/CNN/PaddingLayer.h @@ -82,20 +82,26 @@ class TPaddingLayer : public VGeneralLayer std::vector & /*inp1*/, std::vector & /*inp2*/); - /*! Prints the info about the layer. */ - void Print() const; + /*! Writes the information and the weights about the layer in an XML node. */ + virtual void AddWeightsXMLTo(void *parent); - size_t GetTopPadding() const {return fTopPad;} + /*! Read the information and the weights about the layer from XML node. */ + virtual void ReadWeightsFromXML(void *parent); - size_t GetBottomPadding() const {return fBottomPad;} + /*! Prints the info about the layer. */ + void Print() const; - size_t GetLeftPadding() const {return fLeftPad;} + size_t GetTopPadding() const {return fTopPad;} - size_t GetRightPadding() const {return fRightPad;} + size_t GetBottomPadding() const {return fBottomPad;} - size_t GetOutputHeight() const {return outputHeight;} + size_t GetLeftPadding() const {return fLeftPad;} - size_t GetOutputWidth() const {return outputWidth;} + size_t GetRightPadding() const {return fRightPad;} + + size_t GetOutputHeight() const {return outputHeight;} + + size_t GetOutputWidth() const {return outputWidth;} }; @@ -115,7 +121,7 @@ TPaddingLayer::TPaddingLayer(size_t batchSize, size_t inputDepth //_________________________________________________________________________________________________ template -TPaddingLayer::TPaddingLayer(TPadding *layer) +TPaddingLayer::TPaddingLayer(TPaddingLayer *layer) : VGeneralLayer(layer), fTopPad(layer->GetTopPadding()), fBottomPad(layer->GetBottomPadding()), fLeftPad(layer->GetLeftPadding()), fRightPad(layer->GetRightPadding()) { @@ -157,7 +163,7 @@ auto TPaddingLayer::Backward(std::vector &gradients_ba { Architecture_t::ZeroPad2DBackward(gradients_backward, this->GetActivationGradients(), fTopPad, fBottomPad, fLeftPad, fRightPad, this->GetOutputHeight(), this->GetOutputWidth(), this->GetBatchSize(), - this->GetDepth()) + this->GetDepth()); } //_________________________________________________________________________________________________ @@ -205,4 +211,6 @@ size_t TPaddingLayer::calculateDimension(size_t imgHeight, size_ } // namespace DNN -} // namespace TMVA \ No newline at end of file +} // namespace TMVA + +#endif \ No newline at end of file From 7ed053d318c4d2f113b4bd17f26fbab2bd28fb69 Mon Sep 17 00:00:00 2001 From: Siddhartha Rao Kamalakara Date: Fri, 27 Jul 2018 02:06:57 +0530 Subject: [PATCH 5/8] Fix types and build errors --- tmva/tmva/inc/TMVA/DNN/Architectures/Cpu.h | 4 ++-- tmva/tmva/inc/TMVA/DNN/CNN/PaddingLayer.h | 1 + tmva/tmva/inc/TMVA/DNN/DeepNet.h | 2 +- tmva/tmva/src/DNN/Architectures/Cpu/Propagation.cxx | 6 +++--- 4 files changed, 7 insertions(+), 6 deletions(-) diff --git a/tmva/tmva/inc/TMVA/DNN/Architectures/Cpu.h b/tmva/tmva/inc/TMVA/DNN/Architectures/Cpu.h index 127c1654cd56b..e890cf2f7e49f 100644 --- a/tmva/tmva/inc/TMVA/DNN/Architectures/Cpu.h +++ b/tmva/tmva/inc/TMVA/DNN/Architectures/Cpu.h @@ -426,8 +426,8 @@ class TCpu /** Perform the complete backward propagation step in a Zero Padding Layer. The gradients * at the padded positions get discarded. */ - static void ZeroPad2DBackward(std::vector> &activationGradientsBackward, - const std::vector> &activationGradients, + static void ZeroPad2DBackward(std::vector> &activationGradientsBackward, + const std::vector> &activationGradients, size_t topPad, size_t bottomPad, size_t leftPad, size_t rightPad, size_t outputHeight, size_t outputWidth, size_t batchSize, size_t depth); diff --git a/tmva/tmva/inc/TMVA/DNN/CNN/PaddingLayer.h b/tmva/tmva/inc/TMVA/DNN/CNN/PaddingLayer.h index 5788fdf5b2e62..838604fb74e67 100644 --- a/tmva/tmva/inc/TMVA/DNN/CNN/PaddingLayer.h +++ b/tmva/tmva/inc/TMVA/DNN/CNN/PaddingLayer.h @@ -212,5 +212,6 @@ size_t TPaddingLayer::calculateDimension(size_t imgHeight, size_ } // namespace DNN } // namespace TMVA +} #endif \ No newline at end of file diff --git a/tmva/tmva/inc/TMVA/DNN/DeepNet.h b/tmva/tmva/inc/TMVA/DNN/DeepNet.h index 213c2391dca42..e5e01b13529ec 100644 --- a/tmva/tmva/inc/TMVA/DNN/DeepNet.h +++ b/tmva/tmva/inc/TMVA/DNN/DeepNet.h @@ -172,7 +172,7 @@ class TDeepNet { /*! Function for adding Padding Layer in the Deep Neural Network, with a given * top, bottom, left and right paddings. It will take every matrix from the * previous layer and pad it with zeros to a matrix with new dimensions. */ - TPaddingLayer *AddPaddingLayer(size_t topPad, size_t bottomPad, size_t leftPad, bool rightPad); + TPaddingLayer *AddPaddingLayer(size_t topPad, size_t bottomPad, size_t leftPad, size_t rightPad); /*! Function for adding Padding Layer in the Deep Neural Network, when * the layer is already created. */ diff --git a/tmva/tmva/src/DNN/Architectures/Cpu/Propagation.cxx b/tmva/tmva/src/DNN/Architectures/Cpu/Propagation.cxx index a5ab8f7442841..6f9ea67fb4fa0 100644 --- a/tmva/tmva/src/DNN/Architectures/Cpu/Propagation.cxx +++ b/tmva/tmva/src/DNN/Architectures/Cpu/Propagation.cxx @@ -581,7 +581,7 @@ void TCpu::MaxPoolLayerBackward(std::vector> &activat //______________________________________________________________________________ template -void TReference::ZeroPad2DForward(TCpuMatrix &A, const TCpuMatrix &B, +void TCpu::ZeroPad2DForward(TCpuMatrix &A, const TCpuMatrix &B, size_t topPad, size_t bottomPad, size_t leftPad, size_t rightPad, size_t outputHeight, size_t outputWidth) { @@ -606,7 +606,7 @@ void TReference::ZeroPad2DForward(TCpuMatrix &A, const TCpuMatri //______________________________________________________________________________ template -void TReference::ZeroPad2DBackward(std::vector> &activationGradientsBackward, +void TCpu::ZeroPad2DBackward(std::vector> &activationGradientsBackward, const std::vector> &activationGradients, size_t topPad, size_t bottomPad, size_t leftPad, size_t rightPad, size_t outputHeight, size_t outputWidth, @@ -621,7 +621,7 @@ void TReference::ZeroPad2DBackward(std::vector> &acti // initialize to zeros for (size_t t = 0; t < (size_t)activationGradientsBackward[i].GetNcols(); t++) { size_t idx = outputWidth * topPad + (t/inputWidth) * outputWidth + t%inputWidth + leftPad; - activationGradientsBackward[i][j][t] = activationGradients[i][j][idx]; + activationGradientsBackward[i](j, t) = activationGradients[i](j, idx); } } From cd04501e9fdfff0edc53e7844f7f27966755fc18 Mon Sep 17 00:00:00 2001 From: Siddhartha Rao Kamalakara Date: Fri, 3 Aug 2018 02:14:15 +0530 Subject: [PATCH 6/8] Fix Padding Layer bugs --- tmva/tmva/inc/TMVA/DNN/CNN/PaddingLayer.h | 15 ++++++++------- tmva/tmva/inc/TMVA/DNN/DeepNet.h | 7 ++++++- tmva/tmva/src/MethodDL.cxx | 2 +- 3 files changed, 15 insertions(+), 9 deletions(-) diff --git a/tmva/tmva/inc/TMVA/DNN/CNN/PaddingLayer.h b/tmva/tmva/inc/TMVA/DNN/CNN/PaddingLayer.h index 838604fb74e67..143fece3b07cb 100644 --- a/tmva/tmva/inc/TMVA/DNN/CNN/PaddingLayer.h +++ b/tmva/tmva/inc/TMVA/DNN/CNN/PaddingLayer.h @@ -59,7 +59,7 @@ class TPaddingLayer : public VGeneralLayer public: /*! Constructor. */ - TPaddingLayer(size_t BatchSize, size_t inputDepth, size_t inputHeight, size_t inputWidth, size_t TopPad, size_t BottomPad, size_t LeftPad, size_t RightPad); + TPaddingLayer(size_t BatchSize, size_t inputDepth, size_t inputHeight, size_t inputWidth, size_t depth, size_t height, size_t width, size_t TopPad, size_t BottomPad, size_t LeftPad, size_t RightPad); /*! Copy the conv layer provided as a pointer */ TPaddingLayer(TPaddingLayer *layer); @@ -108,8 +108,9 @@ class TPaddingLayer : public VGeneralLayer template TPaddingLayer::TPaddingLayer(size_t batchSize, size_t inputDepth, size_t inputHeight, size_t inputWidth, + size_t depth, size_t height, size_t width, size_t topPad, size_t bottomPad, size_t leftPad, size_t rightPad) - : VGeneralLayer(batchSize, inputDepth, inputHeight, inputWidth, 0, 0, 0, 0, 0, 0, 0, 0, + : VGeneralLayer(batchSize, inputDepth, inputHeight, inputWidth, depth, height, width, 0, 0, 0, 0, 0, 0, batchSize, inputDepth, calculateDimension(inputHeight, inputWidth, leftPad, rightPad, topPad, bottomPad), EInitialization::kZero), fTopPad(topPad), fBottomPad(bottomPad), fLeftPad(leftPad), fRightPad(rightPad) { @@ -173,7 +174,7 @@ auto TPaddingLayer::Print() const -> void std::cout << " PADDING Layer \t "; std::cout << "Input = ( " << this->GetInputDepth() << " , " << this->GetInputHeight() << " , " << this->GetInputWidth() << " ) "; if (this->GetOutput().size() > 0) { - std::cout << "\tOutput = ( " << this->GetOutput().size() << " , " << this->GetOutputHeight() << " , " << this->GetOutputWidth() << " ) "; + std::cout << "\tOutput = ( " << this->GetOutput().size() << " , " << this->GetOutput()[0].GetNrows() << " , " << this->GetOutput()[0].GetNcols() << " ) "; } std::cout << std::endl; } @@ -184,10 +185,10 @@ auto TPaddingLayer::AddWeightsXMLTo(void *parent) -> void auto layerxml = gTools().xmlengine().NewChild(parent, 0, "PaddingLayer"); // write info for padding layer - gTools().xmlengine().NewAttr(layerxml, 0, "Left Pad", gTools().StringFromInt(this->GetLeftPadding())); - gTools().xmlengine().NewAttr(layerxml, 0, "Right Pad", gTools().StringFromInt(this->GetRightPadding())); - gTools().xmlengine().NewAttr(layerxml, 0, "Top Pad", gTools().StringFromInt(this->GetTopPadding())); - gTools().xmlengine().NewAttr(layerxml, 0, "Bottom Pad", gTools().StringFromInt(this->GetBottomPadding())); + gTools().xmlengine().NewAttr(layerxml, 0, "LeftPad", gTools().StringFromInt(this->GetLeftPadding())); + gTools().xmlengine().NewAttr(layerxml, 0, "RightPad", gTools().StringFromInt(this->GetRightPadding())); + gTools().xmlengine().NewAttr(layerxml, 0, "TopPad", gTools().StringFromInt(this->GetTopPadding())); + gTools().xmlengine().NewAttr(layerxml, 0, "BottomPad", gTools().StringFromInt(this->GetBottomPadding())); } diff --git a/tmva/tmva/inc/TMVA/DNN/DeepNet.h b/tmva/tmva/inc/TMVA/DNN/DeepNet.h index e5e01b13529ec..0a32de90b7356 100644 --- a/tmva/tmva/inc/TMVA/DNN/DeepNet.h +++ b/tmva/tmva/inc/TMVA/DNN/DeepNet.h @@ -565,6 +565,7 @@ TPaddingLayer *TDeepNet::AddPaddingLaye size_t inputDepth; size_t inputHeight; size_t inputWidth; + size_t depth; size_t height; size_t width; size_t outputNSlices = this->GetBatchSize(); @@ -582,8 +583,12 @@ TPaddingLayer *TDeepNet::AddPaddingLaye inputWidth = lastLayer->GetWidth(); } + depth = inputDepth; + height = inputHeight + topPad + bottomPad; + width = inputWidth + leftPad + rightPad; + TPaddingLayer *paddingLayer = new TPaddingLayer( - batchSize, inputDepth, inputHeight, inputWidth, topPad, bottomPad, leftPad, rightPad); + batchSize, inputDepth, inputHeight, inputWidth, depth, height, width, topPad, bottomPad, leftPad, rightPad); // But this creates a copy or what? fLayers.push_back(paddingLayer); diff --git a/tmva/tmva/src/MethodDL.cxx b/tmva/tmva/src/MethodDL.cxx index a71c1cca7a821..483d272a46512 100644 --- a/tmva/tmva/src/MethodDL.cxx +++ b/tmva/tmva/src/MethodDL.cxx @@ -497,7 +497,7 @@ void MethodDL::CreateDeepNet(DNN::TDeepNet &deepNet, Log() << kFATAL << "LSTM Layer is not yet fully implemented" << Endl; //ParseLstmLayer(deepNet, nets, layerString->GetString(), subDelimiter); } else if (strLayerType == "PADDING") { - ParseRnnLayer(deepNet, nets, layerString->GetString(), subDelimiter); + ParsePaddingLayer(deepNet, nets, layerString->GetString(), subDelimiter); } } } From 9a39727b29c3d40d48d53aac90d2bb364cd424cb Mon Sep 17 00:00:00 2001 From: Siddhartha Rao Kamalakara Date: Mon, 6 Aug 2018 23:04:03 +0530 Subject: [PATCH 7/8] Fix XML parsing errors --- tmva/tmva/src/MethodDL.cxx | 12 ++++++++++++ tmva/tmva/test/DNN/CNN/TestMethodDL.cxx | 2 +- tmva/tmva/test/DNN/CNN/TestMethodDL.h | 2 +- 3 files changed, 14 insertions(+), 2 deletions(-) diff --git a/tmva/tmva/src/MethodDL.cxx b/tmva/tmva/src/MethodDL.cxx index 483d272a46512..2a1db5717236d 100644 --- a/tmva/tmva/src/MethodDL.cxx +++ b/tmva/tmva/src/MethodDL.cxx @@ -1693,6 +1693,18 @@ void MethodDL::ReadWeightsFromXML(void * rootXML) fNet->AddBasicRNNLayer(stateSize, inputSize, timeSteps, rememberState); } + else if (layerName == "PaddingLayer") { + + // read reshape layer info + size_t leftPad, rightPad, topPad, bottomPad = 0; + gTools().ReadAttr(layerXML, "LeftPad", leftPad); + gTools().ReadAttr(layerXML, "RightPad", rightPad); + gTools().ReadAttr(layerXML, "TopPad", topPad); + gTools().ReadAttr(layerXML, "BottomPad", bottomPad); + + fNet->AddPaddingLayer(topPad, bottomPad, leftPad, rightPad); + + } // read eventually weights and biases diff --git a/tmva/tmva/test/DNN/CNN/TestMethodDL.cxx b/tmva/tmva/test/DNN/CNN/TestMethodDL.cxx index 678bd4aaff36b..d6d89debf546c 100644 --- a/tmva/tmva/test/DNN/CNN/TestMethodDL.cxx +++ b/tmva/tmva/test/DNN/CNN/TestMethodDL.cxx @@ -33,7 +33,7 @@ int main() TString archCPU = "CPU"; - testMethodDL_DNN(archCPU); + //testMethodDL_DNN(archCPU); testMethodDL_CNN(archCPU); } diff --git a/tmva/tmva/test/DNN/CNN/TestMethodDL.h b/tmva/tmva/test/DNN/CNN/TestMethodDL.h index 1cac008458e8b..575c4ed1c7e0d 100644 --- a/tmva/tmva/test/DNN/CNN/TestMethodDL.h +++ b/tmva/tmva/test/DNN/CNN/TestMethodDL.h @@ -101,7 +101,7 @@ void testMethodDL_CNN(TString architectureStr) TString batchLayoutString("BatchLayout=256|1|64"); // General layout. - TString layoutString("Layout=CONV|6|3|3|1|1|0|0|TANH,MAXPOOL|2|2|2|2,RESHAPE|FLAT,DENSE|10|TANH," + TString layoutString("Layout=CONV|6|3|3|1|1|0|0|TANH,PADDING|0|0|0|0,MAXPOOL|2|2|2|2,RESHAPE|FLAT,DENSE|10|TANH," "DENSE|2|LINEAR"); // Training strategies. From 53a99e2c7c9d26d6588d9fed14831672317657d4 Mon Sep 17 00:00:00 2001 From: Siddhartha Rao Kamalakara Date: Tue, 7 Aug 2018 00:55:07 +0530 Subject: [PATCH 8/8] Change layer to ZeroPadding2D --- tmva/tmva/inc/TMVA/DNN/CNN/PaddingLayer.h | 38 +++++++++++------------ tmva/tmva/inc/TMVA/DNN/DeepNet.h | 10 +++--- tmva/tmva/inc/TMVA/MethodDL.h | 2 +- tmva/tmva/src/MethodDL.cxx | 16 +++++----- tmva/tmva/test/DNN/CNN/TestMethodDL.h | 2 +- 5 files changed, 35 insertions(+), 33 deletions(-) diff --git a/tmva/tmva/inc/TMVA/DNN/CNN/PaddingLayer.h b/tmva/tmva/inc/TMVA/DNN/CNN/PaddingLayer.h index 143fece3b07cb..bf9ff252310c0 100644 --- a/tmva/tmva/inc/TMVA/DNN/CNN/PaddingLayer.h +++ b/tmva/tmva/inc/TMVA/DNN/CNN/PaddingLayer.h @@ -24,8 +24,8 @@ * (http://tmva.sourceforge.net/LICENSE) * **********************************************************************************/ -#ifndef TMVA_CNN_PADDINGLAYER -#define TMVA_CNN_PADDINGLAYER +#ifndef TMVA_CNN_PADDINGLAYER2D +#define TMVA_CNN_PADDINGLAYER2D #include "TMatrix.h" @@ -40,7 +40,7 @@ namespace DNN { namespace CNN { template -class TPaddingLayer : public VGeneralLayer +class TPaddingLayer2D : public VGeneralLayer { public: @@ -59,16 +59,16 @@ class TPaddingLayer : public VGeneralLayer public: /*! Constructor. */ - TPaddingLayer(size_t BatchSize, size_t inputDepth, size_t inputHeight, size_t inputWidth, size_t depth, size_t height, size_t width, size_t TopPad, size_t BottomPad, size_t LeftPad, size_t RightPad); + TPaddingLayer2D(size_t BatchSize, size_t inputDepth, size_t inputHeight, size_t inputWidth, size_t depth, size_t height, size_t width, size_t TopPad, size_t BottomPad, size_t LeftPad, size_t RightPad); /*! Copy the conv layer provided as a pointer */ - TPaddingLayer(TPaddingLayer *layer); + TPaddingLayer2D(TPaddingLayer2D *layer); /*! Copy constructor. */ - TPaddingLayer(const TPaddingLayer &); + TPaddingLayer2D(const TPaddingLayer2D &); /*! Destructor. */ - ~TPaddingLayer(); + ~TPaddingLayer2D(); /*! Pads the input array with the dimensions given by * the user. Padding is done in two dimensions for each @@ -107,7 +107,7 @@ class TPaddingLayer : public VGeneralLayer }; template -TPaddingLayer::TPaddingLayer(size_t batchSize, size_t inputDepth, size_t inputHeight, size_t inputWidth, +TPaddingLayer2D::TPaddingLayer2D(size_t batchSize, size_t inputDepth, size_t inputHeight, size_t inputWidth, size_t depth, size_t height, size_t width, size_t topPad, size_t bottomPad, size_t leftPad, size_t rightPad) : VGeneralLayer(batchSize, inputDepth, inputHeight, inputWidth, depth, height, width, 0, 0, 0, 0, 0, @@ -116,13 +116,13 @@ TPaddingLayer::TPaddingLayer(size_t batchSize, size_t inputDepth { this->outputHeight = inputHeight + topPad + bottomPad; - this->outputWidth = inputWidth + leftPad + rightPad; + this->outputWidth = inputWidth + leftPad + rightPad; } //_________________________________________________________________________________________________ template -TPaddingLayer::TPaddingLayer(TPaddingLayer *layer) +TPaddingLayer2D::TPaddingLayer2D(TPaddingLayer2D *layer) : VGeneralLayer(layer), fTopPad(layer->GetTopPadding()), fBottomPad(layer->GetBottomPadding()), fLeftPad(layer->GetLeftPadding()), fRightPad(layer->GetRightPadding()) { @@ -130,7 +130,7 @@ TPaddingLayer::TPaddingLayer(TPaddingLayer *laye //_________________________________________________________________________________________________ template -TPaddingLayer::TPaddingLayer(const TPaddingLayer &layer) +TPaddingLayer2D::TPaddingLayer2D(const TPaddingLayer2D &layer) : VGeneralLayer(layer), fTopPad(layer.fTopPad), fBottomPad(layer.fBottomPad), fLeftPad(layer.fLeftPad), fRightPad(layer.fRightPad) { @@ -139,14 +139,14 @@ TPaddingLayer::TPaddingLayer(const TPaddingLayer &layer) //_________________________________________________________________________________________________ template -TPaddingLayer::~TPaddingLayer() +TPaddingLayer2D::~TPaddingLayer2D() { // Nothing to do here. } //_________________________________________________________________________________________________ template -auto TPaddingLayer::Forward(std::vector &input, bool /*applyDropout*/) -> void +auto TPaddingLayer2D::Forward(std::vector &input, bool /*applyDropout*/) -> void { for (size_t i = 0; i < this->GetBatchSize(); i++) { @@ -157,7 +157,7 @@ auto TPaddingLayer::Forward(std::vector &input, bool / //_________________________________________________________________________________________________ template -auto TPaddingLayer::Backward(std::vector &gradients_backward, +auto TPaddingLayer2D::Backward(std::vector &gradients_backward, const std::vector & /*activations_backward*/, std::vector & /*inp1*/, std::vector & /*inp2*/) -> void @@ -169,7 +169,7 @@ auto TPaddingLayer::Backward(std::vector &gradients_ba //_________________________________________________________________________________________________ template -auto TPaddingLayer::Print() const -> void +auto TPaddingLayer2D::Print() const -> void { std::cout << " PADDING Layer \t "; std::cout << "Input = ( " << this->GetInputDepth() << " , " << this->GetInputHeight() << " , " << this->GetInputWidth() << " ) "; @@ -180,9 +180,9 @@ auto TPaddingLayer::Print() const -> void } template -auto TPaddingLayer::AddWeightsXMLTo(void *parent) -> void +auto TPaddingLayer2D::AddWeightsXMLTo(void *parent) -> void { - auto layerxml = gTools().xmlengine().NewChild(parent, 0, "PaddingLayer"); + auto layerxml = gTools().xmlengine().NewChild(parent, 0, "PaddingLayer2D"); // write info for padding layer gTools().xmlengine().NewAttr(layerxml, 0, "LeftPad", gTools().StringFromInt(this->GetLeftPadding())); @@ -195,14 +195,14 @@ auto TPaddingLayer::AddWeightsXMLTo(void *parent) -> void //______________________________________________________________________________ template -void TPaddingLayer::ReadWeightsFromXML(void * /*parent*/) +void TPaddingLayer2D::ReadWeightsFromXML(void * /*parent*/) { // no info to read } template -size_t TPaddingLayer::calculateDimension(size_t imgHeight, size_t imgWidth, size_t pad_left, size_t pad_right, size_t pad_top, size_t pad_bottom){ +size_t TPaddingLayer2D::calculateDimension(size_t imgHeight, size_t imgWidth, size_t pad_left, size_t pad_right, size_t pad_top, size_t pad_bottom){ size_t height = imgHeight + pad_top + pad_bottom; size_t width = imgWidth + pad_left + pad_right; diff --git a/tmva/tmva/inc/TMVA/DNN/DeepNet.h b/tmva/tmva/inc/TMVA/DNN/DeepNet.h index 0a32de90b7356..51bb8a4a255dc 100644 --- a/tmva/tmva/inc/TMVA/DNN/DeepNet.h +++ b/tmva/tmva/inc/TMVA/DNN/DeepNet.h @@ -172,11 +172,11 @@ class TDeepNet { /*! Function for adding Padding Layer in the Deep Neural Network, with a given * top, bottom, left and right paddings. It will take every matrix from the * previous layer and pad it with zeros to a matrix with new dimensions. */ - TPaddingLayer *AddPaddingLayer(size_t topPad, size_t bottomPad, size_t leftPad, size_t rightPad); + TPaddingLayer2D *AddPaddingLayer2D(size_t topPad, size_t bottomPad, size_t leftPad, size_t rightPad); /*! Function for adding Padding Layer in the Deep Neural Network, when * the layer is already created. */ - void AddPaddingLayer(TPaddingLayer *paddingLayer); + void AddPaddingLayer2D(TPaddingLayer2D *paddingLayer); #ifdef HAVE_DAE /// DAE functions /*! Function for adding Corruption layer in the Deep Neural Network, @@ -558,7 +558,7 @@ void TDeepNet::AddBasicRNNLayer(TBasicRNNLayer -TPaddingLayer *TDeepNet::AddPaddingLayer(size_t topPad, size_t bottomPad, +TPaddingLayer2D *TDeepNet::AddPaddingLayer2D(size_t topPad, size_t bottomPad, size_t leftPad, size_t rightPad) { size_t batchSize = this->GetBatchSize(); @@ -587,7 +587,7 @@ TPaddingLayer *TDeepNet::AddPaddingLaye height = inputHeight + topPad + bottomPad; width = inputWidth + leftPad + rightPad; - TPaddingLayer *paddingLayer = new TPaddingLayer( + TPaddingLayer2D *paddingLayer = new TPaddingLayer2D( batchSize, inputDepth, inputHeight, inputWidth, depth, height, width, topPad, bottomPad, leftPad, rightPad); // But this creates a copy or what? @@ -598,7 +598,7 @@ TPaddingLayer *TDeepNet::AddPaddingLaye //______________________________________________________________________________ template -void TDeepNet::AddPaddingLayer(TPaddingLayer *paddingLayer) +void TDeepNet::AddPaddingLayer2D(TPaddingLayer2D *paddingLayer) { fLayers.push_back(paddingLayer); } diff --git a/tmva/tmva/inc/TMVA/MethodDL.h b/tmva/tmva/inc/TMVA/MethodDL.h index 3a54c1a05bf57..e49f6cf7e7fe6 100644 --- a/tmva/tmva/inc/TMVA/MethodDL.h +++ b/tmva/tmva/inc/TMVA/MethodDL.h @@ -127,7 +127,7 @@ class MethodDL : public MethodBase { TString delim); template - void ParsePaddingLayer(DNN::TDeepNet &deepNet, + void ParsePaddingLayer2D(DNN::TDeepNet &deepNet, std::vector> &nets, TString layerString, TString delim); diff --git a/tmva/tmva/src/MethodDL.cxx b/tmva/tmva/src/MethodDL.cxx index 2a1db5717236d..070027c74f5df 100644 --- a/tmva/tmva/src/MethodDL.cxx +++ b/tmva/tmva/src/MethodDL.cxx @@ -496,8 +496,8 @@ void MethodDL::CreateDeepNet(DNN::TDeepNet &deepNet, } else if (strLayerType == "LSTM") { Log() << kFATAL << "LSTM Layer is not yet fully implemented" << Endl; //ParseLstmLayer(deepNet, nets, layerString->GetString(), subDelimiter); - } else if (strLayerType == "PADDING") { - ParsePaddingLayer(deepNet, nets, layerString->GetString(), subDelimiter); + } else if (strLayerType == "PADDING2D") { + ParsePaddingLayer2D(deepNet, nets, layerString->GetString(), subDelimiter); } } } @@ -883,7 +883,7 @@ void MethodDL::ParseLstmLayer(DNN::TDeepNet & /*deepNet //////////////////////////////////////////////////////////////////////////////// /// Pases the layer string and creates the appropriate padding layer template -void MethodDL::ParsePaddingLayer(DNN::TDeepNet &deepNet, +void MethodDL::ParsePaddingLayer2D(DNN::TDeepNet &deepNet, std::vector> & /*nets*/, TString layerString, TString delim) { @@ -892,6 +892,8 @@ void MethodDL::ParsePaddingLayer(DNN::TDeepNet &deepNet int leftPad = 0; int rightPad = 0; + //layout expected: topPad|bottomPad|leftPad|rightPad + // Split layer details TObjArray *subStrings = layerString.Tokenize(delim); TIter nextToken(subStrings); @@ -926,10 +928,10 @@ void MethodDL::ParsePaddingLayer(DNN::TDeepNet &deepNet } // Add the padding layer - deepNet.AddPaddingLayer(topPad, bottomPad, leftPad, rightPad); + deepNet.AddPaddingLayer2D(topPad, bottomPad, leftPad, rightPad); // Add the same layer to fNet - if (fBuildNet) fNet->AddPaddingLayer(topPad, bottomPad, leftPad, rightPad); + if (fBuildNet) fNet->AddPaddingLayer2D(topPad, bottomPad, leftPad, rightPad); } @@ -1693,7 +1695,7 @@ void MethodDL::ReadWeightsFromXML(void * rootXML) fNet->AddBasicRNNLayer(stateSize, inputSize, timeSteps, rememberState); } - else if (layerName == "PaddingLayer") { + else if (layerName == "PaddingLayer2D") { // read reshape layer info size_t leftPad, rightPad, topPad, bottomPad = 0; @@ -1702,7 +1704,7 @@ void MethodDL::ReadWeightsFromXML(void * rootXML) gTools().ReadAttr(layerXML, "TopPad", topPad); gTools().ReadAttr(layerXML, "BottomPad", bottomPad); - fNet->AddPaddingLayer(topPad, bottomPad, leftPad, rightPad); + fNet->AddPaddingLayer2D(topPad, bottomPad, leftPad, rightPad); } diff --git a/tmva/tmva/test/DNN/CNN/TestMethodDL.h b/tmva/tmva/test/DNN/CNN/TestMethodDL.h index 575c4ed1c7e0d..f79c99fd617eb 100644 --- a/tmva/tmva/test/DNN/CNN/TestMethodDL.h +++ b/tmva/tmva/test/DNN/CNN/TestMethodDL.h @@ -101,7 +101,7 @@ void testMethodDL_CNN(TString architectureStr) TString batchLayoutString("BatchLayout=256|1|64"); // General layout. - TString layoutString("Layout=CONV|6|3|3|1|1|0|0|TANH,PADDING|0|0|0|0,MAXPOOL|2|2|2|2,RESHAPE|FLAT,DENSE|10|TANH," + TString layoutString("Layout=CONV|6|3|3|1|1|0|0|TANH,PADDING2D|0|0|0|0,MAXPOOL|2|2|2|2,RESHAPE|FLAT,DENSE|10|TANH," "DENSE|2|LINEAR"); // Training strategies.