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?
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)