| 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): |
| |
| if len(bottom) != 2: |
| raise Exception("Need two inputs to compute distance.") |
|
|
| def reshape(self, bottom, top): |
| |
| if bottom[0].count != bottom[1].count: |
| raise Exception("Inputs must have the same dimension.") |
| |
| self.diff = np.zeros_like(bottom[0].data, dtype=np.float32) |
| |
| 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 |
|
|