3 votes

Concaténation de deux modèles avec tensorflow.keras

J'étudie actuellement les modèles de réseaux de neurones pour l'analyse d'images, avec l'ensemble de données MNIST. J'ai d'abord utilisé uniquement l'image pour construire un premier modèle. Puis j'ai créé une variable supplémentaire, qui est : 0 lorsque le chiffre est effectivement compris entre 0 et 4, et 1 lorsqu'il est supérieur ou égal à 5.

Je souhaite donc construire un modèle qui puisse prendre en compte ces deux informations : l'image du chiffre, et la variable supplémentaire que je viens de créer.

J'ai créé les deux premiers modèles, un pour l'image et un pour la variable exogène, comme suit :

import tensorflow as tf
from tensorflow import keras

image_model = keras.models.Sequential()

#First conv layer :
image_model.add( keras.layers.Conv2D( 64, kernel_size=3,
                                               activation=keras.activations.relu,
                                      input_shape=(28, 28, 1) ) )

#Second conv layer :
image_model.add( keras.layers.Conv2D( 32, kernel_size=3, activation=keras.activations.relu ) )

#Flatten layer :
image_model.add( keras.layers.Flatten() )

print( image_model.summary(), '\n' )

info_model = keras.models.Sequential()

info_model.add( keras.layers.Dense( 5, activation=keras.activations.relu, input_shape=(1,) ) )

print( info_model.summary() )

Ensuite, je voudrais concaténer les deux couches finales, pour enfin mettre une autre couche dense avec softmax pour prédire les probabilités de classe.

Je sais que c'est faisable en utilisant l'API fonctionnelle de Keras, mais comment le faire en utilisant tf.keras ?

8voto

John Doe Points 128

Vous pouvez facilement utiliser l'API fonctionnelle de Keras dans TF (testé avec TF 2.0) :

import tensorflow as tf

# Image
input_1 = tf.keras.layers.Input(shape=(28, 28, 1))
conv2d_1 = tf.keras.layers.Conv2D(64, kernel_size=3,
                                  activation=tf.keras.activations.relu)(input_1)

# Second conv layer :
conv2d_2 = tf.keras.layers.Conv2D(32, kernel_size=3,
                                  activation=tf.keras.activations.relu)(conv2d_1)

# Flatten layer :
flatten = tf.keras.layers.Flatten()(conv2d_2)

# The other input
input_2 = tf.keras.layers.Input(shape=(1,))
dense_2 = tf.keras.layers.Dense(5, activation=tf.keras.activations.relu)(input_2)

# Concatenate
concat = tf.keras.layers.Concatenate()([flatten, dense_2])

n_classes = 4
# output layer
output = tf.keras.layers.Dense(units=n_classes,
                               activation=tf.keras.activations.softmax)(concat)

full_model = tf.keras.Model(inputs=[input_1, input_2], outputs=[output])

print(full_model.summary())

Ce qui vous donne le modèle que vous recherchez.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X