Este es mi primer art铆culo sobre aprendizaje autom谩tico. Recientemente, me he dedicado profesionalmente al aprendizaje autom谩tico y la visi贸n por computadora. En este y en futuros art铆culos, compartir茅 observaciones y soluciones a problemas espec铆ficos cuando use TensorFlow y Keras. En este art铆culo, hablar茅 sobre un problema no obvio cuando trabaje con TensorFlow y Keras: la carga y ejecuci贸n simult谩neas de varios modelos. Si no est谩 familiarizado con el funcionamiento interno de TensorFlow y Keras, este tema puede ser un problema para principiantes. Si est谩 interesado en el tema, debajo del gato.
TensorFlow presenta c谩lculos en el modelo de red neuronal en la memoria como un gr谩fico de dependencias entre operaciones durante la inicializaci贸n. Al ejecutar el modelo, TensorFlow realiza c谩lculos en el gr谩fico dentro de una sesi贸n espec铆fica. No entrar茅 en detalles de estas entidades en Tensorflow.
Puede leer m谩s sobre gr谩ficos y sesiones en
Medium y Habr茅:
aqu铆 y
aqu铆 .
Por lo general, trabajamos con un modelo y no hay problemas aqu铆. Ahora imaginemos que estamos trabajando con dos clases. Ambas clases trabajan con modelos Keras: crean arquitectura neuronal, cargan pesos entrenados y realizan predicciones. Al realizar dos clases en una tuber铆a (por ejemplo, en el primer paso realizamos la detecci贸n de rostros en la foto, en el siguiente - reconocimiento humano), puede ocurrir un error similar:
Error Tensor("norm_layer/l2_normalize:0", shape=(?, 128), dtype=float32) is not an element of this graph
La raz贸n del error es que Keras por defecto solo
funciona con la sesi贸n predeterminada y no registra la nueva sesi贸n como la sesi贸n predeterminada.
Al trabajar con el modelo Keras, el usuario debe establecer expl铆citamente la nueva sesi贸n como la sesi贸n predeterminada. Esto se puede hacer as铆:
self.graph = tf.Graph() with self.graph.as_default(): self.session = tf.Session(graph=self.graph) with self.session.as_default(): self.model = WideResNet(face_size, depth=depth, k=width)() model_dir = <model_path> ... self.model.load_weights(fpath)
Creamos un nuevo gr谩fico y sesi贸n de TensorFlow y cargamos el modelo dentro de la nueva sesi贸n de TensorFlow.
Cadena
with self.graph.as_default():
significa
que queremos usar el nuevo gr谩fico () como el gr谩fico predeterminado y en la fila
with self.session.as_default():
indicamos que queremos usar self.session como sesi贸n predeterminada y ejecutar el c贸digo posterior dentro de esta sesi贸n. La construcci贸n with crea un administrador de contexto que nos permite trabajar eficientemente con la memoria cuando se trata de objetos que requieren muchos recursos (por ejemplo, leer archivos), ya que libera recursos autom谩ticamente cuando salimos del bloque with.
Cuando necesitamos cumplir la predicci贸n, lo hacemos as铆:
with self.graph.as_default(): with self.session.as_default(): result = self.model.predict(np.expand_dims(img, axis=0), batch_size=1)
Simplemente llamamos al m茅todo predict () dentro de la sesi贸n TF creada anteriormente.
Eso es todo por ahora. 隆Buena suerte a todos y hasta pronto!