title: How to convert caffe prototxt to pytorch model?
body: <p>So far I was using the <a href="https://github.com/marvis/pytorch-caffe-darknet-convert" rel="noreferrer">pytorch-caffe-darknet-convert</a> repository. After overcoming numerous problems (concat and eltwise layers not convertible) I ended up with something that looks like a darknet config file:</p>
  
  <pre><code>python caffe2darknet.py my_prototxt.txt my_caffemodel.caffemodel new_net_file.cfg new_model.weights
  </code></pre>
  
  <p>Does someone know how to convert the output <code>new_net_file.cfg</code> into pytorch? Alternatively is there another way of converting caffe prototxt files into pytorch?<br>
  I would like to have the same behaviour as <a href="https://github.com/ethereon/caffe-tensorflow" rel="noreferrer">caffe-tensorflow</a>
  I'll post both my caffe prototxt and the output <code>new_net_file.cfg</code> below as reference.  </p>
  
  <p>my_prototxt:  </p>
  
  <pre><code>input: "data"
  input_shape {
    dim: 1
    dim: 240
    dim: 144
    dim: 240
  }
  
  layer {
    name: "conv1_1"
    type: "Convolution"
    bottom: "data"
    top: "conv1_1"
    convolution_param {
      num_output: 16
      pad: 3
      pad: 3
      pad: 3
      kernel_size: 7
      kernel_size: 7
      kernel_size: 7
      stride: 2
      weight_filler {
        type: "xavier"
      }
      bias_filler {
        type: "constant"
      }
      engine: CUDNN
      axis: 1
    }
  }
  layer {
    name: "relu1_1"
    type: "ReLU"
    bottom: "conv1_1"
    top: "conv1_1"
  }
  layer {
    name: "reduction2_1"
    type: "Convolution"
    bottom: "conv1_1"
    top: "reduction2_1"
    convolution_param {
      num_output: 32
      bias_term: false
      pad: 0
      kernel_size: 1
      stride: 1
      weight_filler {
        type: "xavier"
      }
      bias_filler {
        type: "constant"
      }
    }
  }
  layer {
    name: "conv2_1"
    type: "Convolution"
    bottom: "conv1_1"
    top: "conv2_1"
    convolution_param {
      num_output: 32
      pad: 1
      pad: 1
      pad: 1
      kernel_size: 3
      kernel_size: 3
      kernel_size: 3
      stride: 1
      weight_filler {
        type: "xavier"
      }
      bias_filler {
        type: "constant"
      }
      engine: CUDNN
      axis: 1
    }
  }
  layer {
    name: "relu2_1"
    type: "ReLU"
    bottom: "conv2_1"
    top: "conv2_1"
  }
  layer {
    name: "conv2_2"
    type: "Convolution"
    bottom: "conv2_1"
    top: "conv2_2"
    convolution_param {
      num_output: 32
      pad: 1
      pad: 1
      pad: 1
      kernel_size: 3
      kernel_size: 3
      kernel_size: 3
      stride: 1
      weight_filler {
        type: "xavier"
      }
      bias_filler {
        type: "constant"
      }
      axis: 1
    }
  }
  layer {
    name: "res2_2"
    type: "Eltwise"
    bottom: "reduction2_1"
    bottom: "conv2_2"
    top: "res2_2"
    eltwise_param { operation: SUM }
  }
  layer {
    name: "add2_2"
    type: "ReLU"
    bottom: "res2_2"
    top: "res2_2"
  }
  layer {
    name: "pool2"
    type: "Pooling"
    bottom: "res2_2"
    top: "pool2"
    pooling_param {
      pool: MAX
      kernel_size: 2
      stride: 2
      engine: CUDNN
    }
  }
  [...] # I cropped it here, since file is too lengthy
  </code></pre>
  
  <p>the (darknet) config file:  </p>
  
  <pre><code>[net]
  batch=1
  channels=240
  height=144
  width=240
  
  [convolutional]
  filters=16
  size=['7', '7', '7']
  stride=2
  pad=1
  activation=relu
  
  [convolutional]
  filters=32
  size=1
  stride=1
  pad=1
  activation=linear
  
  [route]
  layers=-2
  
  [convolutional]
  filters=32
  size=['3', '3', '3']
  stride=1
  pad=1
  activation=relu
  
  [convolutional]
  filters=32
  size=['3', '3', '3']
  stride=1
  pad=1
  activation=linear
  
  [shortcut]
  from=-4
  activation=relu
  
  [maxpool]
  size=2
  stride=2
  
  [...] # I cropped it here, since file is too lengthy
  </code></pre>