Qual é o propósito de tf.app.flags no TensorFlow?

115

Estou lendo alguns códigos de exemplo no Tensorflow, encontrei o seguinte código

flags = tf.app.flags
FLAGS = flags.FLAGS
flags.DEFINE_float('learning_rate', 0.01, 'Initial learning rate.')
flags.DEFINE_integer('max_steps', 2000, 'Number of steps to run trainer.')
flags.DEFINE_integer('hidden1', 128, 'Number of units in hidden layer 1.')
flags.DEFINE_integer('hidden2', 32, 'Number of units in hidden layer 2.')
flags.DEFINE_integer('batch_size', 100, 'Batch size.  '
                 'Must divide evenly into the dataset sizes.')
flags.DEFINE_string('train_dir', 'data', 'Directory to put the training data.')
flags.DEFINE_boolean('fake_data', False, 'If true, uses fake data '
                 'for unit testing.')

no tensorflow/tensorflow/g3doc/tutorials/mnist/fully_connected_feed.py

Mas não consigo encontrar nenhum documento sobre o uso de tf.app.flags.

E descobri que a implementação dessas sinalizações está no tensorflow/tensorflow/python/platform/default/_flags.py

Obviamente, isso tf.app.flagsé de alguma forma usado para configurar uma rede, então por que não está nos documentos da API? Alguém pode explicar o que está acontecendo aqui?

flyaway1217
fonte

Respostas:

110

O tf.app.flagsmódulo é atualmente um wrapper fino em torno de python-gflags, portanto, a documentação para esse projeto é o melhor recurso para como usá-lo argparse , o que implementa um subconjunto da funcionalidade em python-gflags.

Observe que este módulo está atualmente empacotado como uma conveniência para escrever aplicativos de demonstração e não é tecnicamente parte da API pública, portanto, pode mudar no futuro.

Recomendamos que você implemente sua própria análise de sinalização usando argparseou qualquer biblioteca de sua preferência.

EDITAR: O tf.app.flagsmódulo não é implementado de fato usando python-gflags, mas usa uma API semelhante.

senhor
fonte
80
"empacotado como uma conveniência para escrever aplicativos demo e não é tecnicamente parte do AP público" ... é estranho que seja usado em quase todos os tutoriais, mas não há documentação sobre ele. Causa muita confusão.
speedplane
2
Para obter um bom exemplo de como usar argparse para passar argumentos para um modelo do TensorFlow e como agrupá-lo em um módulo Python para a nuvem, consulte task.py no módulo taxifare , parte dos materiais do curso de analista de dados de treinamento .
charlesreid1
3
É tf.app.runtambém não faz parte da API pública? Porque ele depende tf.app.flagse tem documentação pública ( tensorflow.org/api_docs/python/tf/app/run ), então presumo que seja público e com suporte. Se for recomendado o uso argparse, você poderia fornecer um breve exemplo da maneira recomendada de usá-lo com argparse?
naktinis de
6
a documentação não é um problema para tudo no tensorflow.
código morto de
37

O tf.app.flagsmódulo é uma funcionalidade fornecida pelo Tensorflow para implementar sinalizadores de linha de comando para seu programa Tensorflow. Como exemplo, o código que você encontrou faria o seguinte:

flags.DEFINE_float('learning_rate', 0.01, 'Initial learning rate.')

O primeiro parâmetro define o nome do sinalizador, enquanto o segundo define o valor padrão caso o sinalizador não seja especificado durante a execução do arquivo.

Portanto, se você executar o seguinte:

$ python fully_connected_feed.py --learning_rate 1.00

então, a taxa de aprendizagem é definida como 1,00 e permanecerá 0,01 se o sinalizador não for especificado.

Conforme mencionado neste artigo , os documentos provavelmente não estão presentes porque isso pode ser algo que o Google exige internamente para seus desenvolvedores usarem.

Além disso, conforme mencionado na postagem, há várias vantagens em usar sinalizadores do Tensorflow em vez da funcionalidade de sinalização fornecida por outros pacotes Python, como argparseespecialmente ao lidar com modelos do Tensorflow, sendo o mais importante que você pode fornecer informações específicas do Tensorflow para o código, como informações sobre qual GPU usar.

Vedang Waradpande
fonte
1
o que o terceiro parâmetro diz? provavelmente é como uma pequena string doc. Adoraria saber se estou errado.
shivam13juna
Sim, provavelmente é isso. Não vi nenhum uso prático para isso até agora, então suponho que seja para sua compreensão.
Vedang Waradpande
11

No Google, eles usam sistemas de sinalização para definir valores padrão para argumentos. É semelhante a argparse. Eles usam seu próprio sistema de sinalização em vez de argparse ou sys.argv.

Fonte: Já trabalhei lá antes.

Ahmed
fonte
5

Quando você usa tf.app.run(), você pode transferir a variável de forma muito conveniente entre threads usando tf.app.flags. Veja isto para uso posterior de tf.app.flags.

Cro
fonte
4

Depois de tentar várias vezes, descobri que isso imprimia todas as chaves FLAGS, bem como o valor real -

for key in tf.app.flags.FLAGS.flag_values_dict():

  print(key, FLAGS[key].value)
Nandani
fonte
3
você quer dizer FLAGS [tecla]
physincubus