Skip to content

[WIP][GSoC] CNN3D and MaxPool3D implementation for GSoC 2020 #6263

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 4 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
73 changes: 70 additions & 3 deletions tmva/tmva/inc/TMVA/DNN/Architectures/Cpu.h
Original file line number Diff line number Diff line change
Expand Up @@ -20,11 +20,14 @@

#include "TMVA/DNN/Functions.h"
#include "TMVA/DNN/CNN/ContextHandles.h"
//#include "TMVA/DNN/CNN/Descriptors.h"
#include "TMVA/DNN/CNN_3D/ContextHandles.h"
#include "TMVA/DNN/GeneralLayer.h"
#include "TMVA/DNN/BatchNormLayer.h"
#include "TMVA/DNN/CNN/ConvLayer.h"
#include "TMVA/DNN/CNN/MaxPoolLayer.h"
#include "TMVA/DNN/CNN_3D/Conv3DLayer.h"
#include "TMVA/DNN/CNN_3D/MaxPool3DLayer.h"

#include "TMVA/DNN/RNN/RNNLayer.h"

#include "TMVA/DNN/Architectures/Cpu/CpuBuffer.h"
Expand Down Expand Up @@ -517,6 +520,10 @@ class TCpu
static void Im2col(Matrix_t &A, const Matrix_t &B, size_t imgHeight, size_t imgWidth, size_t fltHeight,
size_t fltWidth, size_t strideRows, size_t strideCols, size_t zeroPaddingHeight,
size_t zeroPaddingWidth);
//____________________________________________________________________________
static void Im2col3D(Matrix_t &A, const Matrix_t &B, size_t imgHeight, size_t imgWidth, size_t imgDepth,
size_t fltHeight, size_t fltWidth, size_t fltDepth, size_t strideRows, size_t strideCols, size_t strideDepth,
size_t zeroPaddingHeight, size_t zeroPaddingWidth, size_t zeroPaddingDepth);

static void Im2colIndices(std::vector<int> &V, const Matrix_t &B, size_t nLocalViews, size_t imgHeight,
size_t imgWidth, size_t fltHeight, size_t fltWidth, size_t strideRows, size_t strideCols,
Expand All @@ -528,6 +535,9 @@ class TCpu
static void RotateWeights(Matrix_t &A, const Matrix_t &B, size_t filterDepth, size_t filterHeight,
size_t filterWidth, size_t numFilters);

static void RotateWeights3D(Matrix_t &A, const Matrix_t &B, size_t filterDepth,
size_t filterHeight, size_t filterWidth, size_t numFilters, size_t input4D);

/** Add the biases in the Convolutional Layer. */
static void AddConvBiases(Matrix_t &output, const Matrix_t &biases);
///@}
Expand All @@ -543,6 +553,15 @@ class TCpu
ConvWorkspace_t & /*workspace*/); // Empty struct for cuda architecture
// void * cudnnWorkspace = nullptr); // Remains nullptr for cuda architecture

static void Conv3DLayerForward(Tensor_t & output,
Tensor_t & inputActivationFunc,
const Tensor_t &input,
const Matrix_t &weights, const Matrix_t & biases,
const DNN::CNN_3D::TConv3DParams & params, EActivationFunction activFunc,
Tensor_t & /* */,
const ConvDescriptors_t & /*descriptors*/,
ConvWorkspace_t & /*workspace*/);

/** @name Backward Propagation in Convolutional Layer
*/
///@{
Expand Down Expand Up @@ -582,6 +601,34 @@ class TCpu
* layer */
static void CalculateConvBiasGradients(Matrix_t &biasGradients, const Tensor_t &df, size_t batchSize, size_t depth,
size_t nLocalViews);


static void Conv3DLayerBackward(Tensor_t &activationGradientsBackward,
Matrix_t &weightGradients, Matrix_t &biasGradients,
Tensor_t &inputActivationFunc,
Tensor_t &activationGradients,
const Matrix_t &weights,
const Tensor_t &activationsBackward,
const Tensor_t & outputTensor,
EActivationFunction activFunc,
const ConvDescriptors_t & /*descriptors*/,
ConvWorkspace_t & /*workspace*/,
const DNN::CNN_3D::TConv3DParams & params);

static void CalculateConv3DActivationGradients(Tensor_t &activationGradientsBackward,
const Tensor_t &df,
const Matrix_t &weights,
const DNN::CNN_3D::TConv3DParams & params);

static void CalculateConv3DWeightGradients(Matrix_t &weightGradients,
const Tensor_t &df,
const Tensor_t &activationsBackward,
const DNN::CNN_3D::TConv3DParams & params);


static void CalculateConv3DBiasGradients(Matrix_t &biasGradients, const Tensor_t &df,
const DNN::CNN_3D::TConv3DParams & params);

///@}

