Conversão de modelo

O TensorFlow.js vem com uma variedade de modelos pré-treinados que estão prontos para uso no navegador – eles podem ser encontrados em nosso repositório de modelos . No entanto, você pode ter encontrado ou criado um modelo do TensorFlow em outro lugar que gostaria de usar em seu aplicativo Web. TensorFlow.js fornece um conversor de modelo para essa finalidade. O conversor TensorFlow.js tem dois componentes:

  1. Um utilitário de linha de comando que converte modelos Keras e TensorFlow para uso em TensorFlow.js.
  2. Uma API para carregar e executar o modelo no navegador com TensorFlow.js.

Converta seu modelo

O conversor TensorFlow.js funciona com vários formatos de modelo diferentes:

SavedModel : este é o formato padrão no qual os modelos do TensorFlow são salvos. O formato SavedModel está documentado aqui .

Modelo Keras : Os modelos Keras geralmente são salvos como um arquivo HDF5. Mais informações sobre como salvar modelos Keras podem ser encontradas aqui .

Módulo TensorFlow Hub : são modelos que foram empacotados para distribuição no TensorFlow Hub, uma plataforma para compartilhamento e descoberta de modelos. A biblioteca de modelos pode ser encontrada aqui .

Dependendo do tipo de modelo que você está tentando converter, você precisará passar argumentos diferentes para o conversor. Por exemplo, digamos que você salvou um modelo Keras chamado model.h5 em seu diretório tmp/ . Para converter seu modelo usando o conversor TensorFlow.js, execute o seguinte comando:

$ tensorflowjs_converter --input_format=keras /tmp/model.h5 /tmp/tfjs_model

Isso converterá o modelo em /tmp/model.h5 e gerará um arquivo model.json junto com arquivos de peso binário em seu diretório tmp/tfjs_model/ .

Mais detalhes sobre os argumentos de linha de comando correspondentes a diferentes formatos de modelo podem ser encontrados no README do conversor TensorFlow.js.

Durante o processo de conversão, percorremos o gráfico do modelo e verificamos se cada operação é suportada pelo TensorFlow.js. Nesse caso, escrevemos o gráfico em um formato que o navegador possa consumir. Tentamos otimizar o modelo para ser veiculado na web, fragmentando os pesos em arquivos de 4 MB - dessa forma, eles podem ser armazenados em cache pelos navegadores. Também tentamos simplificar o próprio gráfico do modelo usando o projeto Grappler de código aberto. As simplificações do gráfico incluem agrupar operações adjacentes, eliminar subgráficos comuns, etc. Essas alterações não têm efeito na saída do modelo. Para otimização adicional, os usuários podem passar um argumento que instrui o conversor a quantizar o modelo para um determinado tamanho de byte. A quantização é uma técnica para reduzir o tamanho do modelo representando pesos com menos bits. Os usuários devem ter cuidado para garantir que seu modelo mantenha um grau aceitável de precisão após a quantização.

Se encontrarmos uma operação não suportada durante a conversão, o processo falhará e imprimiremos o nome da operação para o usuário. Sinta-se à vontade para enviar um problema em nosso GitHub para nos informar sobre isso - tentamos implementar novas operações em resposta à demanda do usuário.

Melhores práticas

Embora façamos todos os esforços para otimizar seu modelo durante a conversão, muitas vezes a melhor maneira de garantir que seu modelo tenha um bom desempenho é construí-lo tendo em mente ambientes com recursos limitados. Isto significa evitar arquiteturas excessivamente complexas e minimizar o número de parâmetros (pesos) quando possível.

Execute seu modelo

Após converter seu modelo com sucesso, você terá um conjunto de arquivos de peso e um arquivo de topologia de modelo. O TensorFlow.js fornece APIs de carregamento de modelo que você pode usar para buscar esses ativos de modelo e executar inferência no navegador.

Esta é a aparência da API para um módulo TensorFlow SavedModel ou TensorFlow Hub convertido:

const model = await tf.loadGraphModel(path/to/model.json);

E aqui está o que parece para um modelo Keras convertido:

const model = await tf.loadLayersModel(path/to/model.json);

A API tf.loadGraphModel retorna um tf.FrozenModel , o que significa que os parâmetros são fixos e você não poderá ajustar seu modelo com novos dados. A API tf.loadLayersModel retorna um tf.Model, que pode ser treinado. Para obter informações sobre como treinar um tf.Model, consulte o guia de modelos de treinamento .

Após a conversão, é uma boa ideia executar a inferência algumas vezes e avaliar a velocidade do seu modelo. Temos uma página de benchmarking independente que pode ser usada para essa finalidade: https://tensorflow.github.io/tfjs/e2e/benchmarks/local-benchmark/index.html Você pode notar que descartamos medições de uma execução de aquecimento inicial - isso ocorre porque (em geral) a primeira inferência do seu modelo será várias vezes mais lenta do que as inferências subsequentes devido à sobrecarga de criação de texturas e compilação de shaders.