Atualização automática de código para o TensorFlow 2



O material fornece uma tradução do manual para atualizar automaticamente o código do TensorFlow 1.x para o Tensorflow 2 usando o script de atualização tf_upgrade_v2 .

O TensorFlow 2.0 inclui muitas alterações na API, como alterar a ordem dos argumentos, renomear caracteres e alterar os valores padrão dos parâmetros. A correção manual de todas essas modificações é tediosa e propensa a erros. Para simplificar as alterações e tornar sua transição para o TF 2.0 o mais suave possível, a equipe do tf_upgrade_v2 criou o utilitário tf_upgrade_v2 para ajudar a passar do código legado para a nova API.
Nota: tf_upgrade_v2 instalado automaticamente para o TensorFlow 1.13 e posterior (incluindo todas as compilações do TF 2.0).
Um uso típico do script é assim:

 tf_upgrade_v2 \ --intree my_project/ \ --outtree my_project_v2/ \ --reportfile report.txt 

Esse código acelera o processo de atualização convertendo os scripts existentes do TensorFlow 1.x Python para o TensorFlow 2.0.

O script de conversão automatiza o processo o máximo possível, mas ainda existem alterações sintáticas e estilísticas que não podem ser corrigidas pelo script.

Módulos de Compatibilidade


Alguns caracteres da API não podem ser atualizados simplesmente usando a substituição de string. Para garantir que seu código funcione no TensorFlow 2.0, o script de atualização inclui o módulo compat.v1 . Este módulo substitui caracteres TF 1.x, como tf.foo , pelo link equivalente tf.compat.v1.foo . Embora o módulo de compatibilidade seja bom, recomendamos que você subtraia manualmente as substituições e as migre para as novas APIs no espaço de nomes tf. * tf. * vez do espaço para nome tf.compat.v1 mais rápido possível.

