**Caffe Support**

If you have a pretrained caffe model(model definition prototxt and model binary file), you can load it as BigDL model. You can also convert a BigDL model to caffe model.

**Load Caffe Model**

Assume you have a `caffe.prototxt`

and `caffe.model`

,
you can load it into BigDL by calling `Module.loadCaffeModel`

(scala) or `Model.load_caffe_model`

(python).

- Scala Example

```
import com.intel.analytics.bigdl.tensor.TensorNumericMath.TensorNumeric.NumericFloat
val model = Module.loadCaffeModel(caffe.prototxt, caffe.model)
```

- Python Example

```
model = Model.load_caffe_model(caffe.prototxt, caffe.model)
```

**Load Caffe Model Weights to Predefined BigDL Model**

If you have a predefined BigDL model, and want to load caffe model weights into BigDl model

- Scala Example

```
import com.intel.analytics.bigdl.tensor.TensorNumericMath.TensorNumeric.NumericFloat
val model = Module.loadCaffe(bigdlModel, caffe.prototxt, caffe.model, matchAll = true)
```

- Python Example

```
model = Model.load_caffe(bigdlModel, caffe.prototxt, caffe.model, match_all=True)
```

Note that if `matchAll/match_all = false`

, then only layers with same name will be loaded, the rest will use initialized parameters.

**Save BigDL Model to Caffe Model**

- Scala Example

```
import com.intel.analytics.bigdl.tensor.TensorNumericMath.TensorNumeric.NumericFloat
bigdlModel.saveCaffe(prototxtPath, modelPath, useV2 = true, overwrite = false)
```

- Python Example

```
bigdl_model.save_caffe(prototxt_path, model_path, use_v2 = True, overwrite = False)
```

In the above examples, if `useV2/use_v2 = true`

, it will convert to caffe V2 layer,
otherwise, it will convert to caffe V1 layer.
If `overwrite = true`

, it will overwrite the existing files.

Note: only graph model can be saved to caffe model.

**Limitation**

This functionality has been tested with some common models like AlexNet, Inception, Resnet which were created with standard Caffe layers, for those models with customized layers such as SSD, it is going to be supported in future work, but you can define your customized conversion method for your own layers.

**Supported Layers**

Please check this page