tf.placeholder와 tf.Variable의 차이점은 무엇입니까?


290

저는 TensorFlow의 초보자입니다. 나는 사이의 차이에 대해 혼란스러워하고있어 tf.placeholdertf.Variable. 내 견해로 tf.placeholder는 입력 데이터에 tf.Variable사용되며 데이터 상태를 저장하는 데 사용됩니다. 이것이 내가 아는 전부입니다.

누군가 차이점에 대해 더 자세히 설명해 주시겠습니까? 특히 사용 tf.Variable시기와 사용시기는 tf.placeholder?


7
직관적으로 Variables에 대한 그라디언트를 원 하지만 s에 대한 그라디언트를 원할 것입니다 placeholder(이 값은 항상 제공되어야 함).
Yibo Yang

cs231n.stanford.edu 와 같은 과정은 혼란스러운 사람들을 도울 수 있습니다. 나는 그것을 많이 좋아했다! 분명히 다른 것도 있습니다
네이버

답변:


175

즉, tf.Variable모델의 가중치 (W) 및 바이어스 (B)와 같은 학습 가능한 변수에 사용 합니다.

weights = tf.Variable(
    tf.truncated_normal([IMAGE_PIXELS, hidden1_units],
                    stddev=1.0 / math.sqrt(float(IMAGE_PIXELS))), name='weights')

biases = tf.Variable(tf.zeros([hidden1_units]), name='biases')

tf.placeholder 실제 교육 사례를 제공하는 데 사용됩니다.

images_placeholder = tf.placeholder(tf.float32, shape=(batch_size, IMAGE_PIXELS))
labels_placeholder = tf.placeholder(tf.int32, shape=(batch_size))

다음은 훈련 중 훈련 예제를 제공하는 방법입니다.

for step in xrange(FLAGS.max_steps):
    feed_dict = {
       images_placeholder: images_feed,
       labels_placeholder: labels_feed,
     }
    _, loss_value = sess.run([train_op, loss], feed_dict=feed_dict)

tf.variables이 교육의 결과로 귀하의 교육이 수정됩니다.

https://www.tensorflow.org/versions/r0.7/tutorials/mnist/tf/index.html 에서 자세한 내용을 참조하십시오 . (예는 웹 페이지에서 가져옵니다.)


2
이미지를 공급하기 전에 이미지를 사전 처리하려면 어떻게해야합니까? (예 : 대비 조정). 이제 이것에 변수가 필요합니까? 그렇다면 메모리 나 속도에 영향을 미치나요?
Bastiaan 2016 년

1
전처리는 데이터를 Tensorflow 그래프 (예 : 네트워크)에 공급하기 전에 오기 때문에 기술적으로 Tensorflow의 코드 도구가 필요하지 않습니다. 예를 들어 변수는 입력 데이터이므로 그래프에서 변수가 아닌 tf.placeholders를 통해 전달되고 2. 네트워크를 통한 현재 패스를 위해 플레이스 홀더에로드되기 전에 사전 처리가 수행됩니다. .
PaulG

이 답변에 얼마나 감사하고 있는지 알고 싶었습니다. 훨씬 적은 upvotes 질문보다이 답변에 있다는 사실은 인스턴트 만족 사람들이 할 수있는 방법을 보여 간다, 그리고 유행에 태그를 좋아 tensorflow하고 deep learning하고 AI있습니다.
나단

70

차이점은 tf.Variable선언 할 때 초기 값을 제공해야한다는 것입니다. 으로 tf.placeholder당신은 초기 값을 제공 할 필요가 없습니다 당신은과 런타임시를 지정할 수 있습니다 feed_dict인수 내부Session.run


63
-1. 사실이지만 이것은 요점을 그리워합니다. 더 중요한 차이점은 TensorFlow 내에서의 역할입니다. 변수는 시간이 지남에 따라 학습되고 자리 표시자는 입력 이미지 및 해당 이미지의 클래스 레이블과 같이 모델 학습으로 변경되지 않는 입력 데이터입니다. Sung Kim의 답변에서 알 수 있듯이 모델에서 가중치 및 바이어스에 변수를 사용합니다 (스타일 전송의 경우 제한되지는 않지만 시간이 지남에 따라 이미지를 최적화 함).
Chris Anderson

@ChrisAnderson이 그림이 잘못되었다고 말할 수 있습니까?! youtu.be/MotG3XI2qSs?t=136
N0rA

