Convert Keras models with data-format channels_first (NCHW) to channels_last (NHWC).
- setup environment
docker run -it -v $PWD:/workdir -w /workdir tensorflow/tensorflow:2.8.0 bash
pip install google==3.0.0 tf2onnx==1.12.0 onnx-tf==1.10.0 tensorflow_probability==0.15.0 SimpleITK==2.1.1.2 scikit-image==0.19.3
-
copy keras model to /workdir, assuming model filename to be
keras_model.h5
. -
run below to convert to tf model.
python keras_to_tf.py keras_model.h5 tf_model
- convert tf to onnx model file.
python -m tf2onnx.convert --saved-model tf_model --output model.onnx
- the above 2 steps could be replaced by below - keras model direct to onnx model - if below doesn't error out for you
python -m tf2onnx.convert --keras keras_model.h5 --output model.onnx
- convert onnx back to tf model format.
onnx-tf convert --infile model.onnx --outdir updated_tf_model
- sample test inference *** with hard coded input shape and tensor names ***
python tf_inference.py updated_tf_model
####### *** TODO: below not working ***
- convert keras to onnx then back to keras
apt-get update;apt-get upgrade -yq;
vim /usr/local/lib/python3.8/dist-packages/onnx2keras/activation_layers.py
change line 144 to 151 per suggested by
https://github.com/gmalivenko/onnx2keras/pull/107/files
+ softmax_layer = keras.layers.Softmax(axis=params.get('axis',-1), name=keras_name)
+ layers[node_name] = softmax_layer(input_0)
+ layers[node_name].set_shape(layers[node_name].shape)
- def target_layer(x, axis=params['axis']):
- import tensorflow as tf
- return tf.nn.softmax(x, axis=axis)
-
- lambda_layer = keras.layers.Lambda(target_layer, name=keras_name)
- layers[node_name] = lambda_layer(input_0)
- layers[node_name].set_shape(layers[node_name].shape)
- lambda_func[keras_name] = target_layer
python keras_to_onnx_to_keras.py keras_model.h5 updated_keras_model.h5
python keras_inference.py updated_keras_model.h5
https://www.tensorflow.org/api_docs/python/tf/saved_model/load
https://github.com/onnx/tensorflow-onnx
https://github.com/onnx/onnx-tensorflow/blob/main/doc/CLI.md
https://github.com/onnx/tensorflow-onnx/blob/e896723e410a59a600d1a73657f9965a3cbf2c3b/tf2onnx/convert.py#L408
https://stackoverflow.com/questions/37689423/convert-between-nhwc-and-nchw-in-tensorflow
https://stackoverflow.com/questions/63682625/how-to-convert-saved-model-from-nchw-to-nhwc/63867165
https://gist.github.com/MartinNowak/9a2e467d740c43fe7e6fef6c09502449
https://github.com/onnx/onnx-tensorflow/issues/862
pip install onnx2keras==0.0.24 keras2onnx==1.7.0
provided my answer to relevant question in SO:
https://stackoverflow.com/a/73311512/868736