.. note:: :class: sphx-glr-download-link-note Click :ref:`here ` to download the full example code .. rst-class:: sphx-glr-example-title .. _sphx_glr_auto_examples_plot_dl_keras.py: .. _l-example-backend-api-tensorflow: ONNX Runtime for Keras ====================== The following demonstrates how to compute the predictions of a pretrained deep learning model obtained from `keras `_ with *onnxruntime*. The conversion requires `keras `_, `tensorflow `_, `keras-onnx `_, `onnxmltools `_ but then only *onnxruntime* is required to compute the predictions. .. code-block:: python import os if not os.path.exists('dense121.onnx'): from keras.applications.densenet import DenseNet121 model = DenseNet121(include_top=True, weights='imagenet') from keras2onnx import convert_keras onx = convert_keras(model, 'dense121.onnx') with open("dense121.onnx", "wb") as f: f.write(onx.SerializeToString()) Let's load an image (source: wikipedia). .. code-block:: python from keras.preprocessing.image import array_to_img, img_to_array, load_img img = load_img('Sannosawa1.jpg') ximg = img_to_array(img) import matplotlib.pyplot as plt plt.imshow(ximg / 255) plt.axis('off') .. image:: /auto_examples/images/sphx_glr_plot_dl_keras_001.png :class: sphx-glr-single-img Let's load the model with onnxruntime. .. code-block:: python import onnxruntime as rt from onnxruntime.capi.onnxruntime_pybind11_state import InvalidGraph try: sess = rt.InferenceSession('dense121.onnx') ok = True except (InvalidGraph, TypeError, RuntimeError) as e: # Probably a mismatch between onnxruntime and onnx version. print(e) ok = False if ok: print("The model expects input shape:", sess.get_inputs()[0].shape) print("image shape:", ximg.shape) .. rst-class:: sphx-glr-script-out Out: .. code-block:: none The model expects input shape: ['N', 224, 224, 3] image shape: (960, 1280, 3) Let's resize the image. .. code-block:: python if ok: from skimage.transform import resize import numpy ximg224 = resize(ximg / 255, (224, 224, 3), anti_aliasing=True) ximg = ximg224[numpy.newaxis, :, :, :] ximg = ximg.astype(numpy.float32) print("new shape:", ximg.shape) .. rst-class:: sphx-glr-script-out Out: .. code-block:: none new shape: (1, 224, 224, 3) Let's compute the output. .. code-block:: python if ok: input_name = sess.get_inputs()[0].name res = sess.run(None, {input_name: ximg}) prob = res[0] print(prob.ravel()[:10]) # Too big to be displayed. .. rst-class:: sphx-glr-script-out Out: .. code-block:: none [5.3862054e-06 6.1927537e-08 2.0104133e-07 1.3239808e-06 1.0415122e-06 6.7792627e-08 3.1348068e-07 3.2683040e-08 1.0914272e-07 1.1627122e-06] Let's get more comprehensive results. .. code-block:: python if ok: from keras.applications.densenet import decode_predictions decoded = decode_predictions(prob) import pandas df = pandas.DataFrame(decoded[0], columns=["class_id", "name", "P"]) print(df) .. rst-class:: sphx-glr-script-out Out: .. code-block:: none class_id name P 0 n09468604 valley 0.785549 1 n09193705 alp 0.187054 2 n09399592 promontory 0.010602 3 n09246464 cliff 0.005537 4 n02417914 ibex 0.001997 **Total running time of the script:** ( 0 minutes 56.895 seconds) .. _sphx_glr_download_auto_examples_plot_dl_keras.py: .. only :: html .. container:: sphx-glr-footer :class: sphx-glr-footer-example .. container:: sphx-glr-download :download:`Download Python source code: plot_dl_keras.py ` .. container:: sphx-glr-download :download:`Download Jupyter notebook: plot_dl_keras.ipynb ` .. only:: html .. rst-class:: sphx-glr-signature `Gallery generated by Sphinx-Gallery `_