@ChrisAnderson 차이가 단지 하나의 초기 값을 필요로한다면 왜 그것이 사용되어야하는지 중요합니까?
Goldname

1
@Goldname 그것은 사용되는 것이 "의미"한 것이 아닙니다. 그것은 가능하고 불가능한 것입니다. 그것들은 완전히 다른 물건입니다. 그것들은 서로 바꿔 쓸 수 없으며 차이점은 "초기 값이 필요합니다"이상입니다.
크리스 앤더슨

61

텐서 계산은 그래프 로 구성되므로 그래프 로 두 가지를 해석하는 것이 좋습니다.

간단한 선형 회귀를 예로 들어 보겠습니다.

WX+B=Y

여기서, WB가중치와 바이어스 및 서 X관찰을 위해 '입력 및 Y관찰에 대한 출력이다.

분명히 XY의 차이가 동일한 특성 (매니페스트 변수)의 아르 WB(잠재 변수). X그리고 Y시료 (관측)하고 그에 따라 필요한 값이다 장소 채워질 때, W그리고 B가중치 및 바이어스이다 변수 상이한 사용 훈련되어야 그래프 (이전 값은 후자의 영향) XY쌍. 변수 를 훈련 시키기 위해 플레이스 홀더 에 다른 샘플을 배치 합니다 .

우리는 할 필요가 저장하거나 복원 변수 (검문소) 저장하거나 코드를 사용하여 그래프를 다시.

자리 표시 자는 주로 다른 데이터 집합 (예 : 교육 데이터 또는 테스트 데이터)의 소유자입니다. 그러나 변수 는 특정 작업, 즉 입력 결과를 예측하거나 입력을 원하는 레이블에 매핑하기 위해 교육 프로세스에서 학습됩니다. 다른 샘플이나 동일한 샘플을 사용하여 모델을 재교육하거나 미세 조정하여 종종 dict을 통해 플레이스 홀더 에 채울 때까지 동일하게 유지 됩니다. 예를 들어 :

 session.run(a_graph, dict = {a_placeholder_name : sample_values}) 

자리 표시 자는 모델을 설정하기위한 매개 변수로 전달됩니다.

교육 도중 모델의 자리 표시 자 (추가, 삭제, 모양 변경 등)를 변경해도 다른 수정없이 체크 포인트를 다시로드 할 수 있습니다. 그러나 저장된 모델의 변수가 변경되면 검사 점을 다시로드하고 훈련을 계속하도록 검사 점을 조정해야합니다 (그래프에 정의 된 모든 변수는 검사 점에서 사용 가능해야 함).

안전하게 당신이 하네스를 훈련하는 매개 변수를 필요로하는 경우 동안 자리, 그들을 막을 수 있도록 값이 샘플에서 경우 (관찰 당신이 이미 가지고), 요약하는 변수 (간단히 말하면, 설정된 변수 원하는 값에 대한 TF를 자동으로 사용하기 위해).

스타일 전송 모델 과 같은 일부 흥미로운 모델에서는 입력 픽스가 최적화되고 일반적으로 불리는 모델 변수가 고정 된 다음 해당 링크에 구현 된대로 입력 (일반적으로 무작위로 초기화)을 변수로 만들어야합니다.

자세한 내용은이 간단하고 예시적인 doc을 참조하십시오 .


38

TL; DR

변수

  • 배울 매개 변수
  • 훈련에서 가치를 얻을 수있다
  • 초기 값이 필요합니다 (종종 임의)

자리 표시 자

  • 데이터 (예 : 피드 중 이미지 픽셀 데이터)에 할당 된 스토리지
  • 초기 값은 필요하지 않지만 설정할 수 있습니다 (참조 tf.placeholder_with_default)

34

사이의 가장 큰 차이점 tf.Variabletf.placeholder는 점이다


변수를 사용하여 매개 변수를 보유하고 업데이트합니다. 변수는 텐서를 포함하는 인 메모리 버퍼입니다. 그것들은 명시 적으로 초기화되어야하며 훈련 중 및 훈련 후에 디스크에 저장 될 수 있습니다. 나중에 저장된 값을 복원하여 모델을 연습하거나 분석 할 수 있습니다.

변수의 초기화는로 수행됩니다 sess.run(tf.global_variables_initializer()). 또한 변수를 만드는 동안 초기 값으로 Tensor를 Variable()생성자 에 전달해야 하며 변수를 만들 때 항상 모양을 알고 있어야합니다.


반면 자리 표시자는 업데이트 할 수 없습니다. 또한 초기화되지 않아야하지만 텐서가 있다고 약속하기 때문에 값을 공급해야합니다 sess.run(<op>, {a: <some_val>}). 그리고 마지막으로 변수와 비교할 때 자리 표시자가 모양을 알지 못할 수 있습니다. 차원의 일부를 제공하거나 전혀 제공하지 않을 수 있습니다.


다른 차이점이 있습니다.

재미있는 부분은 자리 표시 자만 먹이를 줄 수 있다는 것입니다. 변수 및 상수에 값을 공급할 수 있습니다.


14

다른 사람의 답변 에 덧붙여 Tensoflow 웹 사이트 의이 MNIST 자습서 에서 잘 설명합니다 .

기호 변수를 조작하여 이러한 상호 작용 작업을 설명합니다. 하나 만들어 봅시다 :

x = tf.placeholder(tf.float32, [None, 784]),

x특정 값이 아닙니다. TensorFlow에 계산을 실행하도록 요청할 때 입력 할 값인 자리 표시 자입니다. 각각 784 차원 벡터로 병합 된 MNIST 이미지를 얼마든지 입력 할 수 있기를 원합니다. 우리는 이것을 [None, 784] 모양의 부동 소수점 숫자의 2 차원 텐서로 나타냅니다. (여기서 없음은 차원의 길이를 지정할 수 있음을 의미합니다.)

우리는 또한 모델에 대한 가중치와 바이어스가 필요합니다. 추가 입력처럼 처리하는 것을 상상할 수 있지만 TensorFlow는 더 나은 방법으로 처리 할 수 ​​있습니다 Variable. A Variable는 TensorFlow의 상호 작용 작업 그래프에있는 수정 가능한 텐서입니다. 계산으로 사용하거나 수정할 수도 있습니다. 머신 러닝 애플리케이션의 경우 일반적으로 모델 매개 변수는 Variables입니다.

W = tf.Variable(tf.zeros([784, 10]))

b = tf.Variable(tf.zeros([10]))

우리 는 : 의 초기 값을 Variable제공함으로써 이들을 생성 tf.Variable한다 Variable.이 경우에, 우리 는 0으로 가득 찬 텐서 W와 둘 다를 초기화한다 b. 우리가 배울 것 때문에 W그리고 b, 그것은 매우 그들이 처음에 어떤 문제가되지 않습니다.


안녕 답변 감사합니다! 당신이 제공하는 예에서, 우리는 x모양 [batch size, features]을 가지고 있으며, 가중치는 입력에서 첫 번째 레이어 크기 [features, hidden units]및 바이어스로 [hidden units]갑니다. 그래서 제 질문은 : 어떻게 우리가 그것들을 곱하는가? 만약 우리가 그렇게한다면 , 우리 는 모양을 tf.matmul(x, w)[batch size, hidden units]b[hidden units]
가지기

1
M.Gorner는 그의 슬라이드 쇼에서 "Ph.D없이 TensorFlow 배우기와 딥 러닝 배우기"에서이 모든 것을 설명합니다. 이 의견에서 내가 할 수있는 것보다 낫습니다. docs.google.com/presentation/d/…
tagoma

11

Tensorflow는 세 가지 유형의 컨테이너를 사용하여 프로세스를 저장 / 실행합니다.

  1. 상수 : 상수는 일반적인 데이터를 보유합니다.

  2. 변수 : cost_function.과 같은 기능별로 데이터 값이 변경됩니다.

  3. 자리 표시 자 : 교육 / 테스트 데이터가 그래프로 전달됩니다.


10

스 니펫 예제 :

import numpy as np
import tensorflow as tf

### Model parameters ###
W = tf.Variable([.3], tf.float32)
b = tf.Variable([-.3], tf.float32)

### Model input and output ###
x = tf.placeholder(tf.float32)
linear_model = W * x + b
y = tf.placeholder(tf.float32)

### loss ###
loss = tf.reduce_sum(tf.square(linear_model - y)) # sum of the squares

### optimizer ###
optimizer = tf.train.GradientDescentOptimizer(0.01)
train = optimizer.minimize(loss)

### training data ###
x_train = [1,2,3,4]
y_train = [0,-1,-2,-3]

### training loop ###
init = tf.global_variables_initializer()
sess = tf.Session()
sess.run(init) # reset values to wrong
for i in range(1000):
  sess.run(train, {x:x_train, y:y_train})

이름에서 알 수 있듯이 자리 표시자는 나중에 가치를 제공하겠다는 약속입니다.

변수 는 단순히 일상적인 프로그래밍에서 사용하는 일반 변수와 동일한 훈련 매개 변수 ( W(행렬), b(바이어스))이며, 트레이너는 각 실행 / 단계에서 업데이트 / 수정합니다.

하지만 자리가 어떤 초기 값을 필요로하지 않습니다, 당신은 것을 만들 때 xy당신이있는 자리를 공급하는 경우 TF 대신 나중에 메모리를 할당하지 않습니다 sess.run()사용 feed_dictTensorFlow 그들 (의 적절한 크기의 메모리를 할당합니다, x그리고 y) -이 unconstrained-을 ness는 모든 크기와 형태의 데이터를 제공 할 수있게합니다.


간단히 말해서 :

변수 -각 단계 후에 트레이너 (예 : GradientDescentOptimizer)가 업데이트 할 매개 변수입니다.

자리 표시 자 데모-

a = tf.placeholder(tf.float32)
b = tf.placeholder(tf.float32)
adder_node = a + b  # + provides a shortcut for tf.add(a, b)

실행:

print(sess.run(adder_node, {a: 3, b:4.5}))
print(sess.run(adder_node, {a: [1,3], b: [2, 4]}))

출력 결과

7.5
[ 3.  7.]

첫 번째 경우에는도 3 및 4.5로 전달 될 ab피드 목록있어 후자의 경우 7 ouputting adder_node에 다음 각각과, 제 1 단계 및 (2) 다음으로,도 3 및도 4 (추가 될 ab).


관련 읽는다 :


7

변수

TensorFlow 변수는 프로그램이 조작하는 공유 된 영구 상태를 나타내는 가장 좋은 방법입니다. 변수는 tf.Variable 클래스를 통해 조작됩니다. 내부적으로 tf.Variable은 지속적 텐서를 저장합니다. 특정 조작을 통해이 텐서의 값을 읽고 수정할 수 있습니다. 이러한 수정 사항은 여러 tf.Sessions에서 볼 수 있으므로 여러 작업자가 tf.Variable에 대해 동일한 값을 볼 수 있습니다. 사용하기 전에 변수를 초기화해야합니다.

예:

x = tf.Variable(3, name="x")
y = tf.Variable(4, name="y")
f = x*x*y + y + 2

계산 그래프가 생성됩니다. 변수 (x 및 y)를 초기화하고 함수 (f)를 tensorflow 세션에서 다음과 같이 평가할 수 있습니다.

with tf.Session() as sess:
     x.initializer.run()
     y.initializer.run()
     result = f.eval()
print(result)
42

자리 표시 자

자리 표시자는 나중에 값을 초기화 할 수있는 노드 (변수와 동일)입니다. 이 노드는 기본적으로 런타임 중에 할당 된 값을 출력합니다. 변수 유형 및 / 또는 모양과 같은 인수를 제공 할 수있는 tf.placeholder () 클래스를 사용하여 자리 표시 자 노드를 할당 할 수 있습니다. 자리 표시자는 훈련 데이터 세트가 계속 변경됨에 따라 기계 학습 모델에서 훈련 데이터 세트를 나타내는 데 광범위하게 사용됩니다.

예:

A = tf.placeholder(tf.float32, shape=(None, 3))
B = A + 5

참고 : 차원의 '없음'은 '모든 크기'를 의미합니다.

with tf.Session as sess:
    B_val_1 = B.eval(feed_dict={A: [[1, 2, 3]]})
    B_val_2 = B.eval(feed_dict={A: [[4, 5, 6], [7, 8, 9]]})

print(B_val_1)
[[6. 7. 8.]]
print(B_val_2)
[[9. 10. 11.]
 [12. 13. 14.]]

참고 문헌 :

  1. https://www.tensorflow.org/guide/variables
  2. https://www.tensorflow.org/api_docs/python/tf/placeholder
  3. 오라일리 : Scikit-Learn & Tensorflow를 이용한 실습 머신 러닝

