Path: blob/master/site/pt-br/tfx/tutorials/transform/simple.ipynb
25118 views
Copyright 2021 The TensorFlow Authors.
Pré-processamento de dados com o TensorFlow Transform
O componente de engenharia de características do TensorFlow Extended (TFX)
Observação: recomendamos executar este tutorial em um notebook Colab, sem necessidade de configuração! Basta clicar em “Executar no Google Colab”.
Este exemplo de notebook colab fornece um exemplo muito simples de como o TensorFlow Transform (tf.Transform
) pode ser usado para pré-processar dados usando exatamente o mesmo código para treinar um modelo e servir inferências em produção.
O TensorFlow Transform é uma biblioteca para pré-processamento de dados de entrada para TensorFlow, incluindo a criação de características que exigem um passo completo do dataset de treinamento. Por exemplo, usando o TensorFlow Transform você poderia:
Normalizar um valor de entrada usando a média e o desvio padrão
Converter strings em inteiros gerando um vocabulário sobre todos os valores de entrada
Converter números de ponto flutuante em números inteiros atribuindo-os a intervalos, com base na distribuição de dados observada
O TensorFlow tem suporte integrado para manipulações em um único exemplo ou num lote de exemplos. O tf.Transform
estende esses recursos para oferecer suporte a passos completos (full pass) em todo o dataset de treinamento.
A saída do tf.Transform
é exportada como um grafo do TensorFlow que você pode usar para treinamento e serviço. Usar o mesmo grafo para treinamento e serviço pode evitar desvios, uma vez que as mesmas transformações são aplicadas em ambos os estágios.
Atualize o Pip
Para evitar a atualização do Pip num sistema ao executar localmente, garanta que estamos executando no Colab. Os sistemas locais podem, claro, ser atualizados separadamente.
Instale o TensorFlow Transform
Importações
Dados: crie alguns dados fictícios
Criaremos alguns dados fictícios simples para nosso exemplo:
raw_data
são os dados brutos iniciais que iremos pré-processarraw_data_metadata
contém o esquema que nos informa os tipos de cada uma das colunas emraw_data
. Neste caso, é bem simples.
Transform: crie uma função de pré-processamento
A função de pré-processamento é o conceito mais importante do tf.Transform. Uma função de pré-processamento é onde a transformação do dataset realmente acontece. Ela recebe e retorna um dicionário de tensores, onde um tensor significa um Tensor
ou SparseTensor
. Existem dois grupos principais de chamadas de API que normalmente formam o coração de uma função de pré-processamento:
Ops do TensorFlow: qualquer função que aceita e retorna tensores, o que geralmente correspondem às ops do TensorFlow. Elas adicionam operações do TensorFlow ao grafo que transforma dados brutos em dados transformados, um vetor de características por vez. Eles serão executados para cada exemplo, tanto durante o treinamento quanto durante o serviço.
Analisadores/mapeadores do Tensorflow Transform: qualquer um dos analisadores/mapeadores fornecidos pelo tf.Transform. Eles também recebem e retornam tensores e normalmente contêm uma combinação de ops do Tensorflow e computações do Beam, mas, ao contrário das ops do TensorFlow, eles são executados apenas no pipeline do Beam durante a análise, exigindo uma passagem completa (full pass) por todo o dataset de treinamento. As computações do Beam rodam apenas uma vez (antes do treinamento, durante a análise) e normalmente fazem uma passagem completa por todo o dataset de treinamento. Criam tensores
tf.constant
, que são adicionados ao grafo. Por exemplo,tft.min
calcula o mínimo de um tensor no dataset de treinamento.
Atenção: Quando você aplica sua função de pré-processamento para servir inferências, as constantes que foram criadas pelos analisadores durante o treinamento não mudam. Se seus dados tiverem componentes de tendência ou sazonalidade, planeje levando isso em consideração.
Observação: O preprocessing_fn
não pode ser chamada diretamente. Isso significa que chamar preprocessing_fn(raw_data)
não funciona. Em vez disso, ela deve ser passada para a API Beam do Transform conforme mostrado nas células a seguir.
Sintaxe
Você está quase pronto para juntar tudo e usar o Apache Beam para executá-lo.
O Apache Beam usa uma sintaxe especial para definir e invocar transformações. Por exemplo, nesta linha:
O método to_this_call
está sendo invocado e passado ao objeto chamado pass_this
, e esta operação será chamada de name this step
num rastreamento de pilha. O resultado da chamada para to_this_call
é retornado em result
. Freqüentemente, você verá estágios de um pipeline encadeados assim:
e como isso começou com um novo pipeline, você pode continuar assim:
Juntando tudo
Agora estamos prontos para transformar nossos dados. Usaremos o Apache Beam com um executor direto e forneceremos três entradas:
raw_data
– Os dados de entrada brutos que criamos acimaraw_data_metadata
– O esquema para os dados brutospreprocessing_fn
– A função que criamos para fazer nossa transformação
Será que esta é a resposta certa?
Previamente, usamos o tf.Transform
para fazer o seguinte:
x_centered - Com entrada de
[1, 2, 3]
a média de x é 2, e subtraímos de x para centralizar nossos valores de x em 0. Portanto, nosso resultado de[-1.0, 0.0, 1.0]
está correto.y_normalized - Queríamos dimensionar nossos valores de y entre 0 e 1. Nossa entrada foi
[1, 2, 3]
, então nosso resultado de[0.0, 0.5, 1.0]
está correto.s_integerized - Queríamos mapear nossas strings para índices em um vocabulário e havia apenas 2 palavras em nosso vocabulário ("hello" e "world"). Portanto, com a entrada de
["hello", "world", "hello"]
nosso resultado de[0, 1, 0]
está correto. Como “olá” ocorre com mais frequência nesses dados, será a primeira entrada no vocabulário.x_centered_times_y_normalized - Queríamos criar uma nova característicaa cruzando
x_centered
ey_normalized
usando multiplicação. Observe que isso multiplica os resultados, não os valores originais, e nosso novo resultado de[-0.0, 0.0, 1.0]
está correto.
Use o transform_fn
resultante
O diretório transform_fn/
contém uma implementação de tf.saved_model
com todos os resultados da análise das constantes do Tensorflow Transform incorporadas ao grafo.
É possível carregar isso diretamente com tf.saved_model.load
, mas não é fácil de usar:
Uma abordagem melhor seria carregá-lo usando tft.TFTransformOutput
. O método TFTransformOutput.transform_features_layer
retorna um objeto tft.TransformFeaturesLayer
que pode ser usado para aplicar a transformação:
Este tft.TransformFeaturesLayer
espera um dicionário de características em lote. Portanto, crie um Dict[str, tf.Tensor]
de List[Dict[str, Any]]
em raw_data
:
Você pode usar o tft.TransformFeaturesLayer
de forma independente:
Exportação
Um caso de uso mais típico seria usar tf.Transform
para aplicar a transformação aos datasets de treinamento e avaliação (veja um exemplo no próximo tutorial). Nesse caso, após o treinamento, antes de exportar o modelo, anexe o tft.TransformFeaturesLayer
como a primeira camada para que você possa exportá-lo como parte do seu tf.saved_model
. Para um exemplo concreto, continue lendo.
Um exemplo de modelo de treinamento
Abaixo temos um modelo que:
recebe o lote transformado,
empilha tudo numa matriz
(batch, features)
simples,passa todos por algumas camadas densas e
produz 10 saídas lineares.
Num caso de uso real, você aplicaria um one-hot à característica s_integerized
.
Você poderia treinar este modelo num dataset transformado por tf.Transform
:
Imagine que treinamos o modelo.
Este modelo é executado nas entradas transformadas
Um exemplo de wrapper de exportação
Imagine que você treinou o modelo acima e deseja exportá-lo.
Você vai querer incluir a função de transformação no modelo exportado:
Esse modelo combinado funciona com dados brutos e produz exatamente os mesmos resultados que chamar diretamente o modelo treinado:
Este export_model
inclui o tft.TransformFeaturesLayer
e é totalmente independente. Você pode salvá-lo e restaurá-lo em outro ambiente e ainda obter exatamente o mesmo resultado: