microsoft / MMdnn

MMdnn is a set of tools to help users inter-operate among different deep learning frameworks. E.g. model conversion and visualization. Convert models between Caffe, Keras, MXNet, Tensorflow, CNTK, PyTorch Onnx and CoreML.
MIT License
5.8k stars 965 forks source link

IR->Caffe? #60

Closed anwesha94 closed 6 years ago

anwesha94 commented 6 years ago

Hi, In the Caffe directory there is no instruction for IR ->Caffe conversion. Is this conversion supported? I want to convert the weights in keras to caffe. How can I do this conversion using MMdnn? Thank you.

kitstar commented 6 years ago

Hi @anwesha94 , the IR -> caffe is on-going. The running script is same as others, i.e. IRToCode -f caffe. @TobeyQin Could you help with it? Thanks.

TobeyQin commented 6 years ago

Please follow the steps on the issue #66 (step 2 and 3). Thanks.

anwesha94 commented 6 years ago

Hi @TobeyQin , I tried to execute step 2 of the link. It gave the following error: "raise NotImplementedError("Destination [Caffe] is not implemented yet." Do I have to reinstall MMdnn to get IRtoCaffe? Thank you.

anwesha94 commented 6 years ago

Hi, I reinstalled MMdnn. Now I get the following error: Traceback (most recent call last): File "/usr/lib/python3.6/runpy.py", line 193, in _run_module_as_main "__main__", mod_spec) File "/usr/lib/python3.6/runpy.py", line 85, in _run_code exec(code, run_globals) File "/home/anwesha/.local/lib/python3.6/site-packages/mmdnn/conversion/_script/IRToCode.py", line 112, in <module> _main() File "/home/anwesha/.local/lib/python3.6/site-packages/mmdnn/conversion/_script/IRToCode.py", line 107, in _main ret = _convert(args) File "/home/anwesha/.local/lib/python3.6/site-packages/mmdnn/conversion/_script/IRToCode.py", line 9, in _convert from mmdnn.conversion.caffe.caffe_emitter import CaffeEmitter File "/home/anwesha/.local/lib/python3.6/site-packages/mmdnn/conversion/caffe/caffe_emitter.py", line 13, in <module> import cntk ModuleNotFoundError: No module named 'cntk'

anwesha94 commented 6 years ago

I installed cntk and added the path. I could execute step 2 and 3 and generate the caffemodel. However, testing it with test data gave accuracy=0.08 while the actual accuracy is 79% in keras.

kitstar commented 6 years ago

Hi @anwesha94, what is your keras model data format? Caffe model takes NCHW data (channel first). If your keras model data format is NHWC (channel last, if you use tensorflow as backend), you should swapaxis your input data for caffe to use.

Or you can provide your model for us to test. Thanks.

anwesha94 commented 6 years ago

Yes, I am using tensorflow as backend. It is using channel last format. I am using the cifar10 dataset for training and testing. I have shared the weights here in a zip file: keras_cifar10_weight_0.zip

kitstar commented 6 years ago

Then you should transpose your input data like caffe_input = np.transpose(image, [0, 3, 1, 2]) then feed into caffe, to get right result.

anwesha94 commented 6 years ago

Hi, I changed the axes of input images to (2,0,1). All the predictions are 0. There is something wrong with my conversion. What can be the possible error?

kitstar commented 6 years ago

@TobeyQin will help to investigate this problem, thanks.

qiudi0127 commented 6 years ago

who can help me solve this problem from IR to caffe. Thank you so much.

Parse file [IR/lenet_finetune.pb] with binary format successfully. Traceback (most recent call last): File "/Users/diqiu/anaconda/lib/python2.7/runpy.py", line 174, in _run_module_as_main "main", fname, loader, pkg_name) File "/Users/diqiu/anaconda/lib/python2.7/runpy.py", line 72, in _run_code exec code in run_globals File "/Users/diqiu/meituan/framework/MMdnn/mmdnn/conversion/_script/IRToCode.py", line 112, in _main() File "/Users/diqiu/meituan/framework/MMdnn/mmdnn/conversion/_script/IRToCode.py", line 107, in _main ret = _convert(args) File "/Users/diqiu/meituan/framework/MMdnn/mmdnn/conversion/_script/IRToCode.py", line 55, in _convert emitter.run(args.dstModelPath, args.dstWeightPath, args.phase) File "mmdnn/conversion/caffe/caffe_emitter.py", line 136, in run super(CaffeEmitter, self).run(dstNetworkPath, dstWeightPath, phase) File "mmdnn/conversion/common/DataStructure/emitter.py", line 21, in run self.save_code(dstNetworkPath, phase) File "mmdnn/conversion/common/DataStructure/emitter.py", line 53, in save_code code = self.gen_code(phase) File "mmdnn/conversion/caffe/caffe_emitter.py", line 124, in gen_code func(current_node) File "mmdnn/conversion/caffe/caffe_emitter.py", line 208, in emit_Pool IR_node.get_attr('pads')[1], TypeError: 'NoneType' object has no attribute 'getitem'

kitstar commented 6 years ago

Hi @qiudi0127 , could you provide related files (models) for us to debug? Thanks.

anwesha94 commented 6 years ago

@qiudi0127 The input layer name should be "data" in the deploy file. Currently the deploy generated in mmdnn names it as <...>_input. Change it to data and check if it works. I had a similar problem for accessing the blobs. This solved for me. However, I didn't get expected testing results.