Até onde eu sei, Variable
é a operação padrão para criar uma variável e get_variable
é usada principalmente para o compartilhamento de peso.
Por um lado, algumas pessoas sugerem o uso get_variable
da Variable
operação primitiva , sempre que você precisar de uma variável. Por outro lado, apenas vejo uso get_variable
nos documentos e demonstrações oficiais do TensorFlow.
Portanto, quero conhecer algumas regras práticas sobre como usar corretamente esses dois mecanismos. Existem princípios "padrão"?
python
tensorflow
Lifu Huang
fonte
fonte
Respostas:
Eu recomendo o uso sempre
tf.get_variable(...)
- facilitará a refatoração do seu código, se você precisar compartilhar variáveis a qualquer momento, por exemplo, em uma configuração de várias gpu (veja o exemplo CIFAR de várias gpu). Não há desvantagem nisso.Puro
tf.Variable
é de nível inferior; em algum momentotf.get_variable()
não existia, então algum código ainda usa a maneira de baixo nível.fonte
tf.Variable
portf.get_variable
todos os lugares. É quando eu quero inicializar uma variável com uma matriz numpy, não consigo encontrar uma maneira limpa e eficiente de fazê-lo, como faço comtf.Variable
. Como você resolve isso? Obrigado.tf.Variable é uma classe e existem várias maneiras de criar tf.Variable, incluindo
tf.Variable.__init__
etf.get_variable
.tf.Variable.__init__
: Cria uma nova variável com valor_inicial .tf.get_variable
: Obtém uma variável existente com esses parâmetros ou cria uma nova. Você também pode usar o inicializador.É muito útil usar inicializadores como
xavier_initializer
:Mais informações aqui .
fonte
Variable
verdade quero dizer usando o seu__init__
. Comoget_variable
é tão conveniente, eu me pergunto por que a maioria dos códigos do TensorFlow que eu vi usar emVariable
vez deget_variable
. Existem convenções ou fatores a serem considerados ao escolher entre eles. Obrigado!tf.Variable()
, podemos inicializá-lo como um valor aleatório a partir de uma distribuição normal truncada. Aqui está o meu exemplow1 = tf.Variable(tf.truncated_normal([5, 50], stddev = 0.01), name = 'w1')
. Qual seria o equivalente disso? como posso dizer que quero um normal truncado? Devo apenas fazerw1 = tf.get_variable(name = 'w1', shape = [5,50], initializer = tf.truncated_normal, regularizer = tf.nn.l2_loss)
?tf.truncated_normal_initializer()
para obter o resultado desejado.Eu posso encontrar duas diferenças principais entre uma e outra:
A primeira é que
tf.Variable
sempre criará uma nova variável, enquantotf.get_variable
obtém uma variável existente com parâmetros especificados no gráfico e, se não existir, cria uma nova.tf.Variable
requer que um valor inicial seja especificado.É importante esclarecer que a função
tf.get_variable
prefixa o nome com o escopo da variável atual para executar verificações de reutilização. Por exemplo:O último erro de asserção é interessante: Duas variáveis com o mesmo nome no mesmo escopo devem ser a mesma variável. Mas se você testar os nomes das variáveis
d
ee
perceberá que o Tensorflow mudou o nome da variávele
:fonte
d.name
ee.name
, acabo de vir através de um doc este TensorFlow no tensor operação gráfico de nomenclatura que explica:If the default graph already contained an operation named "answer", the TensorFlow would append "_1", "_2", and so on to the name, in order to make it unique.
Outra diferença reside em que um está na
('variable_store',)
coleção, mas o outro não.Por favor, veja o código fonte :
Deixe-me ilustrar isso:
A saída:
fonte