blob: 25d99d095fa271faf577a76637951dece47bc314 [file]
{
"nbformat": 4,
"nbformat_minor": 0,
"metadata": {},
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"##### Copyright 2020 The IREE Authors"
]
},
{
"cell_type": "code",
"metadata": {},
"source": [
"#@title Licensed under the Apache License v2.0 with LLVM Exceptions.\n",
"# See https://llvm.org/LICENSE.txt for license information.\n",
"# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# ResNet\n",
"\n",
"[ResNet](https://arxiv.org/abs/1512.03385) is a deep neural network architecture for image recognition.\n",
"\n",
"This notebook\n",
"\n",
"* Constructs a [ResNet50](https://www.tensorflow.org/api_docs/python/tf/keras/applications/ResNet50) model using `tf.keras`, with weights pretrained using the [ImageNet](http://www.image-net.org/) dataset\n",
"* Compiles that model with IREE\n",
"* Tests TensorFlow and IREE execution of the model on a sample image"
]
},
{
"cell_type": "code",
"source": [
"%%capture\n",
"!python -m pip install --upgrade tensorflow"
],
"metadata": {},
"execution_count": null,
"outputs": []
},
{
"cell_type": "code",
"metadata": {},
"source": [
"!python -m pip install --pre iree-base-compiler iree-base-runtime iree-tools-tf -f https://iree.dev/pip-release-links.html"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "code",
"metadata": {},
"source": [
"#@title Imports and common setup\n",
"\n",
"from iree import runtime as ireert\n",
"from iree.tf.support import module_utils\n",
"\n",
"import tensorflow as tf\n",
"from matplotlib import pyplot as plt\n",
"\n",
"# Print version information for future notebook users to reference.\n",
"!iree-compile --version\n",
"print(\"TensorFlow version: \", tf.__version__)"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "code",
"metadata": {},
"source": [
"#@title Construct a pretrained ResNet model with ImageNet weights\n",
"\n",
"# Static shape, including batch size (1).\n",
"# Can be dynamic once dynamic shape support is ready.\n",
"INPUT_SHAPE = [1, 224, 224, 3]\n",
"\n",
"tf_model = tf.keras.applications.resnet50.ResNet50(\n",
" weights=\"imagenet\", include_top=True, input_shape=tuple(INPUT_SHAPE[1:]))\n",
"\n",
"# Wrap the model in a tf.Module to compile it with IREE.\n",
"class ResNetModule(tf.Module):\n",
"\n",
" def __init__(self):\n",
" super(ResNetModule, self).__init__()\n",
" self.model = tf_model\n",
"\n",
" @tf.function(input_signature=[tf.TensorSpec(INPUT_SHAPE, tf.float32)])\n",
" def predict(self, x):\n",
" return self.model.call(x, training=False)"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "code",
"metadata": {},
"source": [
"#@markdown ### Backend Configuration\n",
"\n",
"backend_choice = \"iree_llvmcpu (CPU)\" #@param [ \"iree_vmvx (CPU)\", \"iree_llvmcpu (CPU)\", \"iree_vulkan (GPU/SwiftShader)\" ]\n",
"backend_choice = backend_choice.split(\" \")[0]\n",
"backend = module_utils.BackendInfo(backend_choice)"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "code",
"metadata": {},
"source": [
"#@title Compile ResNet with IREE\n",
"# This may take a few minutes.\n",
"iree_module = backend.compile_from_class(ResNetModule, [\"predict\"])"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "code",
"metadata": {},
"source": [
"#@title Load a test image of a [labrador](https://commons.wikimedia.org/wiki/File:YellowLabradorLooking_new.jpg)\n",
"\n",
"def load_image(path_to_image):\n",
" image = tf.io.read_file(path_to_image)\n",
" image = tf.image.decode_image(image, channels=3)\n",
" image = tf.image.resize(image, (224, 224))\n",
" image = image[tf.newaxis, :]\n",
" return image\n",
"\n",
"content_path = tf.keras.utils.get_file(\n",
" 'YellowLabradorLooking_new.jpg',\n",
" 'https://storage.googleapis.com/download.tensorflow.org/example_images/YellowLabradorLooking_new.jpg')\n",
"content_image = load_image(content_path)\n",
"\n",
"print(\"Test image:\")\n",
"plt.imshow(content_image.numpy().reshape(224, 224, 3) / 255.0)\n",
"plt.axis(\"off\")\n",
"plt.tight_layout()"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "code",
"metadata": {},
"source": [
"#@title Model pre- and post-processing\n",
"input_data = tf.keras.applications.resnet50.preprocess_input(content_image)\n",
"\n",
"def decode_result(result):\n",
" return tf.keras.applications.resnet50.decode_predictions(result, top=3)[0]"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "code",
"metadata": {},
"source": [
"#@title Run TF model\n",
"\n",
"print(\"TF prediction:\")\n",
"tf_result = tf_model.predict(input_data)\n",
"print(decode_result(tf_result))"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "code",
"metadata": {},
"source": [
"#@title Run the model compiled with IREE\n",
"\n",
"print(\"IREE prediction:\")\n",
"iree_result = iree_module.predict(input_data)\n",
"print(decode_result(iree_result))"
],
"execution_count": null,
"outputs": []
}
]
}