Programing

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

lottogame 2020. 4. 2. 08:09
반응형

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


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

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


즉, 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 에서 자세한 내용을 참조하십시오 . (예는 웹 페이지에서 가져옵니다.)


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


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

간단한 선형 회귀 WX + B = Y를 예로들 수 있습니다 (여기서 W와 B는 가중치와 바이어스를 나타내며 X는 관측치 입력을 나타내고 X는 관측치 출력을 나타냅니다). 분명히 X와 Y는 W와 B (잠재 변수)와 다른 성질 (매니페스트 변수)과 같습니다. X와 Y는 표본 (관측치)의 값이므로 채울 곳이 필요 하지만 W와 B는 가중치와 바이어스 입니다. 그래프의 변수 (이전의 값은 나중에 영향을 미침)는 다른 X를 사용하여 학습해야합니다. Y 쌍. 변수 를 훈련 시키기 위해 플레이스 홀더다른 샘플을 배치 합니다 .

코드를 사용하여 그래프를 저장하거나 재 구축하기 위해 변수를 (체크 포인트로) 저장 또는 복원 할 수 있으며 복원 하면 됩니다. 자리 표시 자는 주로 다른 데이터 집합 (예 : 교육 데이터 또는 테스트 데이터)에 대한 보유자이지만 변수 는 교육 과정에서 학습되며 동일하게 유지됩니다 (입력 결과 예측 또는 샘플의 입력 및 출력 [라벨] 매핑). 나중에 재교육 또는 미세 조정 모델합니다 (로 채우기 위해 다른 또는 동일한 샘플을 사용 할 때까지 자리 표시 자 예를 들어, DICT를 통해 자주 , 자리 표시는 또한 세트 모델에 매개 변수로 전달됩니다).session.run(a_graph, dict={a_placeholder_name: sample_values})

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

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

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

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


TL; DR

변수

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

자리 표시 자

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

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


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

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


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


다른 차이점이 있습니다.

흥미로운 부분은 자리 표시 자만 피드 할 수 있다는 것입니다. 변수 및 상수에 값을 공급할 수 있습니다.


다른 사람의 답변 에 덧붙여 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:이 경우, 우리는 모두 초기화 Wb제로의 전체 텐서한다. 우리가 배울 것 때문에 W그리고 b, 그것은 매우 그들이 처음에 어떤 문제가되지 않습니다.


스 니펫 예제 :

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).


관련 읽는다 :


변수

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를 이용한 실습 머신 러닝

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

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

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

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


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 개의 열과 원하는 수의 행으로 모든 행렬을 공급할 수 있습니다.

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


자리 표시 자 :

  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!!!")


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

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

참고 URL : https://stackoverflow.com/questions/36693740/whats-the-difference-between-tf-placeholder-and-tf-variable

반응형