Devido à depreciação dos módulos do TensorFlow 2.x (por exemplo, tf.flags e tf.contrib ), algumas alterações não podem ser ignoradas alternando para compat.v1 . A atualização desse código pode exigir o uso de uma biblioteca adicional (por exemplo, absl.flags ou alternar para um pacote no tenorflow/addons .

Processo de atualização recomendado


Esta parte do manual demonstra o uso do script de atualização. Embora o script de atualização seja fácil de usar, é altamente recomendável que você use o script como parte do processo a seguir:

  1. Testes de unidade : verifique se o código atualizado possui um conjunto de testes de unidade com cobertura razoável. Este é o código Python, portanto a linguagem não o protegerá de muitas classes de erro. Verifique também se todas as suas dependências foram atualizadas para compatíveis com o TensorFlow 2.0.
  2. Instale o TensorFlow 1.14 : atualize o TensorFlow para a versão mais recente do TensorFlow 1.x, pelo menos 1.14. Ele inclui a API final do TensorFlow 2.0 em tf.compat.v2 .
  3. Código de teste com 1.14 : Certifique-se de que seus testes de unidade sejam aprovados neste momento. Você os reiniciará durante o processo de atualização, portanto, é importante começar com uma cor verde.
  4. Execute o script de atualização : Execute tf_upgrade_v2 em toda a árvore de origem, incluindo testes. Isso atualizará seu código para um formato no qual ele usa apenas os caracteres disponíveis no TensorFlow 2.0. Caracteres obsoletos estarão disponíveis em tf.compat.v1 . Posteriormente, eles exigirão processamento manual. \ N ",
  5. Execute testes convertidos com o TensorFlow 1.14 : seu código ainda deve ser executado corretamente no TensorFlow 1.14. Execute os testes de unidade novamente. Qualquer erro nos seus testes neste estágio significa que há um erro no script de atualização.
  6. Verifique se há avisos e erros no relatório de atualização : O script grava um arquivo de relatório explicando todas as conversões que você precisa verificar duas vezes ou todas as ações que precisam ser executadas manualmente. Por exemplo: Quaisquer instâncias de contribuição restantes requerem remoção manual.
  7. Instale o TensorFlow 2.0 : neste momento, a mudança para o TensorFlow 2.0 deve ser segura.
  8. Teste o código com v1.disable_v2_behavior : Reinicie seus testes com v1.disable_v2_behavior() na principal função de teste, os resultados devem ser os mesmos que quando executados em 1.14.
  9. Ativar comportamento da V2 : agora que seus testes estão sendo executados usando a API da v2, você pode começar a assistir à inclusão do v2 behavior da v2 behavior . Dependendo de como o seu código foi escrito, isso pode exigir algumas alterações.

Usando o script de atualização


Instalação


 from __future__ import absolute_import, division, print_function, unicode_literals 

 try: import tensorflow.compat.v2 as tf except Exception: pass tf.enable_v2_behavior() print(tf.__version__) 

Clone o repositório tensorflow / models para que você tenha algum código para experimentação:

 !git clone --branch r1.13.0 --depth 1 https://github.com/tensorflow/models 

Leia a ajuda


O script deve ser instalado com o TensorFlow. A ajuda interna é chamada assim:

 !tf_upgrade_v2 -h 

Exemplo de código TF1


Aqui está um script simples do TensorFlow 1.0 que não é executado no TensorFlow 2.0

 !head -n 65 models/samples/cookbook/regression/custom_regression.py | tail -n 10 

  # Calculate loss using mean squared error average_loss = tf.losses.mean_squared_error(labels, predictions) # Pre-made estimators use the total_loss instead of the average, # so report total_loss for compatibility. batch_size = tf.shape(labels)[0] total_loss = tf.to_float(batch_size) * average_loss if mode == tf.estimator.ModeKeys.TRAIN: optimizer = params.get("optimizer", tf.train.AdamOptimizer) 

dando o seguinte erro:

 Traceback (most recent call last): File "custom_regression.py", line 162, in <module> tf.logging.set_verbosity(tf.logging.INFO) AttributeError: module 'tensorflow' has no attribute 'logging' 

Arquivo único


O script de atualização pode ser executado em um arquivo Python separado:

 !tf_upgrade_v2 \ --infile models/samples/cookbook/regression/custom_regression.py \ --outfile /tmp/custom_regression_v2.py 

O script exibirá erros se não conseguir encontrar correções para o código.

 INFO line 38:8: Renamed 'tf.feature_column.input_layer' to 'tf.compat.v1.feature_column.input_layer' INFO line 43:10: Renamed 'tf.layers.dense' to 'tf.compat.v1.layers.dense' INFO line 46:17: Renamed 'tf.layers.dense' to 'tf.compat.v1.layers.dense' INFO line 57:17: tf.losses.mean_squared_error requires manual check. tf.losses have been replaced with object oriented versions in TF 2.0 and after. The loss function calls have been converted to compat.v1 for backward compatibility. Please update these calls to the TF 2.0 versions. INFO line 57:17: Renamed 'tf.losses.mean_squared_error' to 'tf.compat.v1.losses.mean_squared_error' INFO line 61:15: Added keywords to args of function 'tf.shape' INFO line 62:15: Changed tf.to_float call to tf.cast(..., dtype=tf.float32). INFO line 65:40: Renamed 'tf.train.AdamOptimizer' to 'tf.compat.v1.train.AdamOptimizer' INFO line 68:39: Renamed 'tf.train.get_global_step' to 'tf.compat.v1.train.get_global_step' INFO line 83:9: tf.metrics.root_mean_squared_error requires manual check. tf.metrics have been replaced with object oriented versions in TF 2.0 and after. The metric function calls have been converted to compat.v1 for backward compatibility. Please update these calls to the TF 2.0 versions. INFO line 83:9: Renamed 'tf.metrics.root_mean_squared_error' to 'tf.compat.v1.metrics.root_mean_squared_error' INFO line 142:23: Renamed 'tf.train.AdamOptimizer' to 'tf.compat.v1.train.AdamOptimizer' INFO line 162:2: Renamed 'tf.logging.set_verbosity' to 'tf.compat.v1.logging.set_verbosity' INFO line 162:27: Renamed 'tf.logging.INFO' to 'tf.compat.v1.logging.INFO' INFO line 163:2: Renamed 'tf.app.run' to 'tf.compat.v1.app.run' TensorFlow 2.0 Upgrade Script ----------------------------- Converted 1 files Detected 0 issues that require attention -------------------------------------------------------------------------------- Make sure to read the detailed log 'report.txt' 

Árvore de diretórios


Projetos típicos, incluindo este exemplo simples, usam mais de um arquivo. Normalmente você deseja atualizar o pacote inteiro, para que o script também possa ser executado na árvore de diretórios:

 #   .py      outtree !tf_upgrade_v2 \ --intree models/samples/cookbook/regression/ \ --outtree regression_v2/ \ --reportfile tree_report.txt 

Preste atenção a uma observação sobre a função
 dataset.make_one_shot_iterator 
.

Agora o script já está funcionando com o TensorFlow 2.0.

Observe que, devido ao módulo `tf.compat.v1`, o script convertido também será executado no TensorFlow 1.14.

Relatório detalhado


O script também publica uma lista detalhada de alterações. Neste exemplo, ele encontrou uma transformação possivelmente insegura e adicionou um aviso na parte superior do arquivo:

 !head -n 20 tree_report.txt 

 TensorFlow 2.0 Upgrade Script ----------------------------- Converted 7 files Detected 1 issues that require attention -------------------------------------------------------------------------------- -------------------------------------------------------------------------------- File: models/samples/cookbook/regression/automobile_data.py -------------------------------------------------------------------------------- models/samples/cookbook/regression/automobile_data.py:125:15: WARNING: Changing dataset.make_one_shot_iterator() to tf.compat.v1.data.make_one_shot_iterator(dataset). Please check this transformation. ================================================================================ Detailed log follows: ================================================================================ ================================================================================ Input tree: 'models/samples/cookbook/regression/' ================================================================================ -------------------------------------------------------------------------------- Processing file 'models/samples/cookbook/regression/custom_regression.py' outputting to 'regression_v2/custom_regression.py' 

Preste atenção novamente em uma observação sobre a Dataset.make_one_shot_iterator function .

Modo de segurança


O script de conversão também possui um modo "SECURE" menos invasivo que simplesmente altera as importações para usar o módulo tensorflow.compat.v1 .

 !tf_upgrade_v2 --mode SAFETY --infile dropout.py --outfile dropout_v2_safe.py > /dev/null 

Por exemplo, código:

 import tensorflow as tf d = tf.nn.dropout(tf.range(10), 0.2) z = tf.zeros_like(d, optimize=False) 


neste modo é convertido para o seguinte:

 import tensorflow.compat.v1 as tf tf.disable_v2_behavior() d = tf.nn.dropout(tf.range(10), 0.2) z = tf.zeros_like(d, optimize=False) 

Como você pode ver, seu código não foi atualizado, mas agora o código do TensorFlow 1 é executado no TensorFlow 2.

Advertências


  • Não atualize partes do seu código manualmente antes de executar o script. Em particular, funções com argumentos reordenados, como tf.argmax ou tf.batch_to_space , forçarão o script a adicionar incorretamente argumentos de palavras-chave, o que confundirá seu código existente.
  • O script assume que o tensorflow importado usando import tensorflow as tf
  • O script não reordena os argumentos. Em vez disso, o script adiciona as palavras-chave dos argumentos às funções nas quais os argumentos são revertidos.

Após a verificação, a tradução também aparecerá no Tensorflow.org. Se você deseja participar da tradução da documentação do site Tensorflow.org para o russo, entre em contato com um comentário ou pessoal. Quaisquer correções ou comentários são apreciados.

Source: https://habr.com/ru/post/pt483184/


All Articles