]> 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/timlCNNConvForwardPropagation.c
modified
[ti-machine-learning/ti-machine-learning.git] / debian / ti-timl / usr / src / timl / src / common / cnn / timlCNNConvForwardPropagation.c
diff --git a/debian/ti-timl/usr/src/timl/src/common/cnn/timlCNNConvForwardPropagation.c b/debian/ti-timl/usr/src/timl/src/common/cnn/timlCNNConvForwardPropagation.c
new file mode 100644 (file)
index 0000000..298eca0
--- /dev/null
@@ -0,0 +1,131 @@
+/******************************************************************************/\r
+/*!\r
+ * \file timlCNNConvForwardPropagation.c\r
+ */\r
+/* Copyright (C) 2015 Texas Instruments Incorporated - http://www.ti.com/\r
+ *\r
+ * Redistribution and use in source and binary forms, with or without\r
+ * modification, are permitted provided that the following conditions\r
+ * are met:\r
+ *\r
+ *    Redistributions of source code must retain the above copyright\r
+ *    notice, this list of conditions and the following disclaimer.\r
+ *\r
+ *    Redistributions in binary form must reproduce the above copyright\r
+ *    notice, this list of conditions and the following disclaimer in the\r
+ *    documentation and/or other materials provided with the\r
+ *    distribution.\r
+ *\r
+ *    Neither the name of Texas Instruments Incorporated nor the names of\r
+ *    its contributors may be used to endorse or promote products derived\r
+ *    from this software without specific prior written permission.\r
+ *\r
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\r
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\r
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\r
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\r
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\r
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+ *\r
+ ******************************************************************************/\r
+\r
+\r
+/*******************************************************************************\r
+ *\r
+ * INCLUDES\r
+ *\r
+ ******************************************************************************/\r
+\r
+#include "../api/timl.h"\r
+\r
+\r
+/******************************************************************************/\r
+/*!\r
+ * \ingroup       cnn\r
+ * \brief         Forward propagate form layer to layer->next\r
+ * \param[in]     prevLayer Previous layer ptr\r
+ * \return        Error code\r
+ */\r
+/******************************************************************************/\r
+\r
+int timlCNNConvForwardPropagation(timlCNNLayer *prevLayer)\r
+{\r
+   int          err;\r
+   int          M;\r
+   int          N;\r
+   int          K;\r
+   timlCNNLayer *layer;\r
+   int          prevFeatureMapRow;\r
+   int          prevFeatureMapCol;\r
+   int          prevFeatureMapChannel;\r
+   int          featureMapRow;\r
+   int          featureMapCol;\r
+   int          featureMapChannel;\r
+   int          kernelRow;\r
+   int          kernelCol;\r
+   int          deviceId;\r
+   int          threadId;\r
+\r
+   // init\r
+   err                   = 0;\r
+   layer                 = prevLayer->next;\r
+   prevFeatureMapRow     = prevLayer->row;\r
+   prevFeatureMapCol     = prevLayer->col;\r
+   prevFeatureMapChannel = prevLayer->channel;\r
+   featureMapRow         = layer->row;\r
+   featureMapCol         = layer->col;\r
+   featureMapChannel     = layer->channel;\r
+   kernelRow             = layer->convParams.kernelRow;\r
+   kernelCol             = layer->convParams.kernelCol;\r
+   deviceId              = prevLayer->cnn->deviceId;\r
+   threadId              = prevLayer->cnn->threadId;\r
+   M                     = featureMapChannel;\r
+   K                     = kernelRow*kernelCol*prevFeatureMapChannel;\r
+   N                     = featureMapRow*featureMapCol;\r
+\r
+   timlUtilConv2ImageReshape(layer->convParams.prevFeatureMapReshape, prevLayer->featureMap, layer->convParams.prevFeatureMapReshapeIndex, prevFeatureMapChannel, prevFeatureMapRow*prevFeatureMapCol, kernelRow*kernelCol*featureMapRow*featureMapCol, deviceId, threadId);\r
+   // featureMap = kernel * prevFeatureMapReshape\r
+   timlUtilBLASsgemm(CblasNoTrans, CblasNoTrans, M, N, K, 1.0, layer->convParams.kernel, layer->convParams.prevFeatureMapReshape, 0.0, layer->featureMap, deviceId, threadId);\r
+   timlUtilBLASsgemm(CblasNoTrans, CblasNoTrans, M, N, 1, 1.0, layer->convParams.bias, layer->convParams.biasMultiplier, 1.0, layer->featureMap, deviceId, threadId);\r
+\r
+//    float *prevFeatureMapPtr;\r
+//    float *featureMapPtr;\r
+//    float *kernelPtr;\r
+//\r
+//    // reshape the prev feature map\r
+//    for (j = 0; j < prevFeatureMapChannel; j++){\r
+//       timlUtilConv2ImageReshape(layer->convParams.prevFeatureMapReshape + j*(kernelRow*kernelCol*featureMapRow*featureMapCol),\r
+//             prevLayer->featureMap + j*prevFeatureMapRow*prevFeatureMapCol, layer->convParams.prevFeatureMapReshapeIndex,\r
+//             kernelRow*kernelCol*featureMapRow*featureMapCol);\r
+//\r
+//     for (j = 0; j < featureMapChannel; j++){\r
+//             // featureMap[j] = bias[j]\r
+//             featureMapPtr = layer->featureMap + featureMapRow*featureMapCol*j;\r
+//             timlUtilFloatVectorReset(featureMapPtr, featureMapCol * featureMapRow, layer->convParams.bias[j]);\r
+//             for (i = 0 ; i < prevFeatureMapChannel; i++){\r
+//                     // prevFeatureMap[i]\r
+//                     prevFeatureMapPtr = prevLayer->featureMap + prevFeatureMapRow*prevFeatureMapCol*i;\r
+//                     // kernel[i, j]\r
+//                     kernelPtr = layer->convParams.kernel + kernelRow*kernelCol*i + kernelRow*kernelCol*prevFeatureMapChannel*j;\r
+//                     // featureMapTemp = conv2(prevFeatureMap[i], kernel[i, j], 'valid')\r
+//                     timlUtilConv2Valid(prevFeatureMapPtr, kernelPtr, featureMapPtr,\r
+//                                     prevFeatureMapRow, prevFeatureMapCol, kernelRow, kernelCol);\r
+//                     // featureMap[j] += featureMapTemp\r
+//                     cblas_daxpy(featureMapRow*featureMapCol, 1.0, layer->convParams.featureMapTemp, 1, featureMapPtr, 1);\r
+//             }\r
+//     }\r
+//\r
+//      // featureMap{i} = featureMap{i} + bias[i]\r
+//      for (i = 0; i < featureMapChannel; i++){\r
+//         for(j = 0; j < N; j++){\r
+//            layer->featureMap[i*N + j] += layer->convParams.bias[i];\r
+//         }\r
+//      }\r
+\r
+   return err;\r
+}\r