web-dev-qa-db-fra.com

Erreur Keras (backend Tensorflow) - Tensor input_1: 0, spécifié dans feed_devices ou fetch_devices est introuvable dans le graphique

Lorsque j'essaie de prédire à l'aide d'un modèle simple que j'ai déjà formé, j'obtiens l'erreur suivante:

Tensor input_1: 0, spécifié dans feed_devices ou fetch_devices est introuvable dans le graphique

à la ligne:

seatbelt_model.predict(image_arr, verbose=1)

dans du code:

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

graph = tf.get_default_graph()

seatbelt_model = keras.models.load_model(filepath='./graphs/seatbelt_A_3_81.h5')

class SeatbeltPredictor:
    INPUT_SHAPE = (-1, 120, 160, 1)

    @staticmethod
    def predict_seatbelt(image_arr):
        with graph.as_default():
            image_arr = np.array(image_arr).reshape(SeatbeltPredictor.INPUT_SHAPE)
            predicted_labels = seatbelt_model.predict(image_arr, verbose=1)
            return predicted_labels

Le modèle a la forme suivante:

input_layer = keras.layers.Input(shape=(IMAGE_HEIGHT, IMAGE_WIDTH, 1))
conv_0 = keras.layers.Conv2D(filters=32, kernel_size=[5, 5], activation=tf.nn.relu, padding="SAME")(input_layer)
pool_0 = keras.layers.MaxPool2D(pool_size=[2, 2], strides=2, padding="VALID")(conv_0)
conv_1 = keras.layers.Conv2D(filters=32, kernel_size=[5, 5], activation=tf.nn.relu, padding="SAME")(pool_0)
pool_1 = keras.layers.MaxPool2D(pool_size=[2, 2], strides=2, padding="VALID")(conv_1)
flat_0 = keras.layers.Flatten()(pool_1)
dense_0 = keras.layers.Dense(units=1024, activation=tf.nn.relu)(flat_0)
drop_0 = keras.layers.Dropout(rate=0.4, trainable=True)(dense_0)
dense_1 = keras.layers.Dense(units=2, activation=tf.nn.softmax)(drop_0)

Si je lance ce qui suit, j'obtiens un résultat tensoriel:

graph.get_tensor_by_name('input_1:0')
<tf.Tensor 'input_1:0' shape=(?, 120, 160, 1) dtype=float32>

Le nom de la première couche est input_1

image_arr est de forme (1, 120, 160, 1)

Tensorflow 1.12

Des idées?

8
Matthew Conradie

OK, après beaucoup de douleur et de souffrance et de plongée dans les entrailles du tensorflow, j'ai trouvé ce qui suit:

Bien que le modèle ait une session et un graphique, dans certaines méthodes tensorflow, la session et le graphique par défaut sont utilisés. Pour résoudre ce problème, j'ai dû explicitement dire que je voulais utiliser à la fois ma session et mon graphique par défaut:

with session.as_default():
    with session.graph.as_default():

Code complet:

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

config = tf.ConfigProto(
    device_count={'GPU': 1},
    intra_op_parallelism_threads=1,
    allow_soft_placement=True
)

config.gpu_options.allow_growth = True
config.gpu_options.per_process_gpu_memory_fraction = 0.6

session = tf.Session(config=config)

keras.backend.set_session(session)

seatbelt_model = keras.models.load_model(filepath='./seatbelt.h5')

SEATBEL_INPUT_SHAPE = (-1, 120, 160, 1)

def predict_seatbelt(image_arr):
    try:
        with session.as_default():
            with session.graph.as_default():
                image_arr = np.array(image_arr).reshape(SEATBEL_INPUT_SHAPE)
                predicted_labels = seatbelt_model.predict(image_arr, verbose=1)
                return predicted_labels
    except Exception as ex:
        log.log('Seatbelt Prediction Error', ex, ex.__traceback__.tb_lineno)
20
Matthew Conradie