Este é o meu primeiro artigo sobre aprendizado de máquina. Recentemente, participei profissionalmente de aprendizado de máquina e visão computacional. Neste e em futuros artigos, compartilharei observações e soluções para problemas específicos ao usar o TensorFlow e o Keras. Neste artigo, falarei sobre um problema não óbvio ao trabalhar com o TensorFlow e o Keras - o carregamento e a execução simultâneos de vários modelos. Se você não estiver familiarizado com o funcionamento interno do TensorFlow e Keras, este tópico pode ser um problema para iniciantes. Se você está interessado no tópico, por favor, abaixo do gato.
O TensorFlow apresenta cálculos no modelo de rede neural na memória como um gráfico de dependências entre operações durante a inicialização. Ao executar o modelo, o TensorFlow executa cálculos no gráfico em uma sessão específica. Não entrarei em detalhes dessas entidades no Tensorflow.
Você pode ler mais sobre gráficos e sessões no
Medium e Habré:
aqui e
aqui .
Geralmente trabalhamos com um modelo e não há problemas aqui. Agora vamos imaginar que estamos trabalhando com duas classes. Ambas as classes trabalham com os modelos Keras: criar arquitetura neural, carregar pesos treinados e executar previsões. Ao executar duas classes em um pipeline (por exemplo, na primeira etapa, realizamos a detecção de rosto na foto, no próximo reconhecimento humano), um erro semelhante pode ocorrer:
Error Tensor("norm_layer/l2_normalize:0", shape=(?, 128), dtype=float32) is not an element of this graph
O motivo do erro é que, por padrão, o Keras
funciona apenas com a sessão padrão e não registra a nova sessão como a sessão padrão.
Ao trabalhar com o modelo Keras, o usuário deve definir explicitamente a nova sessão como a sessão padrão. Isso pode ser feito assim:
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)
Criamos um novo gráfico e sessão do TensorFlow e carregamos o modelo dentro da nova sessão do TensorFlow.
String
with self.graph.as_default():
significa
que queremos usar o novo gráfico () como gráfico padrão e na linha
with self.session.as_default():
indicamos que queremos usar a self.session como a sessão padrão e executar o código subseqüente nessa sessão. A construção with cria um gerenciador de contexto que nos permite trabalhar com memória de maneira eficiente ao lidar com objetos que consomem muitos recursos (por exemplo, ler arquivos), pois libera recursos automaticamente quando saímos do bloco with.
Quando precisamos cumprir a previsão, fazemos assim:
with self.graph.as_default(): with self.session.as_default(): result = self.model.predict(np.expand_dims(img, axis=0), batch_size=1)
Apenas chamamos o método predict () dentro da sessão TF criada anteriormente.
Por enquanto é tudo. Boa sorte a todos e até breve!