2017-04-13 33 views
0

有沒有人有解決這個問題的方法?任何其他可能類似的填充選項?或者我應該省略填充物重量選項?解卷積層不接受帶雙線性填充的5D斑點

+0

你總是可以從外部手動填充層。例如:瞭解他們如何用雙線性係數填充解卷層(行:23) –

+0

你有沒有參考「23行」? @AbidRahmanK – thigi

+0

對不起,我忘了提供鏈接:https://github.com/shelhamer/fcn.berkeleyvision.org/blob/master/voc-fcn8s/solve.py#L23 –

回答

0

我已經調整了文件github因此它可以用於5D斑點雙線性填充:

def upsample_filt(size): 
     """ 
     Make a 2D bilinear kernel suitable for upsampling of the given (h, w) size. 
     """ 
     factor = (size + 1) // 2 
     if size % 2 == 1: 
      center = factor - 1 
     else: 
      center = factor - 0.5 
     og = np.ogrid[:size, :size, :size] 

     return (1 - abs(og[0] - center)/factor) * \ 
       (1 - abs(og[1] - center)/factor) * \ 
       (1 - abs(og[2] - center)/factor) 

def interp(net, layers): 
    """ 
    Set weights of each layer in layers to bilinear kernels for interpolation. 
    """ 
    for l in layers: 
     m, k, d, h, w = net.params[l][0].data.shape 

     if m != k and k != 1: 
      print('input + output channels need to be the same or |output| == 1') 
      raise 
     if h != w or h != d or w != d: 
      print('filters need to be square') 
      raise 
     filt = upsample_filt(h) 
     net.params[l][0].data[range(m), range(k), :, :, :] = filt 


caffe.set_device(0) 
caffe.set_mode_gpu() 

solver = caffe.SGDSolver('solver.prototxt') 

# surgeries 
interp_layers = [k for k in solver.net.params.keys() if 'Deconv' in k] 
interp(solver.net, interp_layers) 

#print(interp_layers) 

solver.solve();