Python Howto Examples
=====================
* [Configuring Net to get Multiple Ouputs](multiple_outputs.py)
* [Configuring Image Record Iterator](data_iter.py)
* Set break point in C++ code of the symbol using gdb under Linux:

	* 	Build mxnet with following values:

		 ```
		 	DEBUG=1 
		 	CUDA=0 #to make sure convolution-inl.h will be used 
		 	CUDNN=0 #to make sure convolution-inl.h will be used 
		 ```
		 
	*  run python under gdb:  ```gdb --args python debug_conv.py```
	*  in gdb set break point on particular line of the code and run execution: 

```
(gdb) break src/operator/convolution-inl.h:120
(gdb) run
Breakpoint 1, mxnet::op::ConvolutionOp<mshadow::cpu, float>::Forward (this=0x12219d0, ctx=..., in_data=std::vector of length 3, capacity 4 = {...}, req=std::vector of length 1, capacity 1 = {...}, out_data=std::vector of length 1, capacity 1 = {...},
    aux_args=std::vector of length 0, capacity 0) at src/operator/./convolution-inl.h:121
121	               data.shape_[1] / param_.num_group * param_.kernel[0] * param_.kernel[1]);
(gdb) list
116	    }
117	    Tensor<xpu, 4, DType> data = in_data[conv::kData].get<xpu, 4, DType>(s);
118	    Shape<3> wmat_shape =
119	        Shape3(param_.num_group,
120	               param_.num_filter / param_.num_group,
121	               data.shape_[1] / param_.num_group * param_.kernel[0] * param_.kernel[1]);
122	    Tensor<xpu, 3, DType> wmat =
123	        in_data[conv::kWeight].get_with_shape<xpu, 3, DType>(wmat_shape, s);
124	    Tensor<xpu, 4, DType> out = out_data[conv::kOut].get<xpu, 4, DType>(s);
125	#if defined(__CUDACC__)
```
