0
votes

Charger un modèle tensorflow dans un autre et concaténer deux modèles

L'idée est de créer un modèle de déconvolution en suivant mon modèle de convolution pour voir l'importance des pixels appris.

Vue d'ensemble du modèle

J'ai des problèmes que je ne peux pas expliquer. La première est que lorsque j'ai créé mes 3 modèles, si j'entraîne le modèle de convolution et que je teste mon modèle automatique, tout fonctionne bien. Alors que si je crée mes 3 modèles alors je charge mon modèle de convolution (entraîné précédemment) et si je teste mon modèle automatique tout semble comme si je n'avais pas chargé les poids de mon modèle de convolution. Ma première question est de savoir comment charger les poids dans mon modèle de convolution et qu'ils sont pris en compte pour mon modèle automatique?

Le deuxième problème est peut-être lié au premier, c'est que tout fonctionne bien quand j'utilise Predict sur mon modèle auto mais si je le décompose, ça ne marche pas. Par décomposition, je veux dire prendre un x_test le prédire avec un modèle de convolution, puis utiliser ce que nous obtenons pour prédire le modèle deconv. J'obtiens une erreur lorsque je donne le résultat du modèle de convolution au modèle deconv. "Argument non valide: vous devez fournir une valeur pour le tenseur d'espace réservé 'input_CNN' avec dtype float"

Pour créer le modèle automatique que je fais:

def CNN_1_deconv_layers(inputs_deconv):
   x = layers.Reshape((1,1,10))(x)
   w1 = tf.get_variable("w1",shape=[4,4,128,10],dtype=tf.float32)
   x = layers.Lambda(lambda x: tf.nn.conv2d_transpose(x,w1,output_shape=[1,4,4,128],strides=(1,1,1,1),padding='VALID'),name='deconv_0')(x)
   ...
   return x


def apprentissage(model,nb_epoch=100):
   checkpoint = ModelCheckpoint(filepath="CNN_1.h5",monitor='vall_acc', save_best_only=True,save_weights_only=False,mode='auto')
   hist= model.fit(train_X, train_y, batch_size=128, nb_epoch=nb_epoch, validation_data=(test_X,test_y), callbacks=[checkpoint])
   return hist

Je peux vous donner plus de détails si nécessaire.

Éditer :

def CNN_1_layers(inputs):
   x = layers.Flattend(input_shape(1,1,10))(x)
   x = layers.Dense(10,activation='softmax')(x)

   return x

La dernière couche de mon model_conv:

def CNN():
   inputs = layers.Input(shape=(128,128,1),name="input_CNN")
   layers_CNN = CNN_1_layers(inputs)
   model_conv = models.Model(inputs,layers_CNN,name='CNN_1')
   model_conv.compile(loss='categorical_crossentropy',optimizer=Adam(), metrics=[accuracy"])

   inputs_deconv = layers.Inputs(shape=(1,10),name="input_CNN_deconv")
   layers_CNN_deconv = CNN_1_deconv_layers(inputs_deconv)
   model_deconv = models.Model(inputs_deconv, layers_CNN_deconv,name="CNN_1_deconv")
   model_deconv.compile(loss='categorical_crossentropy',optimize=Adam(), metrics=["accuracy"])

   model_auto = models.Model(inputs,model_deconv(model_conv(inputs)))
   model_auto.compile(loss='categorical_crossentropy',optimize=Adam(), metrics=["accuracy"])

   return model_auto, model_conv, model_deconv

Et les couches deconv:

inputs = layers.Input(shape(128,128,1),name='input_CNN')
model_auto = models.Model(inputs,model_deconv(model_conv(inputs)))

Je suis en train de coder avec un autre ordinateur hors du réseau donc je dois tout réécrire à la main donc je résume un peu.


2 commentaires

À votre première question: j'ai juste une suggestion à tester. créez votre modèle de convolution , chargez ses poids, puis créez votre modèle automatique . À votre deuxième question: je pense avoir déjà fait quelque chose de similaire et cela ne me posait aucun problème. Si vous le pouvez, donnez-nous un extrait de code minimal à tester et vous aider avec le code


Je l'ai mis à jour. Dites-moi si vous avez besoin de plus de choses. Merci de votre aide


3 Réponses :


0
votes

Je ne sais pas si mon commentaire a aidé à votre première question ou non (en fait je ne m'attendais pas à ce que votre premier problème se produise mais de toute façon je vous ai fait une suggestion).

Pour votre deuxième problème, j'ai testé votre code (homme vous avez eu beaucoup d'erreurs de frappe: D) et cela n'a eu aucun problème. J'écrirai le code ci-dessous:

import numpy as np
import tensorflow as tf
from tensorflow import keras

# use below as you need
from tensorflow.keras.models import Sequential
from tensorflow.keras import layers
from tensorflow.keras.layers import *

# ----------------------

def CNN():
    inputs = layers.Input(shape=(128,128,1),name="input_CNN")
    layers_CNN = CNN_1_layers(inputs)
    model_conv = keras.Model(inputs,layers_CNN,name='CNN_1')
    model_conv.compile(loss='categorical_crossentropy',optimizer='adam', metrics=["accuracy"])

    inputs_deconv = layers.Input(shape=(1,10),name="input_CNN_deconv")
    layers_CNN_deconv = CNN_1_deconv_layers(inputs_deconv)
    model_deconv = keras.Model(inputs_deconv, layers_CNN_deconv,name="CNN_1_deconv")
    model_deconv.compile(loss='categorical_crossentropy',optimizer='adam', metrics=["accuracy"])

    model_auto = keras.Model(inputs,model_deconv(model_conv(inputs)))
    model_auto.compile(loss='categorical_crossentropy',optimizer='adam', metrics=["accuracy"])
    return model_auto, model_conv, model_deconv

# ----------------------

def CNN_1_layers(inputs):
   x = layers.Flatten(input_shape = (1,1,10))(inputs)
   x = layers.Dense(10,activation='softmax')(x)

   return x

# ----------------------

testX = np.random.rand(10, 128, 128, 1)

model_auto, model_conv, model_deconv = CNN()

print(model_auto(testX).shape)
conv_out = model_conv(testX)
deconv_out = model_deconv(conv_out)
print(deconv_out.shape)


2 commentaires

Je pense qu'il n'y a pas d'erreurs de frappe, c'est juste que j'utilise une ancienne version de tensorflow. Je suis avec python 2.7.6, tensorflow: 0.12.0.rc1 Y a-t-il une différence entre model.predict (testX) et model (testX)?


regarde la réponse ici



0
votes

Merci Amin, Vous avez répondu à ma question, le problème venait du type de ma variable d'entrée. (uint8 au lieu de float32) Le prédicteur a réussi à fonctionner même si le type était faux mais en corrigeant ce problème je peux maintenant décomposer mon modèle et tout fonctionne!

Il ne reste que le problème de charger les données. Si vous me dites que vous n'avez pas eu de problème à faire quelque chose de similaire, je ferai d'autres tests.


0 commentaires

0
votes

Eh bien, j'abandonne et télécharge toute ma bibliothèque dans la dernière qui semble fonctionner.


0 commentaires