Ce tutoriel ne peut être li qu’après avoir étudié le tutoriel #3c (2ème partie) et le tutoriel #2 car on y trouve de nombreux éléments communs qui ne sont pas re-expliqués ici.

Cet article commente le tutoriel Tensorflow #3c de Magnus Erik Hvass Pedersen  : Keras API. Le code est ici et la vidéo ici (en anglais).

Les convolutions ne sont pas expliquées dans notre article. Elles sont supposées connues (cf #1 et #2).

Il existe deux types de modèles dans les API Keras, le modèle séquentiel (voir tutoriel précédent) et le modèle qualifié ici de fonctionnel (Model class API). Il ne sera question ici que du second, le premier ayant été déjà traité.

Flux

Pour rappel, le réseau implémenté est représenté ci-dessous :

Code

Le code, hormis la syntaxe différente et parfois pas très explicite, est malgré tout très voisin.

# Create an input layer which is similar to a feed_dict in TensorFlow.
# Note that the input-shape must be a tuple containing the image-size.
inputs = Input(shape=(img_size_flat,))

# Variable used for building the Neural Network.
net = inputs

# The input is an image as a flattened array with 784 elements.
# But the convolutional layers expect images with shape (28, 28, 1)
net = Reshape(img_shape_full)(net)

# First convolutional layer with ReLU-activation and max-pooling.
net = Conv2D(kernel_size=5, strides=1, filters=16, padding='same',
             activation='relu', name='layer_conv1')(net)
net = MaxPooling2D(pool_size=2, strides=2)(net)

# Second convolutional layer with ReLU-activation and max-pooling.
net = Conv2D(kernel_size=5, strides=1, filters=36, padding='same',
             activation='relu', name='layer_conv2')(net)
net = MaxPooling2D(pool_size=2, strides=2)(net)

# Flatten the output of the conv-layer from 4-dim to 2-dim.
net = Flatten()(net)

# First fully-connected / dense layer with ReLU-activation.
net = Dense(128, activation='relu')(net)

# Last fully-connected / dense layer with softmax-activation
# so it can be used for classification.
net = Dense(num_classes, activation='softmax')(net)

# Output of the Neural Network.
outputs = net

L’exemple donné ici est un peu plus clair. Lire aussi Getting started with the Keras functional API sur la doc Keras.

Dans la doc Keras, il y a cet exemple qui aide à comprendre :

A layer instance is callable (on a tensor), and it returns a tensor
Input tensor(s) and output tensor(s) can then be used to define a Model
Such a model can be trained just like Keras Sequential models.

from keras.layers import Input, Dense
from keras.models import Model

# This returns a tensor
inputs = Input(shape=(784,))

# a layer instance is callable on a tensor, and returns a tensor
x = Dense(64, activation='relu')(inputs)
x = Dense(64, activation='relu')(x)
predictions = Dense(10, activation='softmax')(x)

# This creates a model that includes
# the Input layer and three Dense layers
model = Model(inputs=inputs, outputs=predictions)
model.compile(optimizer='rmsprop',
              loss='categorical_crossentropy',
              metrics=['accuracy'])
model.fit(data, labels)  # starts training

On commence par créer une instance de couche. Celle-ci retourne un tenseur :

inputs = Input(shape=(784,))
x = Dense(64, activation='relu')(inputs)
x = Dense(64, activation='relu')(x)
predictions = Dense(10, activation='softmax')(x)

puis à partir des tenseurs on crée un modèle :

model = Model(inputs=inputs, outputs=predictions)
model.compile(optimizer='rmsprop', loss='categorical_crossentropy', metrics=['accuracy'])

Ce modèle peut ensuite être entraîné.

L’exemple de Magnus, un peu plus long, fonctionne de la même façon.

On a ensuite :

model2 = Model(inputs=inputs, outputs=outputs)
model2.compile(optimizer='rmsprop',
               loss='categorical_crossentropy',
               metrics=['accuracy'])

puis après le training :

model2.fit(x=data.x_train,
           y=data.y_train,
           epochs=1, batch_size=128)

Le reste du code n’est pas expliqué car il ne se différencie pas des tutoriels #1 et #2.

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *