Sou novato no TensorFlow. Estou confuso sobre a diferença entre tf.placeholder
e tf.Variable
. Na minha opinião, tf.placeholder
é usado para dados de entrada e tf.Variable
é usado para armazenar o estado dos dados. Isso é tudo o que eu sei.
Alguém poderia me explicar mais detalhadamente sobre suas diferenças? Em particular, quando usar tf.Variable
e quando usar tf.placeholder
?
tensorflow
J.Doe
fonte
fonte
Variable
s, mas nãoplaceholder
s (cujos valores sempre devem ser fornecidos).Respostas:
Em resumo, você usa
tf.Variable
para variáveis treináveis, como pesos (W) e desvios (B) para o seu modelo.tf.placeholder
é usado para alimentar exemplos reais de treinamento.É assim que você alimenta os exemplos de treinamento durante o treinamento:
Seu
tf.variables
será treinado (modificado) como resultado deste treinamento.Veja mais em https://www.tensorflow.org/versions/r0.7/tutorials/mnist/tf/index.html . (Exemplos são retirados da página da web.)
fonte
tensorflow
edeep learning
eAI
são.A diferença é que
tf.Variable
você precisa fornecer um valor inicial quando o declara. Comtf.placeholder
você, você não precisa fornecer um valor inicial e pode especificá-lo em tempo de execução com ofeed_dict
argumento dentroSession.run
fonte
Como os cálculos de tensores compõem gráficos , é melhor interpretar os dois em termos de gráficos.
Tomemos, por exemplo, a regressão linear simples
onde
W
eB
representam os pesos e desvios eX
as entradasY
das observações e os resultados das observações.Obviamente
X
eY
são da mesma natureza (variáveis manifestas) que diferem da deW
eB
(variáveis latentes).X
eY
são valores das amostras (observações) e, portanto, precisam de um local a ser preenchido , enquantoW
eB
são os pesos e desvios, variáveis (os valores anteriores afetam os últimos) no gráfico que devem ser treinados usando paresX
e diferentesY
. Colocamos amostras diferentes para os espaços reservados para treinar as variáveis .Só precisamos salvar ou restaurar as variáveis (nos pontos de verificação) para salvar ou reconstruir o gráfico com o código.
Os marcadores de posição são principalmente titulares dos diferentes conjuntos de dados (por exemplo, dados de treinamento ou dados de teste). No entanto, as variáveis são treinadas no processo de treinamento para tarefas específicas, ou seja, para prever o resultado da entrada ou mapear as entradas para os rótulos desejados. Eles permanecem os mesmos até você treinar ou ajustar o modelo usando amostras diferentes ou iguais para preencher os espaços reservados frequentemente com o ditado. Por exemplo:
Os espaços reservados também são passados como parâmetros para definir modelos.
Se você alterar espaços reservados (adicionar, excluir, alterar a forma etc.) de um modelo no meio do treinamento, ainda poderá recarregar o ponto de verificação sem outras modificações. Mas se as variáveis de um modelo salvo forem alteradas, você deve ajustar o ponto de verificação de acordo para recarregá-lo e continuar o treinamento (todas as variáveis definidas no gráfico devem estar disponíveis no ponto de verificação).
Para resumir, se os valores são das amostras (observações que você já possui), você cria um espaço reservado para segurá-las, enquanto que se precisar de um parâmetro a ser treinado, utiliza uma variável (basta colocar, defina as variáveis para os valores desejados para usar o TF automaticamente).
Em alguns modelos interessantes, como um modelo de transferência de estilo , os pixes de entrada serão otimizados e as variáveis de modelo normalmente chamadas serão corrigidas; então, devemos fazer a entrada (geralmente inicializada aleatoriamente) como uma variável conforme implementada nesse link.
Para mais informações, deduza a este documento simples e ilustrativo .
fonte
TL; DR
Variáveis
Espaços reservados
tf.placeholder_with_default
)fonte
A diferença mais óbvia entre o tf.Variable e o tf.placeholder é que
A inicialização das variáveis é feita com
sess.run(tf.global_variables_initializer())
. Além disso, ao criar uma variável, você precisa passar um tensor como seu valor inicial para oVariable()
construtor e, ao criar uma variável, sempre conhece sua forma.Por outro lado, você não pode atualizar o espaço reservado. Eles também não devem ser inicializados, mas como prometem ter um tensor, é necessário alimentar o valor neles
sess.run(<op>, {a: <some_val>})
. E, finalmente, em comparação com uma variável, o espaço reservado pode não conhecer a forma. Você pode fornecer partes das dimensões ou não fornecer absolutamente nada.Existem outras diferenças:
Parte interessante é que não apenas os espaços reservados podem ser alimentados. Você pode alimentar o valor para uma variável e até para uma constante.
fonte
Além das respostas de outras pessoas, elas também explicam muito bem neste tutorial do MNIST no site da Tensoflow:
fonte
x
a forma[batch size, features]
, temos os pesos que vão da entrada à primeira camada de tamanho[features, hidden units]
e os vieses[hidden units]
. Então, minha pergunta é: como os multiplicamos juntos? Se o fizermostf.matmul(x, w)
, então nós vamos chegar[batch size, hidden units]
e não podemosb
a ela, uma vez que tem forma[hidden units]
O Tensorflow usa três tipos de contêineres para armazenar / executar o processo
Constantes: Constantes mantém os dados típicos.
variáveis: os valores dos dados serão alterados, com as respectivas funções como cost_function.
espaços reservados: os dados de treinamento / teste serão transmitidos para o gráfico.
fonte
Fragmento de exemplo:
Como o nome diz, o espaço reservado é uma promessa de fornecer um valor posteriormente, ou seja
Variáveis são simplesmente os parâmetros de treinamento (
W
(matriz),b
(viés) iguais às variáveis normais que você usa em sua programação diária, que o treinador atualiza / modifica em cada corrida / etapa.Embora o espaço reservado não exija nenhum valor inicial, que quando você criou
x
ey
TF não alocou nenhuma memória, mais tarde, quando você alimenta os espaços reservados nosess.run()
usofeed_dict
, o TensorFlow alocará a memória de tamanho apropriado para eles (x
ey
) - isso sem restrições - nos permite alimentar qualquer tamanho e forma de dados.Em poucas palavras :
Variável - é um parâmetro que você deseja que o treinador (por exemplo, GradientDescentOptimizer) atualize após cada etapa.
Demonstração de espaço reservado -
Execução:
resultando na saída
No primeiro caso, 3 e 4.5 serão passados para
a
eb
respectivamente e , em seguida, para adder_node ouputting 7. No segundo caso, há uma lista de feeds, os primeiros passos 1 e 2 serão adicionados, os próximos 3 e 4 (a
eb
).Leituras relevantes:
fonte
Variáveis
Uma variável TensorFlow é a melhor maneira de representar o estado persistente e compartilhado manipulado pelo seu programa. As variáveis são manipuladas através da classe tf.Variable. Internamente, uma variável tf.Variable armazena um tensor persistente. Operações específicas permitem ler e modificar os valores desse tensor. Essas modificações são visíveis em várias tf.Sessions, para que vários trabalhadores possam ver os mesmos valores para uma tf.Variable. As variáveis devem ser inicializadas antes do uso.
Exemplo:
Isso cria um gráfico de computação. As variáveis (x e y) podem ser inicializadas e a função (f) avaliada em uma sessão de fluxo tensor da seguinte maneira:
Espaços reservados
Um espaço reservado é um nó (igual a uma variável) cujo valor pode ser inicializado no futuro. Esses nós basicamente emitem o valor atribuído a eles durante o tempo de execução. Um nó de espaço reservado pode ser atribuído usando a classe tf.placeholder () à qual você pode fornecer argumentos como o tipo da variável e / ou sua forma. Os espaços reservados são usados extensivamente para representar o conjunto de dados de treinamento em um modelo de aprendizado de máquina, pois o conjunto de dados de treinamento continua mudando.
Exemplo:
Nota: 'Nenhum' para uma dimensão significa 'qualquer tamanho'.
Referências:
fonte
Pense
Variable
no tensorflow como variáveis normais que usamos nas linguagens de programação. Inicializamos variáveis, também podemos modificá-lo mais tarde. Considerandoplaceholder
que não requer valor inicial. O espaço reservado simplesmente aloca bloco de memória para uso futuro. Mais tarde, podemos usarfeed_dict
para alimentar os dadosplaceholder
. Por padrão,placeholder
possui uma forma sem restrições, que permite alimentar tensores de diferentes formas em uma sessão. Você pode criar uma forma restrita passando o argumento opcional -shape, como fiz abaixo.Ao executar a tarefa de aprendizado de máquina, na maioria das vezes não temos conhecimento do número de linhas, mas (vamos assumir) sabemos o número de recursos ou colunas. Nesse caso, podemos usar None.
Agora, no tempo de execução, podemos alimentar qualquer matriz com 4 colunas e qualquer número de linhas.
Além disso, os marcadores de posição são usados para dados de entrada (são tipos de variáveis que usamos para alimentar nosso modelo), onde variáveis são parâmetros como pesos que treinamos ao longo do tempo.
fonte
Espaço reservado:
Um espaço reservado é simplesmente uma variável à qual atribuiremos os dados posteriormente. Ele nos permite criar nossas operações e construir nosso gráfico de computação, sem precisar dos dados. Na terminologia do TensorFlow, alimentamos os dados no gráfico através desses espaços reservados.
Os valores iniciais não são necessários, mas podem ter valores padrão com
tf.placeholder_with_default)
Temos que fornecer valor em tempo de execução como:
Variável :
Exemplo:
tf.Variable("Welcome to tensorflow!!!")
fonte
Resposta compatível com Tensorflow 2.0 : O conceito de espaços reservados,
tf.placeholder
não estará disponívelTensorflow 2.x (>= 2.0)
por padrão, pois o modo de execução padrão é a execução ansiosa.No entanto, podemos usá-los se usados em
Graph Mode
(Disable Eager Execution
).Comando equivalente para TF Placeholder na versão 2.x é
tf.compat.v1.placeholder
.O comando equivalente para a variável TF na versão 2.x é
tf.Variable
e se você deseja migrar o código de 1.x para 2.x, o comando equivalente étf.compat.v2.Variable
.Consulte esta página do Tensorflow para obter mais informações sobre o Tensorflow versão 2.0.
Consulte o Guia de migração para obter mais informações sobre migração das versões 1.x para 2.x.
fonte
Pense em um gráfico de computação . Nesse gráfico, precisamos de um nó de entrada para passar nossos dados para o gráfico; esses nós devem ser definidos como Espaço reservado no fluxo tensor .
Não pense como um programa geral em Python. Você pode escrever um programa Python e fazer todas as coisas que os caras explicaram em outras respostas apenas por Variáveis, mas para gráficos de computação em fluxo tensor, para alimentar seus dados com o gráfico, você precisa definir esses acenos como espaços reservados.
fonte