Path: blob/master/site/pt-br/guide/migrate/migrating_feature_columns.ipynb
25118 views
Copyright 2021 The TensorFlow Authors.
Como migrar de tf.feature_column
para camadas de pré-processamento Keras
O treinamento de um modelo geralmente vem com uma certa quantidade de pré-processamento de características, principalmente ao lidar com dados estruturados. Ao treinar um tf.estimator.Estimator
no TensorFlow 1, você geralmente realiza o pré-processamento de características com a API tf.feature_column
. No TensorFlow 2, você pode fazer isso diretamente com as camadas de pré-processamento do Keras.
Este guia de migração demonstra transformações de características comuns tanto usando colunas de características como camadas de pré-processamento, seguidas pelo treinamento de um modelo completo com ambas as APIs.
Primeiro, comece com algumas importações necessárias:
Agora, adicione uma função de utilidade para chamar uma coluna de característica para demonstração:
Tratamento das entradas
Para usar colunas de características com um estimador, sempre se espera que as entradas do modelo sejam um dicionário de tensores:
Cada coluna de característica precisa ser criada com uma chave para indexar nos dados-fonte. A saída de todas as colunas de características é concatenada e usada pelo modelo estimador.
No Keras, a entrada do modelo é muito mais flexível. Um tf.keras.Model
pode lidar com uma única entrada de tensor, uma lista de características de tensor ou um dicionário de características de tensor. Você pode manipular a entrada do dicionário passando um dicionário de tf.keras.Input
na criação do modelo. As entradas não serão concatenadas automaticamente, o que permite que sejam usadas de maneiras muito mais flexíveis. Elas podem ser concatenadas com tf.keras.layers.Concatenate
.
One-hot encoding de IDs inteiros
Uma transformação de características comum é a one-hot encoding de entradas inteiras dentro um intervalo conhecido. Aqui está um exemplo usando colunas de características:
Usando camadas de pré-processamento Keras, essas colunas podem ser substituídas por uma única camada tf.keras.layers.CategoryEncoding
com output_mode
definido como 'one_hot'
:
Observação: para grandes codificações one-hot, é muito mais eficiente usar uma representação esparsa da saída. Se você passar sparse=True
para a camada CategoryEncoding
, a saída da camada será um tf.sparse.SparseTensor
, que pode ser tratado com eficiência como entrada para uma camada tf.keras.layers.Dense
.
Normalizando características numéricas
Ao lidar com características contínuas, de ponto flutuante com colunas de características, você precisa usar um tf.feature_column.numeric_column
. No caso em que a entrada já está normalizada, convertê-la em Keras é trivial. Você pode simplesmente usar um tf.keras.Input
diretamente no seu modelo, conforme mostrado acima.
Uma numeric_column
também pode ser usada para normalizar a entrada:
Em contraste, com o Keras, essa normalização pode ser feita com tf.keras.layers.Normalization
.
Bucketing e one-hot encoding de características numéricas
Outra transformação comum de entradas contínuas de ponto flutuante é fazer bucketing para inteiros de um intervalo fixo com elas.
Em colunas de características, isto pode ser obtido com um tf.feature_column.bucketized_column
:
No Keras, isto pode ser substituído por tf.keras.layers.Discretization
:
Fazendo one-hot encoding de dados de string com um vocabulário
A manipulação de características de string geralmente requer uma pesquisa de vocabulário para traduzir strings em índices. Aqui está um exemplo usando colunas de características para pesquisar strings e, em seguida, fazer one-hot encoding dos índices:
Usando camadas de pré-processamento Keras, use a camada tf.keras.layers.StringLookup
com output_mode
definido como 'one_hot'
:
Observação: para grandes one-hot encodings, é muito mais eficiente usar uma representação esparsa da saída. Se você passar sparse=True
para a camada StringLookup
, a saída da camada será um tf.sparse.SparseTensor
, que pode ser tratado com eficiência como entrada para uma camada tf.keras.layers.Dense
.
Embedding de dados de string com um vocabulário
Para vocabulários maiores, geralmente é necessário incorporar um embedding para um bom desempenho. Aqui está um exemplo de embedding de uma característica de string usando colunas de características:
Usando camadas de pré-processamento Keras, isso pode ser obtido combinando uma camada tf.keras.layers.StringLookup
e uma camada tf.keras.layers.Embedding
. A saída padrão para o StringLookup
serão índices inteiros que podem ser alimentados diretamente num embedding.
Observação: a camada Embedding
contém parâmetros treináveis. Embora a camada StringLookup
possa ser aplicada a dados dentro ou fora de um modelo, a Embedding
deve sempre fazer parte de um modelo Keras treinável para que possa ser treinada corretamente.
Soma de dados categóricos ponderados
Em alguns casos, você precisará lidar com dados categóricos onde cada ocorrência de uma categoria vem com um peso associado. Em colunas de características, isto é tratado com tf.feature_column.weighted_categorical_column
. Quando emparelhado com um indicator_column
, isto tem o efeito de somar os pesos por categoria.
No Keras, isto pode ser feito passando uma entrada count_weights
para tf.keras.layers.CategoryEncoding
com output_mode='count'
.
Embedding de dados categóricos ponderados
Alternativamente, você talvez queira fazer um embedding de entradas categóricas ponderadas. Em colunas de características, a embedding_column
contém um argumento combiner
. Se qualquer amostra contiver múltiplas entradas para uma categoria, elas serão combinadas de acordo com a configuração do argumento (por padrão 'mean'
).
No Keras, não existe opção combiner
para tf.keras.layers.Embedding
, mas você consegue o mesmo efeito com tf.keras.layers.Dense
. A embedding_column
acima é simplesmente uma combinação linear de vetores de embedding de acordo com o peso da categoria. Embora não seja óbvio a princípio, é a mesma coisa que representar suas entradas categóricas como um vetor de peso esparso de tamanho (num_tokens)
e multiplicá-los por um kernel Dense
de formato (embedding_size, num_tokens)
.
Exemplo de treinamento completo
Para mostrar um workflow de treinamento completo, primeiro prepare alguns dados com três características de tipos diferentes:
Defina algumas constantes comuns para os workflows do TensorFlow 1 e do TensorFlow 2:
Com colunas de características
As colunas de características devem ser passadas como uma lista para o estimador na criação e serão chamadas implicitamente durante o treinamento.
As colunas de características também serão usadas para transformar os dados de entrada ao executar a inferência no modelo.
Com camadas de pré-processamento do Keras
As camadas de pré-processamento do Keras são mais flexíveis quanto a onde podem ser chamadas. Uma camada pode ser aplicada diretamente a tensores, usada dentro de um pipeline de entrada tf.data
ou construída diretamente em um modelo Keras treinável.
Neste exemplo, você aplicará camadas de pré-processamento dentro de um pipeline de entrada tf.data
. Para fazer isso, você pode definir um tf.keras.Model
separado para pré-processar suas características de entrada. Este modelo não é treinável, mas é uma maneira conveniente de agrupar as camadas de pré-processamento.
Observação: Como alternativa para fornecer um vocabulário e estatísticas de normalização na criação de camadas, muitas camadas de pré-processamento fornecem um método adapt()
para aprender o estado da camada diretamente dos dados de entrada. Consulte o guia de pré-processamento para obter mais detalhes.
Agora você pode aplicar esse modelo dentro de uma chamada para tf.data.Dataset.map
. Observe que a função passada para map
será convertida automaticamente em uma tf.function
, e as advertências usuais para escrever o código tf.function
se aplicam (sem efeitos colaterais).
Em seguida, você pode definir um Model
separado contendo as camadas treináveis. Observe como as entradas para este modelo agora refletem os tipos e formatos de características pré-processadas.
Agora você pode treinar o training_model
com tf.keras.Model.fit
.
Por fim, no momento da inferência, pode ser útil combinar esses estágios separados em um único modelo que lide com entradas de características brutas.
Este modelo composto pode ser salvo como um arquivo .keras
para uso posterior.
Observação: as camadas de pré-processamento não podem ser treinadas, o que permite aplicá-las de forma assíncrona usando tf.data
. Isso traz benefícios de desempenho, pois você pode pré-buscar lotes pré-processados e liberar quaisquer aceleradores para se concentrar nas partes diferenciáveis de um modelo (saiba mais na seção Pré-busca do guia Melhor desempenho com a API tf.data
). Como mostra este guia, separar o pré-processamento durante o treinamento e compô-lo durante a inferência é uma maneira flexível de aproveitar esses ganhos de desempenho. No entanto, se o seu modelo for pequeno ou o tempo de pré-processamento for insignificante, pode ser mais simples fazer o embedding do pré-processamento num modelo completo desde o início. Para fazer isso, você pode criar um único modelo começando com tf.keras.Input
, seguido por camadas de pré-processamento, seguidas por camadas treináveis.
Tabela de equivalência de colunas de características
Como referência, aqui está uma correspondência aproximada entre colunas de características e camadas de pré-processamento Keras:
Coluna de características | Camada Keras |
---|---|
`tf.feature_column.bucketized_column` | `tf.keras.layers.Discretization` |
`tf.feature_column.categorical_column_with_hash_bucket` | `tf.keras.layers.Hashing` |
`tf.feature_column.categorical_column_with_identity` | `tf.keras.layers.CategoryEncoding` |
`tf.feature_column.categorical_column_with_vocabulary_file` | `tf.keras.layers.StringLookup` ou `tf.keras.layers.IntegerLookup` |
`tf.feature_column.categorical_column_with_vocabulary_list` | `tf.keras.layers.StringLookup` ou `tf.keras.layers.IntegerLookup` |
`tf.feature_column.crossed_column` | `tf.keras.layers.experimental.preprocessing.HashedCrossing` |
`tf.feature_column.embedding_column` | `tf.keras.layers.Embedding` |
`tf.feature_column.indicator_column` | `output_mode='one_hot'` ou `output_mode='multi_hot'`* |
`tf.feature_column.numeric_column` | `tf.keras.layers.Normalization` |
`tf.feature_column.sequence_categorical_column_with_hash_bucket` | `tf.keras.layers.Hashing` |
`tf.feature_column.sequence_categorical_column_with_identity` | `tf.keras.layers.CategoryEncoding` |
`tf.feature_column.sequence_categorical_column_with_vocabulary_file` | `tf.keras.layers.StringLookup`, `tf.keras.layers.IntegerLookup`, ou `tf.keras.layer.TextVectorization`† |
`tf.feature_column.sequence_categorical_column_with_vocabulary_list` | `tf.keras.layers.StringLookup`, `tf.keras.layers.IntegerLookup`, ou `tf.keras.layer.TextVectorization`† |
`tf.feature_column.sequence_numeric_column` | `tf.keras.layers.Normalization` |
`tf.feature_column.weighted_categorical_column` | `tf.keras.layers.CategoryEncoding` |
O
output_mode
pode ser passado paratf.keras.layers.CategoryEncoding
,tf.keras.layers.StringLookup
,tf.keras.layers.IntegerLookup
etf.keras.layers.TextVectorization
.
† tf.keras.layers.TextVectorization
pode manipular entrada de texto de forma livre diretamente (por exemplo, frases inteiras ou parágrafos). Isto não é uma substituição um-para-um para manipulação de sequências categóricas no TensorFlow 1, mas pode oferecer uma substituição conveniente para o pré-processamento de texto ad-hoc.
Observação: os estimadores lineares, como tf.estimator.LinearClassifier
, podem lidar com entrada categórica direta (índices inteiros) sem uma embedding_column
ou indicator_column
. No entanto, os índices inteiros não podem ser passados diretamente para tf.keras.layers.Dense
ou tf.keras.experimental.LinearModel
. Essas entradas devem ser primeiro codificadas com tf.layers.CategoryEncoding
com output_mode='count'
(e sparse=True
se os tamanhos das categorias forem grandes) antes de chamar Dense
ou LinearModel
.
Próximos passos
Para obter mais informações sobre as camadas de pré-processamento do Keras, acesse o guia Trabalhando com camadas de pré-processamento.
Para um exemplo mais detalhado da aplicação de camadas de pré-processamento a dados estruturados, consulte o tutorial Classificando dados estruturados usando camadas de pré-processamento Keras.