Quais são as diferenças entre essas funções?
tf.variable_op_scope(values, name, default_name, initializer=None)
Retorna um gerenciador de contexto para definir uma operação que cria variáveis. Esse gerenciador de contexto valida se os valores fornecidos são do mesmo gráfico, garante que o gráfico seja o gráfico padrão e envia um escopo de nome e um escopo variável.
tf.op_scope(values, name, default_name=None)
Retorna um gerenciador de contexto para uso ao definir uma operação em Python. Esse gerenciador de contexto valida se os valores fornecidos são do mesmo gráfico, garante que esse gráfico seja o gráfico padrão e envia um escopo de nome.
tf.name_scope(name)
Wrapper para
Graph.name_scope()
usar o gráfico padrão. VejaGraph.name_scope()
para mais detalhes.
tf.variable_scope(name_or_scope, reuse=None, initializer=None)
Retorna um contexto para o escopo variável. O escopo variável permite criar novas variáveis e compartilhar as já criadas, fornecendo verificações para não criar ou compartilhar por acidente. Para obter detalhes, consulte o Tutorial sobre escopo variável, aqui apresentamos apenas alguns exemplos básicos.
fonte
Respostas:
Vamos começar com uma breve introdução ao compartilhamento de variáveis. É um mecanismo
TensorFlow
que permite compartilhar variáveis acessadas em diferentes partes do código sem passar referências à variável ao redor.O método
tf.get_variable
pode ser usado com o nome da variável como argumento para criar uma nova variável com esse nome ou recuperar a que foi criada antes. Isso é diferente de usar otf.Variable
construtor que criará uma nova variável toda vez que for chamada (e potencialmente incluirá um sufixo no nome da variável, se já existir uma variável com esse nome).É para o objetivo do mecanismo de compartilhamento de variáveis que um tipo separado de escopo (escopo variável) foi introduzido.
Como resultado, acabamos tendo dois tipos diferentes de escopos:
tf.name_scope
tf.variable_scope
Ambos os escopos têm o mesmo efeito em todas as operações, bem como nas variáveis criadas usando
tf.Variable
, ou seja, o escopo será adicionado como um prefixo à operação ou ao nome da variável.No entanto, o escopo do nome é ignorado por
tf.get_variable
. Podemos ver isso no seguinte exemplo:A única maneira de colocar uma variável acessada usando
tf.get_variable
em um escopo é usar um escopo variável, como no exemplo a seguir:Isso nos permite compartilhar facilmente variáveis entre diferentes partes do programa, mesmo dentro de diferentes escopos de nome:
ATUALIZAR
A partir da versão r0.11
op_scope
evariable_op_scope
são preteridos e substituídos porname_scope
evariable_scope
.fonte
scope
método que efetivamente faz umvariable_scope
?"variable_scope
vsname_scope
é necessária. Se alguém cria uma variável (de qualquer forma comtf.Variable
outf.get_variable
), parece-me mais natural que sempre possamos obtê-la se especificarmos o escopo ou o nome completo. Não entendo por que um ignora a coisa do nome do escopo, enquanto o outro não. Você entende o racional desse comportamento estranho?Ambos variable_op_scope e op_scope estão agora obsoleto e não deve ser usado em tudo.
Em relação aos outros dois, também tive problemas para entender a diferença entre variable_scope e name_scope (eles pareciam quase iguais) antes de tentar visualizar tudo criando um exemplo simples:
Aqui, crio uma função que cria algumas variáveis e constantes e as agrupa em escopos (dependendo do tipo que eu forneço). Nesta função, também imprimo os nomes de todas as variáveis. Depois disso, executo o gráfico para obter valores dos valores resultantes e salvar os arquivos de eventos para investigá-los no TensorBoard. Se você executar isso, obterá o seguinte:
Você vê o padrão semelhante se abrir o TensorBoard (como você vê
b
fora doscope_name
retangular):Isso fornece a resposta :
Agora você vê que
tf.variable_scope()
adiciona um prefixo aos nomes de todas as variáveis (não importa como você as cria), ops, constantes. Por outro lado,tf.name_scope()
ignora as variáveis criadas com,tf.get_variable()
porque pressupõe que você sabe qual variável e em qual escopo você deseja usar.Uma boa documentação sobre o compartilhamento de variáveis informa que
A mesma documentação fornece mais detalhes de como o Escopo Variável funciona e quando é útil.
fonte
Namespaces é uma maneira de organizar nomes para variáveis e operadores de maneira hierárquica (por exemplo, "scopeA / scopeB / scopeC / op1")
tf.name_scope
cria um espaço para nome para operadores no gráfico padrão.tf.variable_scope
cria um espaço para nome para variáveis e operadores no gráfico padrão.tf.op_scope
igual atf.name_scope
, mas para o gráfico no qual as variáveis especificadas foram criadas.tf.variable_op_scope
igual atf.variable_scope
, mas para o gráfico no qual as variáveis especificadas foram criadas.Os links para as fontes acima ajudam a desambiguar esse problema de documentação.
Este exemplo mostra que todos os tipos de escopos definem namespaces para variáveis e operadores com as seguintes diferenças:
tf.variable_op_scope
outf.variable_scope
compatíveis comtf.get_variable
(ignora outros dois escopos)tf.op_scope
etf.variable_op_scope
apenas selecione um gráfico de uma lista de variáveis especificadas para criar um escopo. Diferente de seu comportamento igualtf.name_scope
etf.variable_scope
adequadotf.variable_scope
evariable_op_scope
adicione o inicializador especificado ou padrão.fonte
Vamos simplificar: basta usar
tf.variable_scope
. Citando um desenvolvedor TF, :Além do fato de que
variable_scope
a funcionalidade basicamente estende a funcionalidadename_scope
, considere como eles não são tão bons juntos:Ao aderir
variable_scope
apenas a você evita algumas dores de cabeça devido a esse tipo de incompatibilidade.fonte
Quanto à API r0.11,
op_scope
evariable_op_scope
ambos estão obsoletos .name_scope
evariable_scope
pode ser aninhado:fonte
Você pode pensar neles como dois grupos:
variable_op_scope
eop_scope
pegar um conjunto de variáveis como entrada e foram projetados para criar operações. A diferença está em como elas afetam a criação de variáveis comtf.get_variable
:observe o nome da variável
v
nos dois exemplos.o mesmo para
tf.name_scope
etf.variable_scope
:Você pode ler mais sobre o escopo da variável no tutorial . Uma pergunta semelhante foi feita antes no Stack Overflow.
fonte
Na última seção desta página da documentação do tensorflow: Nomes das operações em
tf.variable_scope()
fonte
Resposta compatível com Tensorflow 2.0 : As explicações
Andrzej Pronobis
eSalvador Dali
são muito detalhadas sobre as funções relacionadas aScope
.Das funções de escopo discutidas acima, que estão ativas a partir de agora (17 de fevereiro de 2020) são
variable_scope
ename_scope
.Especificando as chamadas compatíveis com 2.0 para essas funções, discutimos acima, para o benefício da comunidade.
Função no 1.x :
tf.variable_scope
tf.name_scope
Função respectiva no 2.x :
tf.compat.v1.variable_scope
tf.name_scope
(tf.compat.v2.name_scope
se migrado de1.x to 2.x
)Para obter mais informações sobre a migração de 1.x para 2.x, consulte este Guia de migração .
fonte