]> Gitweb @ Texas Instruments - Open Source Git Repositories - git.TI.com/gitweb - ti-machine-learning/ti-machine-learning.git/blobdiff - debian/ti-timl/usr/src/timl/src/common/cnn/timlCNNConvInitialize.c
modified
[ti-machine-learning/ti-machine-learning.git] / debian / ti-timl / usr / src / timl / src / common / cnn / timlCNNConvInitialize.c
diff --git a/debian/ti-timl/usr/src/timl/src/common/cnn/timlCNNConvInitialize.c b/debian/ti-timl/usr/src/timl/src/common/cnn/timlCNNConvInitialize.c
new file mode 100644 (file)
index 0000000..cc785f2
--- /dev/null
@@ -0,0 +1,168 @@
+/******************************************************************************/
+/*!
+ * \file timlCNNConvInitialize.c
+ */
+/* Copyright (C) 2015 Texas Instruments Incorporated - http://www.ti.com/
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *    Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ *
+ *    Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the
+ *    distribution.
+ *
+ *    Neither the name of Texas Instruments Incorporated nor the names of
+ *    its contributors may be used to endorse or promote products derived
+ *    from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ ******************************************************************************/
+
+
+/*******************************************************************************
+ *
+ * INCLUDES
+ *
+ ******************************************************************************/
+
+#include "../api/timl.h"
+
+
+/******************************************************************************/
+/*!
+ * \ingroup       cnn
+ * \brief         Initialize the conv layer
+ * \param[in]     layer Conv layer
+ * \return        Error code
+ */
+/******************************************************************************/
+
+int timlCNNConvInitialize(timlCNNLayer *layer)
+{
+   timlConvNeuralNetwork *cnn;
+   timlCNNLayer          *prev;
+   int                   dim;
+   int                   deviceId;
+   int                   threadId;
+   int                   err;
+
+   // init
+   err      = 0;
+   cnn      = layer->cnn;
+   prev     = layer->prev;
+   dim      = 0;
+   deviceId = layer->cnn->deviceId;
+   threadId = layer->cnn->threadId;
+
+   // common to level 1, 2, 3
+
+   // allocate prev feature map reshape, size = (prev->channel*kernelRow*kernelCol) * (row*col)
+   if (timlUtilMalloc((void**) &(layer->convParams.prevFeatureMapReshape), sizeof(float)*layer->convParams.inputFeatureMapChannel*layer->convParams.kernelRow*layer->convParams.kernelCol*layer->row*layer->col)) {
+      return ERROR_CNN_LAYER_ALLOCATION;
+   }
+
+   // allocate biasMultiplier
+   if (timlUtilMalloc((void**) &(layer->convParams.biasMultiplier), sizeof(float)*layer->row*layer->col)) {
+      return ERROR_CNN_LAYER_ALLOCATION;
+   }
+   timlUtilVectorResetFloat(layer->convParams.biasMultiplier, layer->row*layer->col, 1.0, deviceId, threadId);
+
+   if (layer->convParams.shared == false) {
+       // allocate prevFeatureMapReshapeIndex, size = (kernelRow*kernelCol) * (row*col)
+      if (timlUtilMalloc((void**) &(layer->convParams.prevFeatureMapReshapeIndex), sizeof(int)*layer->convParams.kernelRow*layer->convParams.kernelCol*layer->row*layer->col)) {
+         return ERROR_CNN_LAYER_ALLOCATION;
+      }
+      timlUtilConv2ImageReshapeIndex(layer->convParams.prevFeatureMapReshapeIndex, prev->row, prev->col, layer->convParams.kernelRow, layer->convParams.kernelCol, layer->convParams.padUp, layer->convParams.padDown, layer->convParams.padLeft, layer->convParams.padRight, layer->convParams.strideX, layer->convParams.strideY, layer->convParams.type);
+
+      // allocate kernel
+      dim = layer->convParams.inputFeatureMapChannel*layer->convParams.outputFeatureMapChannel*layer->convParams.kernelRow*layer->convParams.kernelCol;
+      if (timlUtilMalloc((void**) &(layer->convParams.kernel), sizeof(float) * dim)) {
+         return ERROR_CNN_LAYER_ALLOCATION;
+      }
+
+      // allocate bias
+      if (timlUtilMalloc((void**) &(layer->convParams.bias), sizeof(float) * layer->channel)) {
+         return ERROR_CNN_LAYER_ALLOCATION;
+      }
+
+      // allocate connectivity
+//      layer->convParams.connectivity =
+//         malloc(sizeof(int) * layer->convParams.inputFeatureMapChannel * layer->convParams.outputFeatureMapChannel);
+//      if (layer->convParams.connectivity == NULL) {
+//         return ERROR_CNN_LAYER_ALLOCATION;
+//      }
+   }
+
+   // level 1 only
+   if (layer->allocatorLevel == Util_AllocatorLevel1) {
+      // allocate feature map
+      if (timlUtilMalloc((void**) &(layer->featureMap), sizeof(float)*layer->row*layer->col*layer->channel)) {
+         return ERROR_CNN_LAYER_ALLOCATION;
+      }
+
+      // allocate feature map delta
+      if (timlUtilMalloc((void**) &(layer->delta), sizeof(float)*layer->row*layer->col*layer->channel)) {
+         return ERROR_CNN_LAYER_ALLOCATION;
+      }
+
+      dim = layer->convParams.inputFeatureMapChannel*layer->convParams.outputFeatureMapChannel*layer->convParams.kernelRow*layer->convParams.kernelCol;
+
+      if (layer->convParams.shared == false) {
+         // allocate kernelInc
+         if (timlUtilMalloc((void**) &(layer->convParams.kernelInc), sizeof(float)*dim)) {
+            return ERROR_CNN_LAYER_ALLOCATION;
+         }
+
+         // allocate kernelGradAccum
+         if (timlUtilMalloc((void**) &(layer->convParams.kernelGradAccum), sizeof(float)*dim)) {
+            return ERROR_CNN_LAYER_ALLOCATION;
+         }
+
+         // allocate biasGradAccum
+         if (timlUtilMalloc((void**) &(layer->convParams.biasGradAccum), sizeof(float)*layer->channel)) {
+            return ERROR_CNN_LAYER_ALLOCATION;
+         }
+
+         // allocate biasInc
+         if (timlUtilMalloc((void**) &(layer->convParams.biasInc), sizeof(float)*layer->channel)) {
+            return ERROR_CNN_LAYER_ALLOCATION;
+         }
+      }
+   }
+
+   // level 2 only
+   if (layer->allocatorLevel == Util_AllocatorLevel2) {
+      // allocate feature map
+      if (timlUtilMalloc((void**) &(layer->featureMap), sizeof(float)*layer->row*layer->col*layer->channel)) {
+         return ERROR_CNN_LAYER_ALLOCATION;
+      }
+   }
+
+   // level 3 only
+   if (layer->allocatorLevel == Util_AllocatorLevel3) {
+      if (layer->id % 2 == 0) { // layer 2, 4, 6 8, ... allocate at the back end
+         layer->featureMap = cnn->memPool + cnn->memPoolSize - layer->channel*layer->row*layer->col;
+      }
+      else { // layer 1, 3, 5, ... allocate at the front end
+         layer->featureMap = cnn->memPool;
+      }
+   }
+
+   return 0;
+}