code: def transplant(new_net, net, suffix=''):
      
      for p in net.params:
          p_new = p + suffix
          if p_new not in new_net.params:
              print 'dropping', p
              continue
          for i in range(len(net.params[p])):
              if i > (len(new_net.params[p_new]) - 1):
                  print 'dropping', p, i
                  break
              if net.params[p][i].data.shape != new_net.params[p_new][i].data.shape:
                  print 'coercing', p, i, 'from', net.params[p][i].data.shape, 'to', new_net.params[p_new][i].data.shape
              else:
                  print 'copying', p, ' -> ', p_new, i
              new_net.params[p_new][i].data.flat = net.params[p][i].data.flat
docs: Transfer weights by copying matching parameters, coercing parameters of
      incompatible shape, and dropping unmatched parameters.
  
      The coercion is useful to convert fully connected layers to their
      equivalent convolutional layers, since the weights are the same and only
      the shapes are different.  In particular, equivalent fully connected and
      convolution layers have shapes O x I and O x I x H x W respectively for O
      outputs channels, I input channels, H kernel height, and W kernel width.
  
      Both  `net` to `new_net` arguments must be instantiated `caffe.Net`s.