Module09 Deep Learning 02-Part03
Module09 Deep Learning 02-Part03
Module09 Deep Learning 02-Part03
Dans cette section, nous allons implémenter couches convolutives (CONV) et pooling (POOL) dans numpy
pour vous expliquer l'opération de convolution ainsi d'appliquer deux types différents d'opération de
pooling.
“
Objective de ce chapitre
3.1 Packages
Importons d'abord tous les packages dont vous aurez besoin lors de cette section.
import numpy as np
import h5py
import matplotlib.pyplot as plt
%matplotlib inline
plt.rcParams['figure.figsize'] = (5.0, 4.0) # set default size of plots
plt.rcParams['image.interpolation'] = 'nearest'
plt.rcParams['image.cmap'] = 'gray'
%load_ext autoreload
%autoreload 2
np.random.seed(1)
3.2 Zero-Padding
Cette fonction Zero-padding ajoute des zéros autour de la bordure d'une image. Ci dessous un exemple
avec pad=1.
Pour rappel, les principaux avantages du remplissage(padding) sont:
Il permet d'utiliser une couche CONV sans forcément réduire la hauteur et la largeur des volumes. Ceci
est important pour construire des réseaux plus profonds, car sinon la hauteur / largeur diminuerait à
mesure que vous iriez vers des couches plus profondes. Un cas particulier important est la «même»
convolution, dans laquelle la hauteur / largeur est exactement préservée après une couche.
Cela nous aide à conserver davantage d'informations au bord d'une image. Sans remplissage, très peu
de valeurs du calque suivant seraient affectées par des pixels sur les bords d'une image.
3.2.1 Exercice
Implémentez la fonction suivante zero_pad , qui remplit toutes les images d'un lot d'exemples X avec des
zéros. (Hint, utiliser numpy.pad)
A noter si vous voulez remplir le array "a" de forme avec pad = 1 pour la 2ème dimension, pad
= 3 pour la 4ème dimension et pad = 0 pour le reste, vous feriez:
Argument:
X -- python numpy array of shape (m, n_H, n_W, n_C) representing a batch of m
images
pad -- integer, amount of padding around each image on vertical and horizontal
dimensions
Returns:
X_pad -- padded image of shape (m, n_H + 2*pad, n_W + 2*pad, n_C)
"""
return X_pad
Expected output:
np.random.seed(1)
x = np.random.randn(4, 3, 3, 2)
x_pad = zero_pad(x, 2)
print ("x.shape =", x.shape)
print ("x_pad.shape =", x_pad.shape)
print ("x[1, 1] =", x[1, 1])
print ("x_pad[1, 1] =", x_pad[1, 1])
Dans cette partie, implémentez une seule étape de convolution, dans laquelle vous appliquez le filtre à une
seule position de l'entrée. Cela sera utilisé pour construire une unité convolutive, qui:
Dans cette première étape de l'exercice, vous implémenterez une seule étape de convolution,
correspondant à l'application d'un filtre à une seule des positions pour obtenir une seule sortie à valeur
réelle.
3.3.1 Exercice
Arguments:
a_slice_prev -- slice of input data of shape (f, f, n_C_prev)
W -- Weight parameters contained in a window - matrix of shape (f, f,
n_C_prev)
b -- Bias parameters contained in a window - matrix of shape (1, 1, 1)
Returns:
Z -- a scalar value, result of convolving the sliding window (W, b) on a slice
x of the input data
"""
return Z
Expected output:
np.random.seed(1)
a_slice_prev = np.random.randn(3, 3, 3)
W = np.random.randn(3, 3, 3)
b = np.random.randn(1, 1, 1)
Z = conv_single_step(a_slice_prev, W, b)
print("Z =", Z)
assert (type(Z) == np.float64 or type(Z) == np.float32), "You must cast the output
to float"
assert np.isclose(Z, -10.624), "Wrong value"
Dans la passe avant, vous prendrez de nombreux filtres et les convolverez sur l'entrée. Chaque
«convolution» vous donne une sortie de matrice 2D. Vous allez ensuite empiler ces sorties pour obtenir un
volume 3D:
3.4.1 Exercice
Implémentez la fonction ci-dessous pour convoluer les filtres W sur une activation d'entrée A_prev. Cette
fonction prend comme entrée A_prev, les activations sorties par la couche précédente (pour un lot de m
entrées), F filtres / poids notés W, et un vecteur de biais noté b, où chaque filtre a son propre (unique) biais.
Enfin, vous avez également accès au dictionnaire des hyperparamètres qui contient la foulée et le
remplissage.
Hint:
1. Pour sélectionner une tranche 2x2 dans le coin supérieur gauche d'une matrice "a_prev" (shape
(5,5,3)), vous feriez:
a_slice_prev = a_prev[0:2,0:2,:]
2. Pour définir une_slice, vous devrez d'abord définir ses coins vert_start, vert_end, horiz_start et
horiz_end. Cette figure peut vous aider à trouver comment chacun des coins peut être défini à l'aide
de h, w, f et s dans le code ci-dessous.
3. Pour cet exercice, nous ne nous soucierons pas de la vectorisation, et nous implémenterons
simplement tout avec des boucles for.
Arguments:
A_prev -- output activations of the previous layer, numpy array of shape (m,
n_H_prev, n_W_prev, n_C_prev)
W -- Weights, numpy array of shape (f, f, n_C_prev, n_C)
b -- Biases, numpy array of shape (1, 1, 1, n_C)
hparameters -- python dictionary containing "stride" and "pad"
Returns:
Z -- conv output, numpy array of shape (m, n_H, n_W, n_C)
cache -- cache of values needed for the conv_backward() function
"""
return Z, cache
Expected output:
np.random.seed(1)
A_prev = np.random.randn(10, 10, 10, 4)
W = np.random.randn(3, 3, 4, 8)
b = np.random.randn(1, 1, 1, 8)
hparameters = {"pad" : 1,
"stride": 2}
3.5.1 Exercice
Arguments:
A_prev -- Input data, numpy array of shape (m, n_H_prev, n_W_prev, n_C_prev)
hparameters -- python dictionary containing "f" and "stride"
mode -- the pooling mode you would like to use, defined as a string ("max" or
"average")
Returns:
A -- output of the pool layer, a numpy array of shape (m, n_H, n_W, n_C)
cache -- cache used in the backward pass of the pooling layer, contains the
input and hparameters
"""
return A, cache
Expected output:
# Case 1: stride of 1
np.random.seed(1)
A_prev = np.random.randn(2, 5, 5, 3)
hparameters = {"stride" : 1, "f": 3}
mode = max
A.shape = (2, 3, 3, 3)
A[1, 1] =
[[1.96710175 0.84616065 1.27375593]
[1.96710175 0.84616065 1.23616403]
[1.62765075 1.12141771 1.2245077 ]]
mode = average
A.shape = (2, 3, 3, 3)
A[1, 1] =
[[ 0.44497696 -0.00261695 -0.31040307]
[ 0.50811474 -0.23493734 -0.23961183]
[ 0.11872677 0.17255229 -0.22112197]]
# Case 2: stride of 2
np.random.seed(1)
A_prev = np.random.randn(2, 5, 5, 3)
hparameters = {"stride" : 2, "f": 3}
mode = max
A.shape = (2, 2, 2, 3)
A[0] =
[[[1.74481176 0.90159072 1.65980218]
[1.74481176 1.6924546 1.65980218]]