web-dev-qa-db-fra.com

ValueError: les tenseurs de sortie vers un modèle doivent être les résultats d'un `couche` TensorFlow

Je construis un modèle dans Keras en utilisant une fonction tensorflow (reduction_sum et l2_normalize) dans la dernière couche tout en rencontrant ce problème. J'ai cherché une solution mais tout cela concernait "le tenseur de Keras".

Voici mon code:

import tensorflow as tf;
from tensorflow.python.keras import backend as K

vgg16_model = VGG16(weights = 'imagenet', include_top = False, input_shape = input_shape);

fire8 = extract_layer_from_model(vgg16_model, layer_name = 'block4_pool');

pool8 = MaxPooling2D((3,3), strides = (2,2), name = 'pool8')(fire8.output);

fc1 = Conv2D(64, (6,6), strides= (1, 1), padding = 'same', name = 'fc1')(pool8);

fc1 = Dropout(rate = 0.5)(fc1);

fc2 = Conv2D(3, (1, 1), strides = (1, 1), padding = 'same', name = 'fc2')(fc1);

fc2 = Activation('relu')(fc2);

fc2 = Conv2D(3, (15, 15), padding = 'valid', name = 'fc_pooling')(fc2);

fc2_norm = K.l2_normalize(fc2, axis = 3);

est = tf.reduce_sum(fc2_norm, axis = (1, 2));
est = K.l2_normalize(est);

FC_model = Model(inputs = vgg16_model.input, outputs = est);

et ensuite l'erreur:

ValueError: Les tenseurs de sortie vers un modèle doivent être les résultats d'un TensorFlow Layer (conservant ainsi les métadonnées des couches antérieures). Trouvé: Tenseur ("l2_normalize_3: 0", shape = (?, 3), dtype = float32)

J'ai remarqué que sans passer de la couche fc2 à ces fonctions, le modèle fonctionne bien:

FC_model = Model(inputs = vgg16_model.input, outputs = fc2);

Quelqu'un peut-il m'expliquer s'il vous plaît ce problème et quelques suggestions sur la façon de le résoudre?

19

J'ai trouvé un moyen de contourner le problème. Pour quiconque rencontre le même problème, vous pouvez utiliser la couche Lambda pour envelopper vos opérations tensorflow, voici ce que j'ai fait:

from tensorflow.python.keras.layers import Lambda;

def norm(fc2):

    fc2_norm = K.l2_normalize(fc2, axis = 3);
    illum_est = tf.reduce_sum(fc2_norm, axis = (1, 2));
    illum_est = K.l2_normalize(illum_est);

    return illum_est;

illum_est = Lambda(norm)(fc2);
27