6

Variabletensorflow에서 프로그래밍 언어에서 사용하는 일반적인 변수로 생각하십시오 . 변수를 초기화하고 나중에 수정할 수도 있습니다. 반면에 placeholder초기 값을 필요로하지 않습니다. 자리 표시자는 나중에 사용하기 위해 단순히 메모리 블록을 할당합니다. 나중에 feed_dict데이터를에 공급하는 데 사용할 수 있습니다 placeholder. 기본적으로 placeholder구속되지 않은 모양이있어 세션에서 다른 모양의 텐서를 공급할 수 있습니다. 아래에서 한 것처럼 선택적 인수 -shape를 전달하여 제한된 모양을 만들 수 있습니다.

x = tf.placeholder(tf.float32,(3,4))
y =  x + 2

sess = tf.Session()
print(sess.run(y)) # will cause an error

s = np.random.rand(3,4)
print(sess.run(y, feed_dict={x:s}))

기계 학습 작업을 수행하는 동안 대부분의 경우 행 수를 모르지만 기능 또는 열 수를 알고 있습니다. 이 경우 None을 사용할 수 있습니다.

x = tf.placeholder(tf.float32, shape=(None,4))

이제 런타임에 4 개의 열과 원하는 수의 행으로 모든 행렬을 공급할 수 있습니다.

또한 자리 표시자는 입력 데이터 (모델에 피드를 제공하는 데 사용되는 일종의 변수)에 사용되며 변수는 시간이 지남에 따라 학습하는 가중치와 같은 매개 변수입니다.


4

자리 표시 자 :

  1. 자리 표시자는 나중에 데이터를 할당 할 변수입니다. 데이터 없이도 연산을 생성하고 계산 그래프를 작성할 수 있습니다. 그런 다음 TensorFlow 용어에서 이러한 자리 표시자를 통해 데이터를 그래프에 공급합니다.

  2. 초기 값은 필요하지 않지만 다음과 같이 기본값을 가질 수 있습니다. tf.placeholder_with_default)

  3. 런타임시 다음과 같은 가치를 제공해야합니다.

    a = tf.placeholder(tf.int16) // initialize placeholder value
    b = tf.placeholder(tf.int16) // initialize placeholder value
    
    use it using session like :
    
    sess.run(add, feed_dict={a: 2, b: 3}) // this value we have to assign at runtime

변수 :

  1. TensorFlow 변수는 프로그램이 조작하는 공유 된 영구 상태를 나타내는 가장 좋은 방법입니다.
  2. 변수는 tf.Variable 클래스를 통해 조작됩니다. tf.Variable은 ops를 실행하여 값을 변경할 수있는 텐서를 나타냅니다.

예 : tf.Variable("Welcome to tensorflow!!!")


3

Tensorflow 2.0 호환 답변 : 기본 실행 모드는 Eager Execution 이므로 플레이스 홀더 개념은 기본적 tf.placeholder으로 사용할 수 없습니다 Tensorflow 2.x (>= 2.0).

그러나 Graph Mode( Disable Eager Execution) 에서 사용하는 경우 사용할 수 있습니다 .

버전 2.x의 TF 자리 표시 자에 해당하는 명령은 tf.compat.v1.placeholder입니다.

버전 2.x에서 TF 변수에 tf.Variable해당하는 명령은 코드이며 1.x에서 2.x로 코드를 마이그레이션하려는 경우 해당 명령은 다음과 같습니다.

tf.compat.v2.Variable.

Tensorflow 버전 2.0에 대한 자세한 정보는 이 Tensorflow 페이지 를 참조하십시오 .

버전 1.x에서 2.x 로의 마이그레이션에 대한 자세한 내용은 마이그레이션 안내서 를 참조하십시오 .


2

계산 그래프를 생각하십시오 . 이러한 그래프에서 데이터를 그래프로 전달하려면 입력 노드가 필요합니다.이 노드는 tensorflow 에서 자리 표시 자로 정의해야합니다 .

파이썬에서 일반적인 프로그램으로 생각하지 마십시오. 파이썬 프로그램을 작성하고 변수로 다른 답변에서 설명 한 모든 것들을 수행 할 수 있지만 tensorflow의 계산 그래프의 경우 데이터를 그래프에 공급하려면 해당 노드를 자리 표시 자로 정의해야합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.