//____________________________________________________________________________
Expand All @@ -599,6 +646,12 @@ class TCpu
PoolingWorkspace_t & /*workspace*/, size_t imgHeight, size_t imgWidth, size_t fltHeight,
size_t fltWidth, size_t strideRows, size_t strideCols);

static void Downsample3D(Tensor_t &tA, Tensor_t &tB, const Tensor_t &tC,
const PoolingDescriptors_t & /*descriptors*/,
PoolingWorkspace_t & /*workspace*/,
size_t imgHeight, size_t imgWidth, size_t imgDepth, size_t fltHeight, size_t fltWidth, size_t fltDepth, size_t strideRows,
size_t strideCols, size_t strideDepth);

///@}

/** @name Backward Propagation in Max Pooling Layer
Expand All @@ -614,6 +667,22 @@ class TCpu
size_t fltHeight, size_t fltWidth, size_t strideRows, size_t strideCols,
size_t nLocalViews);


static void MaxPoolLayer3DBackward(Tensor_t &activationGradientsBackward,
const Tensor_t &activationGradients,
const Tensor_t &indexMatrix,
const Tensor_t & /*inputActivation*/,
const Tensor_t & /*outputTensor*/,
const PoolingDescriptors_t & /*descriptors*/,
PoolingWorkspace_t & /*workspace*/,
size_t /* imgHeight */,
size_t /* imgWidth */,
size_t /* fltHeight */,
size_t /* fltWidth */,
size_t /* strideRows */,
size_t /* strideCols */,
size_t nLocalViews);

//// Recurrent Network Functions

/** Backward pass for Recurrent Networks */
Expand Down Expand Up @@ -906,8 +975,6 @@ void TCpu<AReal>::PrintTensor(const typename TCpu<AReal>::Tensor_t & A, const st
}




} // namespace DNN
} // namespace TMVA

Expand Down
8 changes: 8 additions & 0 deletions tmva/tmva/inc/TMVA/DNN/Architectures/Cuda.h
Original file line number Diff line number Diff line change
Expand Up @@ -623,6 +623,14 @@ class TCuda
size_t imgHeight, size_t imgWidth, size_t fltHeight,
size_t fltWidth, size_t strideRows, size_t strideCols);

static void Downsample3D(Tensor_t & /* tA */, Tensor_t & /* tB */, const Tensor_t & /* tC */,
const PoolingDescriptors_t & /*descriptors*/, PoolingWorkspace_t & /*workspace*/,
size_t /* imgHeight */, size_t /* imgWidth */, size_t /* imgDepth */,
size_t /* fltHeight */, size_t /* fltWidth */, size_t /* fltDepth */,
size_t /* strideRows */, size_t /* strideCols */, size_t /* strideDepth */)
{
}

///@}

/** @name Backward Propagation in Max Pooling Layer
Expand Down
28 changes: 28 additions & 0 deletions tmva/tmva/inc/TMVA/DNN/Architectures/TCudnn.h
Original file line number Diff line number Diff line change
Expand Up @@ -26,9 +26,12 @@

#include "TMVA/DNN/Functions.h"
#include "TMVA/DNN/CNN/ContextHandles.h"
#include "TMVA/DNN/CNN_3D/ContextHandles.h"
//#include "TMVA/DNN/CNN/Descriptors.h"
#include "TMVA/DNN/BatchNormLayer.h"
#include "TMVA/DNN/CNN/ConvLayer.h"
#include "TMVA/DNN/CNN_3D/Conv3DLayer.h"
#include "TMVA/DNN/CNN_3D/MaxPool3DLayer.h"
#include "TMVA/DNN/CNN/MaxPoolLayer.h"
#include "TMVA/DNN/RNN/RNNLayer.h"
#include "TMVA/DNN/RNN/LSTMLayer.h"
Expand Down Expand Up @@ -576,6 +579,11 @@ class TCudnn
const DNN::CNN::TConvParams &params, EActivationFunction activFunc,
Tensor_t & /* inputPrime */, const ConvDescriptors_t &descriptors,
ConvWorkspace_t &workspace);

static void Conv3DLayerForward(Tensor_t &/* output */, Tensor_t &/* inputActivationFunc */, const Tensor_t &/* input */, const Matrix_t &/* weights */,
const Matrix_t &/* biases */, const DNN::CNN_3D::TConv3DParams &/* params */, EActivationFunction /* activFunc */,
Tensor_t & /* */, const ConvDescriptors_t & /*descriptors*/, ConvWorkspace_t & /*workspace*/) {}

// const AFloat alpha = 1,
// const AFloat beta = 1);

Expand All @@ -600,6 +608,14 @@ class TCudnn
size_t /*width*/, size_t /*filterDepth*/, size_t /*filterHeight*/,
size_t /*filterWidth*/, size_t /*nLocalViews*/);

