# We are making use of the GPU here, so remember to enable it on Colab by:
# Runtime >> Change runtime type >> Hardware accelerator (before starting the VM).
!pip install -q tensorflow-gpu==2.0.0
|████████████████████████████████| 380.8MB 47kB/s |████████████████████████████████| 450kB 65.3MB/s |████████████████████████████████| 3.8MB 64.5MB/s |████████████████████████████████| 81kB 14.1MB/s ERROR: tensorflow 1.15.0 has requirement tensorboard<1.16.0,>=1.15.0, but you'll have tensorboard 2.0.2 which is incompatible. ERROR: tensorflow 1.15.0 has requirement tensorflow-estimator==1.15.1, but you'll have tensorflow-estimator 2.0.1 which is incompatible. ERROR: tensorboard 2.0.2 has requirement grpcio>=1.24.3, but you'll have grpcio 1.15.0 which is incompatible. ERROR: google-colab 1.0.0 has requirement google-auth~=1.4.0, but you'll have google-auth 1.7.1 which is incompatible.
# We will use TF Datasets for the dataset
!pip install --upgrade tensorflow_datasets
Requirement already up-to-date: tensorflow_datasets in /usr/local/lib/python3.6/dist-packages (1.3.0) Requirement already satisfied, skipping upgrade: six in /usr/local/lib/python3.6/dist-packages (from tensorflow_datasets) (1.12.0) Requirement already satisfied, skipping upgrade: numpy in /usr/local/lib/python3.6/dist-packages (from tensorflow_datasets) (1.17.4) Requirement already satisfied, skipping upgrade: dill in /usr/local/lib/python3.6/dist-packages (from tensorflow_datasets) (0.3.1.1) Requirement already satisfied, skipping upgrade: attrs in /usr/local/lib/python3.6/dist-packages (from tensorflow_datasets) (19.3.0) Requirement already satisfied, skipping upgrade: tensorflow-metadata in /usr/local/lib/python3.6/dist-packages (from tensorflow_datasets) (0.15.1) Requirement already satisfied, skipping upgrade: wrapt in /usr/local/lib/python3.6/dist-packages (from tensorflow_datasets) (1.11.2) Requirement already satisfied, skipping upgrade: requests>=2.19.0 in /usr/local/lib/python3.6/dist-packages (from tensorflow_datasets) (2.21.0) Requirement already satisfied, skipping upgrade: future in /usr/local/lib/python3.6/dist-packages (from tensorflow_datasets) (0.16.0) Requirement already satisfied, skipping upgrade: protobuf>=3.6.1 in /usr/local/lib/python3.6/dist-packages (from tensorflow_datasets) (3.10.0) Requirement already satisfied, skipping upgrade: tqdm in /usr/local/lib/python3.6/dist-packages (from tensorflow_datasets) (4.28.1) Requirement already satisfied, skipping upgrade: absl-py in /usr/local/lib/python3.6/dist-packages (from tensorflow_datasets) (0.8.1) Requirement already satisfied, skipping upgrade: promise in /usr/local/lib/python3.6/dist-packages (from tensorflow_datasets) (2.2.1) Requirement already satisfied, skipping upgrade: termcolor in /usr/local/lib/python3.6/dist-packages (from tensorflow_datasets) (1.1.0) Requirement already satisfied, skipping upgrade: googleapis-common-protos in /usr/local/lib/python3.6/dist-packages (from tensorflow-metadata->tensorflow_datasets) (1.6.0) Requirement already satisfied, skipping upgrade: chardet<3.1.0,>=3.0.2 in /usr/local/lib/python3.6/dist-packages (from requests>=2.19.0->tensorflow_datasets) (3.0.4) Requirement already satisfied, skipping upgrade: idna<2.9,>=2.5 in /usr/local/lib/python3.6/dist-packages (from requests>=2.19.0->tensorflow_datasets) (2.8) Requirement already satisfied, skipping upgrade: urllib3<1.25,>=1.21.1 in /usr/local/lib/python3.6/dist-packages (from requests>=2.19.0->tensorflow_datasets) (1.24.3) Requirement already satisfied, skipping upgrade: certifi>=2017.4.17 in /usr/local/lib/python3.6/dist-packages (from requests>=2.19.0->tensorflow_datasets) (2019.9.11) Requirement already satisfied, skipping upgrade: setuptools in /usr/local/lib/python3.6/dist-packages (from protobuf>=3.6.1->tensorflow_datasets) (42.0.1)
import tensorflow as tf
import numpy as np
import tensorflow_datasets as tfds
# Eurosat is a dataset of terrain classification from satellite measurements
dataset = tfds.load(name="eurosat", split=tfds.Split.TRAIN, as_supervised=True)
Downloading and preparing dataset eurosat (89.91 MiB) to /root/tensorflow_datasets/eurosat/rgb/2.0.0...
HBox(children=(IntProgress(value=1, bar_style='info', description='Dl Completed...', max=1, style=ProgressStyl…
HBox(children=(IntProgress(value=1, bar_style='info', description='Dl Size...', max=1, style=ProgressStyle(des…
HBox(children=(IntProgress(value=1, bar_style='info', description='Extraction completed...', max=1, style=Prog…
HBox(children=(IntProgress(value=1, bar_style='info', max=1), HTML(value='')))
Shuffling and writing examples to /root/tensorflow_datasets/eurosat/rgb/2.0.0.incompleteUQZYVU/eurosat-train.tfrecord
HBox(children=(IntProgress(value=0, max=27000), HTML(value='')))
Dataset eurosat downloaded and prepared to /root/tensorflow_datasets/eurosat/rgb/2.0.0. Subsequent calls will reuse this data.
import matplotlib.pyplot as plt
for xb, yb in dataset.take(1):
print(xb.shape)
plt.imshow(xb)
print(yb)
(64, 64, 3) tf.Tensor(4, shape=(), dtype=int64)
# Standard preprocessing (pixel scaling + one-hot encoding on the labels)
def preprocess_image(im, label):
im = tf.cast(im, tf.float32) / 255.0
label = tf.one_hot(label, 10)
return im, label
dataset = dataset.map(preprocess_image)
test_dataset = dataset.take(1000)
train_dataset = dataset.skip(1000)
from tensorflow.keras import Model
from tensorflow.keras.layers import Conv2D, MaxPooling2D, Dropout, Dense, Flatten, Input
def build_network():
im = Input(shape=(64, 64, 3))
x = Conv2D(64, 3, padding='same', activation='relu')(im)
x = Conv2D(64, 3, padding='same', activation='relu')(x)
x = MaxPooling2D(2)(x)
x = Conv2D(64, 3, padding='same', activation='relu')(x)
x = Conv2D(64, 3, padding='same', activation='relu')(x)
x = MaxPooling2D(2)(x)
x = Flatten()(x)
x = Dropout(0.4)(x)
x = Dense(10, activation='softmax')(x)
return Model(inputs=[im], outputs=[x])
net = build_network()
from tensorflow.keras import losses, metrics, optimizers
loss = losses.CategoricalCrossentropy()
opt = optimizers.Adam(0.001)
net.compile(loss=loss, optimizer=opt, metrics=[metrics.BinaryAccuracy()])
net.fit(train_dataset.shuffle(1000).batch(32), epochs=3)
for xb, yb in test_dataset.batch(1):
print(np.argmax(yb, axis=1))
print(net.predict(xb))
print(tf.argmax(net.predict(xb), axis=1))
break
[4] [[2.0800373e-13 5.3180857e-22 6.3897234e-05 2.4762763e-05 9.9982941e-01 2.8306911e-11 1.6020052e-06 7.1843242e-05 8.4359590e-06 1.0046079e-16]] tf.Tensor([4], shape=(1,), dtype=int64)
plt.imshow(xb[0])
<matplotlib.image.AxesImage at 0x7f3adfe266a0>
# We use the IBM Adversarial Robustness 360 Toolbox
!pip install adversarial-robustness-toolbox
Collecting adversarial-robustness-toolbox Downloading https://files.pythonhosted.org/packages/a7/26/140791dead9918e3ce7a1d9ffed835606a5e2ec03dead859f1b96c023eac/Adversarial_Robustness_Toolbox-1.0.1-py3-none-any.whl (375kB) |████████████████████████████████| 378kB 37.7MB/s Requirement already satisfied: six in /usr/local/lib/python3.6/dist-packages (from adversarial-robustness-toolbox) (1.12.0) Requirement already satisfied: scipy in /usr/local/lib/python3.6/dist-packages (from adversarial-robustness-toolbox) (1.3.3) Requirement already satisfied: scikit-learn in /usr/local/lib/python3.6/dist-packages (from adversarial-robustness-toolbox) (0.21.3) Requirement already satisfied: matplotlib in /usr/local/lib/python3.6/dist-packages (from adversarial-robustness-toolbox) (3.1.2) Requirement already satisfied: setuptools in /usr/local/lib/python3.6/dist-packages (from adversarial-robustness-toolbox) (42.0.1) Requirement already satisfied: numpy in /usr/local/lib/python3.6/dist-packages (from adversarial-robustness-toolbox) (1.17.4) Requirement already satisfied: joblib>=0.11 in /usr/local/lib/python3.6/dist-packages (from scikit-learn->adversarial-robustness-toolbox) (0.14.0) Requirement already satisfied: cycler>=0.10 in /usr/local/lib/python3.6/dist-packages (from matplotlib->adversarial-robustness-toolbox) (0.10.0) Requirement already satisfied: pyparsing!=2.0.4,!=2.1.2,!=2.1.6,>=2.0.1 in /usr/local/lib/python3.6/dist-packages (from matplotlib->adversarial-robustness-toolbox) (2.4.5) Requirement already satisfied: python-dateutil>=2.1 in /usr/local/lib/python3.6/dist-packages (from matplotlib->adversarial-robustness-toolbox) (2.6.1) Requirement already satisfied: kiwisolver>=1.0.1 in /usr/local/lib/python3.6/dist-packages (from matplotlib->adversarial-robustness-toolbox) (1.1.0) Installing collected packages: adversarial-robustness-toolbox Successfully installed adversarial-robustness-toolbox-1.0.1
from art.classifiers import TensorFlowV2Classifier
from art.attacks import FastGradientMethod
# First, we need to wrap the classifier in a TensorFlowV2Classifier object
# It allows the toolbox to compute the gradients of the model in a framework-agnostic way
classifier = TensorFlowV2Classifier(model=net, nb_classes=10, loss_object=losses.SparseCategoricalCrossentropy(), clip_values=(0, 1))
# We use a fast gradient sign attack
attack_fgsm = FastGradientMethod(classifier=classifier, eps=0.05, eps_step=0.01)
# Do the attack on the previous image
x_test_adv = attack_fgsm.generate(xb.numpy())
plt.imshow(x_test_adv[0])
<matplotlib.image.AxesImage at 0x7f39b5c4d0f0>
for xb, yb in test_dataset.batch(1):
print(yb)
print(net.predict(x_test_adv))
print(tf.argmax(net.predict(x_test_adv), axis=1))
break
tf.Tensor([[0. 0. 0. 0. 1. 0. 0. 0. 0. 0.]], shape=(1, 10), dtype=float32) [[1.03961595e-16 3.49431994e-17 6.08167786e-04 3.34765464e-05 1.65585720e-03 2.46636080e-11 3.20278275e-07 9.97701585e-01 6.17172361e-07 1.06402567e-17]] tf.Tensor([7], shape=(1,), dtype=int64)
# Check out the other examples!
# https://github.com/IBM/adversarial-robustness-toolbox/blob/master/examples/README.md
# We use the tf-explain library
!pip install tf-explain
Collecting tf-explain Downloading https://files.pythonhosted.org/packages/1e/1e/556ec1e91b100de61941a7c91589ce29be1afdc53d52658d2045ba84a7ab/tf_explain-0.1.0-py3-none-any.whl Requirement already satisfied: opencv-python>=4.1.0.25 in /usr/local/lib/python3.6/dist-packages (from tf-explain) (4.1.2.30) Requirement already satisfied: numpy>=1.11.3 in /usr/local/lib/python3.6/dist-packages (from opencv-python>=4.1.0.25->tf-explain) (1.17.4) Installing collected packages: tf-explain Successfully installed tf-explain-0.1.0
from tf_explain import callbacks
# Get a small batch of images for the visualizations during training
Xval, yval = next(iter(test_dataset.batch(2)))
Xval, yval = Xval.numpy(), yval.numpy()
plt.imshow(Xval[1])
yval[1]
array([0., 0., 0., 0., 0., 0., 0., 0., 1., 0.], dtype=float32)
# We add a visualization on the activations
vis = callbacks.ActivationsVisualizationCallback(
validation_data=(Xval[1:], yval[1:]),
layers_name=["conv2d_3"],
output_dir='./visualizations',
)
net = build_network()
net.compile(loss=losses.CategoricalCrossentropy(), optimizer=optimizers.Adam(), metrics=['accuracy'])
net.fit(dataset.shuffle(1000).batch(32), epochs=3, callbacks=[vis])
# Needed for the Tensorboard
!pip install --upgrade grpcio
Collecting grpcio Downloading https://files.pythonhosted.org/packages/27/28/280658104af767431cf25e397157c4f4a8724a446f9dd5a34dac9812e9c9/grpcio-1.25.0-cp36-cp36m-manylinux2010_x86_64.whl (2.4MB) |████████████████████████████████| 2.4MB 6.7MB/s Requirement already satisfied, skipping upgrade: six>=1.5.2 in /usr/local/lib/python3.6/dist-packages (from grpcio) (1.12.0) ERROR: tensorflow 1.15.0 has requirement tensorboard<1.16.0,>=1.15.0, but you'll have tensorboard 2.0.1 which is incompatible. ERROR: tensorflow 1.15.0 has requirement tensorflow-estimator==1.15.1, but you'll have tensorflow-estimator 2.0.1 which is incompatible. Installing collected packages: grpcio Found existing installation: grpcio 1.15.0 Uninstalling grpcio-1.15.0: Successfully uninstalled grpcio-1.15.0 Successfully installed grpcio-1.25.0
%load_ext tensorboard
# Check the visualizations!
%tensorboard --logdir ./visualizations
!pip install lime
Collecting lime Downloading https://files.pythonhosted.org/packages/e5/72/4be533df5151fcb48942515e95e88281ec439396c48d67d3ae41f27586f0/lime-0.1.1.36.tar.gz (275kB) |████████████████████████████████| 276kB 6.6MB/s Requirement already satisfied: numpy in /usr/local/lib/python3.6/dist-packages (from lime) (1.17.3) Requirement already satisfied: scipy in /usr/local/lib/python3.6/dist-packages (from lime) (1.3.1) Requirement already satisfied: scikit-learn>=0.18 in /usr/local/lib/python3.6/dist-packages (from lime) (0.21.3) Requirement already satisfied: matplotlib in /usr/local/lib/python3.6/dist-packages (from lime) (3.1.1) Requirement already satisfied: scikit-image>=0.12 in /usr/local/lib/python3.6/dist-packages (from lime) (0.15.0) Requirement already satisfied: joblib>=0.11 in /usr/local/lib/python3.6/dist-packages (from scikit-learn>=0.18->lime) (0.14.0) Requirement already satisfied: pyparsing!=2.0.4,!=2.1.2,!=2.1.6,>=2.0.1 in /usr/local/lib/python3.6/dist-packages (from matplotlib->lime) (2.4.2) Requirement already satisfied: cycler>=0.10 in /usr/local/lib/python3.6/dist-packages (from matplotlib->lime) (0.10.0) Requirement already satisfied: python-dateutil>=2.1 in /usr/local/lib/python3.6/dist-packages (from matplotlib->lime) (2.6.1) Requirement already satisfied: kiwisolver>=1.0.1 in /usr/local/lib/python3.6/dist-packages (from matplotlib->lime) (1.1.0) Requirement already satisfied: networkx>=2.0 in /usr/local/lib/python3.6/dist-packages (from scikit-image>=0.12->lime) (2.4) Requirement already satisfied: imageio>=2.0.1 in /usr/local/lib/python3.6/dist-packages (from scikit-image>=0.12->lime) (2.4.1) Requirement already satisfied: PyWavelets>=0.4.0 in /usr/local/lib/python3.6/dist-packages (from scikit-image>=0.12->lime) (1.1.1) Requirement already satisfied: pillow>=4.3.0 in /usr/local/lib/python3.6/dist-packages (from scikit-image>=0.12->lime) (4.3.0) Requirement already satisfied: six in /usr/local/lib/python3.6/dist-packages (from cycler>=0.10->matplotlib->lime) (1.12.0) Requirement already satisfied: setuptools in /usr/local/lib/python3.6/dist-packages (from kiwisolver>=1.0.1->matplotlib->lime) (41.4.0) Requirement already satisfied: decorator>=4.3.0 in /usr/local/lib/python3.6/dist-packages (from networkx>=2.0->scikit-image>=0.12->lime) (4.4.1) Requirement already satisfied: olefile in /usr/local/lib/python3.6/dist-packages (from pillow>=4.3.0->scikit-image>=0.12->lime) (0.46) Building wheels for collected packages: lime Building wheel for lime (setup.py) ... done Created wheel for lime: filename=lime-0.1.1.36-cp36-none-any.whl size=284191 sha256=29b4c045f6c4f542a3538d8d6c2a8ad1ca282029837b9fa5ca42ccebe854f26c Stored in directory: /root/.cache/pip/wheels/a9/2f/25/4b2127822af5761dab9a27be52e175105772aebbcbc484fb95 Successfully built lime Installing collected packages: lime Successfully installed lime-0.1.1.36
# Check out the documentation!
# https://github.com/marcotcr/lime
from lime import lime_image
explainer = lime_image.LimeImageExplainer()
explanation = explainer.explain_instance(Xval[1], net.predict, hide_color=0, num_samples=1000)
from skimage.segmentation import mark_boundaries
temp, mask = explanation.get_image_and_mask(explanation.top_labels[0], positive_only=False, num_features=3, min_weight=0.1)
plt.imshow(mark_boundaries(temp / 2 + 0.5, mask))
<matplotlib.image.AxesImage at 0x7f2320489cc0>