summaryrefslogtreecommitdiff
path: root/compiler/nnc/utils/caffe_model_maker/Pyloss.py
diff options
context:
space:
mode:
Diffstat (limited to 'compiler/nnc/utils/caffe_model_maker/Pyloss.py')
-rwxr-xr-xcompiler/nnc/utils/caffe_model_maker/Pyloss.py83
1 files changed, 83 insertions, 0 deletions
diff --git a/compiler/nnc/utils/caffe_model_maker/Pyloss.py b/compiler/nnc/utils/caffe_model_maker/Pyloss.py
new file mode 100755
index 000000000..e3f781759
--- /dev/null
+++ b/compiler/nnc/utils/caffe_model_maker/Pyloss.py
@@ -0,0 +1,83 @@
+"""
+COPYRIGHT
+
+All contributions by the University of California:
+Copyright (c) 2014-2017 The Regents of the University of California (Regents)
+All rights reserved.
+
+All other contributions:
+Copyright (c) 2014-2017, the respective contributors
+All rights reserved.
+
+Caffe uses a shared copyright model: each contributor holds copyright over
+their contributions to Caffe. The project versioning records all such
+contribution and copyright details. If a contributor wants to further mark
+their specific copyright on a particular contribution, they should indicate
+their copyright solely in the commit message of the change when it is
+committed.
+
+LICENSE
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+1. Redistributions of source code must retain the above copyright notice, this
+ list of conditions and the following disclaimer.
+2. 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.
+
+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.
+
+CONTRIBUTION AGREEMENT
+
+By contributing to the BVLC/caffe repository through pull-request, comment,
+or otherwise, the contributor releases their content to the
+license and copyright terms herein.
+"""
+import caffe
+import numpy as np
+
+
+class EuclideanLossLayer(caffe.Layer):
+ """
+ Compute the Euclidean Loss in the same manner as the C++ EuclideanLossLayer
+ to demonstrate the class interface for developing layers in Python.
+ """
+
+ def setup(self, bottom, top):
+ # check input pair
+ if len(bottom) != 2:
+ raise Exception("Need two inputs to compute distance.")
+
+ def reshape(self, bottom, top):
+ # check input dimensions match
+ if bottom[0].count != bottom[1].count:
+ raise Exception("Inputs must have the same dimension.")
+ # difference is shape of inputs
+ self.diff = np.zeros_like(bottom[0].data, dtype=np.float32)
+ # loss output is scalar
+ top[0].reshape(1)
+
+ def forward(self, bottom, top):
+ self.diff[...] = bottom[0].data - bottom[1].data
+ top[0].data[...] = np.sum(self.diff**2) / bottom[0].num / 2.
+
+ def backward(self, top, propagate_down, bottom):
+ for i in range(2):
+ if not propagate_down[i]:
+ continue
+ if i == 0:
+ sign = 1
+ else:
+ sign = -1
+ bottom[i].diff[...] = sign * self.diff / bottom[i].num