static void Conv3DLayerBackward(Tensor_t &/* activationGradientsBackward */, Matrix_t &/* weightGradients */,
Matrix_t &/* biasGradients */, Tensor_t &/* inputActivationFunc */,
Tensor_t &/* activationGradients */, const Matrix_t &/* weights */,
const Tensor_t &/* activationsBackward */, const Tensor_t &/* outputTensor */,
EActivationFunction /* activFunc */, const ConvDescriptors_t & /*descriptors*/,
ConvWorkspace_t & /*workspace*/, const DNN::CNN_3D::TConv3DParams &/* params */)
{}

///@}

//____________________________________________________________________________
Expand All @@ -617,6 +633,11 @@ class TCudnn
PoolingWorkspace_t &workspace, size_t imgHeight, size_t imgWidth, size_t fltHeight,
size_t fltWidth, size_t strideRows, size_t strideCols);

static void Downsample3D(Tensor_t &/* tA */, Tensor_t &/* tB */, const Tensor_t &/* tC */,
const PoolingDescriptors_t & /*descriptors*/, PoolingWorkspace_t & /*workspace*/,
size_t /* imgHeight */, size_t /* imgWidth */, size_t /* imgDepth */, size_t /* fltHeight */, size_t /* fltWidth */,
size_t/* fltDepth */, size_t /* strideRows */, size_t /* strideCols */, size_t/* strideDepth */) {}

///@}

/** @name Backward Propagation in Max Pooling Layer
Expand All @@ -631,6 +652,13 @@ class TCudnn
PoolingWorkspace_t &workspace, size_t imgHeight, size_t imgWidth, size_t fltHeight,
size_t fltWidth, size_t strideRows, size_t strideCols, size_t nLocalViews);

static void MaxPoolLayer3DBackward(Tensor_t &/* activationGradientsBackward */, const Tensor_t &/* activationGradients */,
const Tensor_t &/* indexMatrix */, const Tensor_t & /*inputActivation*/,
const Tensor_t & /*outputTensor*/, const PoolingDescriptors_t & /*descriptors*/,
PoolingWorkspace_t & /*workspace*/, size_t /* imgHeight */, size_t /* imgWidth */,
size_t /* fltHeight */, size_t /* fltWidth */, size_t /* strideRows */,
size_t /* strideCols */, size_t /* nLocalViews */) {}

///@}

//____________________________________________________________________________
Expand Down
54 changes: 54 additions & 0 deletions tmva/tmva/inc/TMVA/DNN/CNN/ContextHandles.h
Original file line number Diff line number Diff line change
Expand Up @@ -88,6 +88,60 @@ struct TCNNWorkspace : public TMVA::DNN::TWorkspace {
ReduceTensorDescriptor_t fReduceTensorDesc;
};


} // namespace CNN



namespace CNN_3D {

//______________________________________________________________________________
//
// Keeps the descriptors for the CNN
//______________________________________________________________________________

template <typename Layer_t>
struct TCNNDescriptors : public TMVA::DNN::TDescriptors {
using LayerDescriptor_t = typename Layer_t::LayerDescriptor_t; // Main layer operation
using HelperDescriptor_t = typename Layer_t::HelperDescriptor_t; // Used to define possible helpers for the layers (e.g. activations)
using WeightsDescriptor_t = typename Layer_t::WeightsDescriptor_t; // The weights that are modified (e.g filters)

LayerDescriptor_t LayerDescriptor;
HelperDescriptor_t HelperDescriptor;
WeightsDescriptor_t WeightsDescriptor;
};

template <typename Layer_t>
struct TCNNWorkspace : public TMVA::DNN::TWorkspace {
using AlgorithmForward_t = typename Layer_t::AlgorithmForward_t; // Forward layer operation
using AlgorithmBackward_t = typename Layer_t::AlgorithmBackward_t; // Backward layer operation
using AlgorithmHelper_t = typename Layer_t::AlgorithmHelper_t; // Used for weight grad backward pass

using ReduceTensorDescriptor_t = typename Layer_t::ReduceTensorDescriptor_t;

using AlgorithmDataType_t = typename Layer_t::AlgorithmDataType_t;

AlgorithmForward_t AlgorithmForward;
AlgorithmBackward_t AlgorithmBackward;
AlgorithmHelper_t HelperAlgorithm;

AlgorithmDataType_t DataType;

size_t *ForwardWorkspace;
size_t *BackwardWorkspace;
size_t *HelperWorkspace;

void *fReductionWorkspace = nullptr;

size_t ForwardWorkspaceSize;
size_t BackwardWorkspaceSize;
size_t HelperWorkspaceSize;
size_t fReductionWorkspaceSize = 0;

ReduceTensorDescriptor_t fReduceTensorDesc;
};


} // namespace CNN

namespace RNN {
Expand Down
Loading