A partir da versão 0.30 do tf.Transform , o comportamento padrão é exportar um TF 2.x SavedModel, a menos que os comportamentos do TF 2.x sejam explicitamente desabilitados. Esta página fornece um guia para usar tf.Transform para exportar o gráfico de transformação como um SavedModel do TensorFlow 2.x.
Novo no tf.Transform com TF 2.x
Carregando modelos Keras dentro do preprocessing_fn
Use a API tft.make_and_track_object para carregar modelos Keras conforme mostrado no exemplo abaixo.
def preprocessing_fn(inputs):
keras_model = tft.make_and_track_object(lambda: tf.keras.models.load_model(...), name='_unique_name')
...
return {'keras_model_output': keras_model(inputs[...])}
Usando módulos TF 2.x tf.hub
Os módulos do hub TF 2.x funcionam em tf.Transform somente quando o preprocessing_fn é rastreado e exportado como um TF 2.x SavedModel (este é o comportamento padrão começando com tensorflow_transform 0.30 ). Use a API tft.make_and_track_object para carregar módulos tf.hub conforme mostrado no exemplo abaixo.
def preprocessing_fn(inputs):
hub_module = tft.make_and_track_object(lambda: hub.load(...))
...
return {'hub_module_output': hub_module(inputs[...])}
Potenciais problemas de migração
Ao migrar um pipeline tf.Transform existente do TF 1.x para o TF 2.x, os seguintes problemas poderão ser encontrados:
RuntimeError: A ordem dos analisadores em seu preprocessing_fn parece não ser determinística.
No TF 2.x, o preprocessing_fn fornecido pelo usuário é rastreado diversas vezes. Se a ordem em que os analisadores TFT são encontrados mudar a cada rastreamento, esse erro será gerado. Isso pode ser corrigido removendo qualquer não-determinismo na ordem em que os analisadores TFT são invocados.
A saída de transform_raw_features não contém o recurso esperado.
Exceções de exemplo:
KeyError: \<feature key
ou
\<feature key> not found in features dictionary.
TFTransformOutput.transform_raw_features ignora o parâmetro drop_unused_features e se comporta como se fosse True. Atualize todos os usos do dicionário de saída desta API para verificar se a chave que você está tentando recuperar existe nela.
tf.estimator.BaselineClassifier vê erro de tabela não inicializada.
Exceção de exemplo:
tensorflow.python.framework.errors_impl.FailedPreconditionError: Table not initialized.
O suporte para Trainer com executor baseado em Estimador é o melhor esforço. Embora outros estimadores funcionem, vimos problemas com a inicialização da tabela no BaselineClassifier. Desative o TF 2.x em tf.Transform .
Problemas conhecidos/Recursos ainda não suportados
A saída de vocabulários no formato TFRecord ainda não é suportada.
tfrecord_gzip ainda não é suportado como um valor válido para o parâmetro file_format em tft.vocabulary (e outras APIs de vocabulário).
Mantendo o comportamento legado do tf.Transform
Se o pipeline tf.Transform não for executado com o TF 2.x, você poderá manter o comportamento legado de uma das seguintes maneiras:
- Desative o TF2 em
tf.Transformchamandotf.compat.v1.disable_v2_behavior() - Passando
force_tf_compat_v1=Trueparatft_beam.Contextse estiver usandotf.Transformcomo uma biblioteca independente ou para o componente Transform no TFX.