一种实现这个的方法是使用Caffe的
Python Layer。然后您可以自己设置函数并根据需要进行定制。但是,这个层只能在CPU上运行,因此如果您在网络中间使用它,可能会减慢模型速度。
下面,我定义了一个使用Python层来进行零填充输入的层,您可以根据自己的需求进行修改:
import caffe
import numpy as np
class SpatialReflectionPadding(caffe.Layer):
def setup(self,bottom,top):
if len(bottom) != 1:
raise Exception("Expected a single blob")
if len(bottom[0].shape) != 4:
raise Exception("Expected 4D blob")
params = eval(self.param_str)
self.l = params["l"]
self.r = params["r"]
self.t = params["t"]
self.b = params["b"]
def reshape(self,bottom,top):
top[0].reshape(bottom[0].shape[0],bottom[0].shape[1],bottom[0].shape[2]+self.t+self.b,bottom[0].shape[3]+self.r+self.l)
def forward(self,bottom,top):
for i in range(0,top[0].shape[2]):
for j in range(0,top[0].shape[3]):
if (i < self.t or i >= self.t+bottom[0].shape[2]) or (j < self.l or j >= self.l+bottom[0].shape[3]):
top[0].data[:,:,i,j] = 0
else:
top[0].data[:,:,i,j] = bottom[0].data[:,:,i-self.t,j-self.l]
def backward(self,top,propagate_down,bottom):
bottom[0].diff[...] = np.full(bottom[0].shape,1) * top[0].diff[:,:,self.t:self.t+bottom[0].shape[2],self.l:self.l+bottom[0].shape[3]]
然后,在您的prototxt文件中,您可以这样使用它:
layer {
name: "srp"
type: "Python"
bottom: "some_layer"
top: "srp"
python_param {
module: "caffe_srp"
layer: "SpatialReflectionPadding"
param_str: '{ "l": 1, "b": 1, "t": 1, "r": 1}'
}
}
我并不100%确定它是否正确运行,但在我使用时,它似乎是这样的。无论如何,它应该提供了一个思路和开始的点,告诉你如何继续。此外,你可以参考
这个问题及其答案。