{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"pygments_lexer":"ipython3","nbconvert_exporter":"python","version":"3.6.4","file_extension":".py","codemirror_mode":{"name":"ipython","version":3},"name":"python","mimetype":"text/x-python"}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"markdown","source":"","metadata":{}},{"cell_type":"markdown","source":"# Visualize Activations","metadata":{}},{"cell_type":"code","source":"import os\nimport numpy as np\nimport matplotlib.pyplot as plt\nimport matplotlib.image as mpimg\nimport pandas as pd\nimport pickle\n\nfrom sklearn.model_selection import train_test_split\n\nimport tensorflow as tf\nfrom tensorflow.keras.models import Sequential, load_model\nfrom tensorflow.keras.layers import *\nfrom tensorflow.keras.preprocessing.image import ImageDataGenerator\n\nimport zipfile \n","metadata":{"execution":{"iopub.status.busy":"2021-11-29T06:29:03.826011Z","iopub.execute_input":"2021-11-29T06:29:03.826304Z","iopub.status.idle":"2021-11-29T06:29:06.244910Z","shell.execute_reply.started":"2021-11-29T06:29:03.826224Z","shell.execute_reply":"2021-11-29T06:29:06.243580Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Load Dataframe","metadata":{}},{"cell_type":"code","source":"train_full = pd.read_csv(\"../input/histopathologic-cancer-detection/train_labels.csv\", dtype=str)\nprint(train_full.shape)","metadata":{"execution":{"iopub.status.busy":"2021-11-29T06:29:06.246952Z","iopub.execute_input":"2021-11-29T06:29:06.247230Z","iopub.status.idle":"2021-11-29T06:29:06.545886Z","shell.execute_reply.started":"2021-11-29T06:29:06.247197Z","shell.execute_reply":"2021-11-29T06:29:06.544610Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_full.head(10)","metadata":{"execution":{"iopub.status.busy":"2021-11-29T06:29:06.547995Z","iopub.execute_input":"2021-11-29T06:29:06.548738Z","iopub.status.idle":"2021-11-29T06:29:06.567146Z","shell.execute_reply.started":"2021-11-29T06:29:06.548683Z","shell.execute_reply":"2021-11-29T06:29:06.565205Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Extract Images","metadata":{}},{"cell_type":"code","source":"train_full.id = train_full.id + '.tif'\n\nprint(train_full.head())","metadata":{"execution":{"iopub.status.busy":"2021-11-29T06:29:06.569708Z","iopub.execute_input":"2021-11-29T06:29:06.570459Z","iopub.status.idle":"2021-11-29T06:29:06.623610Z","shell.execute_reply.started":"2021-11-29T06:29:06.570411Z","shell.execute_reply":"2021-11-29T06:29:06.622913Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_path = \"../input/histopathologic-cancer-detection/train/\"\nprint('Training Images:', len(os.listdir(train_path)))","metadata":{"execution":{"iopub.status.busy":"2021-11-29T06:29:06.624978Z","iopub.execute_input":"2021-11-29T06:29:06.625341Z","iopub.status.idle":"2021-11-29T06:29:06.832239Z","shell.execute_reply.started":"2021-11-29T06:29:06.625311Z","shell.execute_reply":"2021-11-29T06:29:06.831580Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print('Training Images:', len(os.listdir('../input/histopathologic-cancer-detection/train/')))\n\nfor i in range(10):\n  img = plt.imread('../input/histopathologic-cancer-detection/train/' + train_full.id[i])\n  print('Images shape', img.shape)","metadata":{"execution":{"iopub.status.busy":"2021-11-29T06:29:06.833490Z","iopub.execute_input":"2021-11-29T06:29:06.833895Z","iopub.status.idle":"2021-11-29T06:29:07.060900Z","shell.execute_reply.started":"2021-11-29T06:29:06.833850Z","shell.execute_reply":"2021-11-29T06:29:07.060032Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# View Sample of Images","metadata":{}},{"cell_type":"code","source":"sample = train_full.sample(n=16).reset_index()\n\nplt.figure(figsize=(8,8))\n\nfor i, row in sample.iterrows():\n\n    img = mpimg.imread(f'../input/histopathologic-cancer-detection/train/{row.id}')    \n    label = row.label\n\n    plt.subplot(4,4,i+1)\n    plt.imshow(img)\n    plt.text(0, -5, f'Class {label}', color='k')\n        \n    plt.axis('off')\n\nplt.tight_layout()\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2021-11-29T06:29:07.062294Z","iopub.execute_input":"2021-11-29T06:29:07.062523Z","iopub.status.idle":"2021-11-29T06:29:08.486154Z","shell.execute_reply.started":"2021-11-29T06:29:07.062494Z","shell.execute_reply":"2021-11-29T06:29:08.485313Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Load Model","metadata":{}},{"cell_type":"code","source":"cnn = load_model('../input/cancer-detection-final2/cancer_model_v12.h5')\ncnn.summary()","metadata":{"execution":{"iopub.status.busy":"2021-11-29T06:29:08.487453Z","iopub.execute_input":"2021-11-29T06:29:08.488292Z","iopub.status.idle":"2021-11-29T06:29:10.793824Z","shell.execute_reply.started":"2021-11-29T06:29:08.488250Z","shell.execute_reply":"2021-11-29T06:29:10.792774Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Filter Visualization Functions\nThe functions in the cell below can be used to create a single filter visualization.","metadata":{}},{"cell_type":"code","source":"def compute_loss(input_image, layer, filter_index):\n    feature_extractor = tf.keras.Model(inputs=cnn.inputs, outputs=layer.output)\n    activation = feature_extractor(input_image)\n    # We avoid border artifacts by only involving non-border pixels in the loss.\n    filter_activation = activation[:, 2:-2, 2:-2, filter_index]\n    return tf.reduce_mean(filter_activation)\n\ndef gradient_ascent_step(img, layer, filter_index, learning_rate):\n    with tf.GradientTape() as tape:\n        tape.watch(img)\n        loss = compute_loss(img, layer, filter_index)\n    # Compute gradients.\n    grads = tape.gradient(loss, img)\n    # Normalize gradients.\n    grads = tf.math.l2_normalize(grads)\n    img += learning_rate * grads\n    return loss, img\ndef initialize_image():\n    img = tf.random.uniform((1, 96, 96, 3))\n    # ResNet50V2 expects inputs in the range [-1, +1].\n    # Here we scale our random inputs to [-0.125, +0.125]\n    return (img - 0.5) * 0.25\n\n\ndef visualize_filter(layer, filter_index, steps, learning_rate):\n    img = initialize_image()\n    for iteration in range(steps):\n        loss, img = gradient_ascent_step(img, layer, filter_index, learning_rate)\n\n    # Decode the resulting input image\n    img = deprocess_image(img[0].numpy())\n    return loss, img\n\ndef deprocess_image(img):\n    # Normalize array: center on 0., ensure variance is 0.15\n    img -= img.mean()\n    img /= img.std() + 1e-5\n    img *= 0.15\n\n    # Clip to [0, 1]\n    img += 0.5\n    img = np.clip(img, 0, 1)\n\n    # Convert to RGB array\n    img *= 255\n    img = np.clip(img, 0, 255).astype(\"uint8\")\n    return img","metadata":{"execution":{"iopub.status.busy":"2021-11-29T06:29:10.795284Z","iopub.execute_input":"2021-11-29T06:29:10.795537Z","iopub.status.idle":"2021-11-29T06:29:10.810341Z","shell.execute_reply.started":"2021-11-29T06:29:10.795505Z","shell.execute_reply":"2021-11-29T06:29:10.809156Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"The function in the cell below will create visualizations for all filters in a selected layer.","metadata":{}},{"cell_type":"code","source":"def display_layer_filters(layer_name, steps=60, learning_rate=1):\n    layer = cnn.get_layer(name=layer_name)\n            \n    n_filters = layer.filters\n    n_cols = 8\n    n_rows = n_filters // n_cols\n    \n    print(f'{layer_name} - {n_filters} filters')\n    \n    plt.figure(figsize=[2*n_cols, 2*n_rows])\n    for i in range(n_filters):\n        plt.subplot(n_rows, n_cols, i+1)\n        loss, img = visualize_filter(layer, i, steps, learning_rate)\n        plt.imshow(img)\n        plt.axis('off')\n    plt.show()","metadata":{"execution":{"iopub.status.busy":"2021-11-29T06:29:10.812241Z","iopub.execute_input":"2021-11-29T06:29:10.812930Z","iopub.status.idle":"2021-11-29T06:29:10.830908Z","shell.execute_reply.started":"2021-11-29T06:29:10.812874Z","shell.execute_reply":"2021-11-29T06:29:10.829858Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Visualizing Individual Laters","metadata":{}},{"cell_type":"code","source":"display_layer_filters('conv2d')","metadata":{"execution":{"iopub.status.busy":"2021-11-29T06:29:10.832919Z","iopub.execute_input":"2021-11-29T06:29:10.833346Z","iopub.status.idle":"2021-11-29T06:29:35.691942Z","shell.execute_reply.started":"2021-11-29T06:29:10.833309Z","shell.execute_reply":"2021-11-29T06:29:35.691077Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"display_layer_filters('conv2d_1', steps=200)","metadata":{"execution":{"iopub.status.busy":"2021-11-29T06:29:35.693242Z","iopub.execute_input":"2021-11-29T06:29:35.693676Z","iopub.status.idle":"2021-11-29T06:33:17.824039Z","shell.execute_reply.started":"2021-11-29T06:29:35.693637Z","shell.execute_reply":"2021-11-29T06:33:17.822813Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"display_layer_filters('conv2d_2', steps=200, learning_rate=1)","metadata":{"execution":{"iopub.status.busy":"2021-11-29T06:33:17.827888Z","iopub.execute_input":"2021-11-29T06:33:17.828665Z","iopub.status.idle":"2021-11-29T06:43:30.033670Z","shell.execute_reply.started":"2021-11-29T06:33:17.828590Z","shell.execute_reply":"2021-11-29T06:43:30.032500Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"display_layer_filters('conv2d_3', steps=200, learning_rate=1)","metadata":{"execution":{"iopub.status.busy":"2021-11-29T06:43:30.035410Z","iopub.execute_input":"2021-11-29T06:43:30.036345Z","iopub.status.idle":"2021-11-29T06:56:42.719537Z","shell.execute_reply.started":"2021-11-29T06:43:30.036298Z","shell.execute_reply":"2021-11-29T06:56:42.718772Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Display All Convolutional Filters","metadata":{}},{"cell_type":"code","source":"for layer in cnn.layers:\n    if 'conv' in layer.name:\n        display_layer_filters(layer.name, steps=200)","metadata":{"execution":{"iopub.status.busy":"2021-11-29T06:56:42.721356Z","iopub.execute_input":"2021-11-29T06:56:42.722027Z","iopub.status.idle":"2021-11-29T08:31:24.664006Z","shell.execute_reply.started":"2021-11-29T06:56:42.721967Z","shell.execute_reply":"2021-11-29T08:31:24.662618Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"","metadata":{}}]}