tf.placeholder와 tf.Variable의 차이점은 무엇입니까?
저는 TensorFlow의 초보자입니다. 나는 사이의 차이에 대해 혼란스러워하고있어 tf.placeholder
및 tf.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.Variable 과 tf.placeholder는 점이다
변수를 사용하여 매개 변수를 보유하고 업데이트합니다. 변수는 텐서를 포함하는 인 메모리 버퍼입니다. 그것들은 명시 적으로 초기화되어야하며 훈련 중 및 훈련 후에 디스크에 저장 될 수 있습니다. 나중에 저장된 값을 복원하여 모델을 연습하거나 분석 할 수 있습니다.
변수의 초기화는로 수행됩니다 sess.run(tf.global_variables_initializer())
. 또한 변수를 만드는 동안 초기 값으로 Tensor를 Variable()
생성자 에 전달해야 하며 변수를 만들 때 항상 모양을 알고 있어야합니다.
반면 자리 표시자는 업데이트 할 수 없습니다. 또한 초기화해서는 안되지만 텐서가 있다고 약속하기 때문에 값을 공급해야합니다 sess.run(<op>, {a: <some_val>})
. 그리고 마지막으로 변수와 비교할 때 자리 표시자가 모양을 알지 못할 수 있습니다. 차원의 일부를 제공하거나 전혀 제공하지 않을 수 있습니다.
다른 차이점이 있습니다.
- 변수 내부의 값은 최적화 중에 업데이트 될 수 있습니다
- 변수는 공유 가능 하고 훈련 할 수 없습니다
- 훈련 후 변수 내부의 값을 저장할 수 있습니다
- 변수가 생성되면 그래프에 3 개의 op가 추가됩니다 (변수 op, 이니셜 라이저 op, 초기 값에 대한 ops)
- 자리 표시자는 함수이고 변수는 클래스입니다 (따라서 대문자).
- 분산 환경에서 TF를 사용하는 경우 변수는 특정 위치 ( 매개 변수 서버 )에 저장되고 작업자간에 공유됩니다.
흥미로운 부분은 자리 표시 자만 피드 할 수 있다는 것입니다. 변수 및 상수에 값을 공급할 수 있습니다.
다른 사람의 답변 에 덧붙여 Tensoflow 웹 사이트 의이 MNIST 자습서 에서 잘 설명합니다 .
기호 변수를 조작하여 이러한 상호 작용 작업을 설명합니다. 하나 만들어 봅시다 :
x = tf.placeholder(tf.float32, [None, 784])
,
x
특정 값이 아닙니다. TensorFlow에 계산을 실행하도록 요청할 때 입력 할 값인 자리 표시 자입니다. 각각 784 차원 벡터로 병합 된 MNIST 이미지를 얼마든지 입력 할 수 있기를 원합니다. 우리는 이것을 [None, 784] 모양의 부동 소수점 숫자의 2 차원 텐서로 나타냅니다. (여기서 없음은 차원의 길이를 지정할 수 있음을 의미합니다.)또한 모델에 대한 가중치와 치우침이 필요합니다. 추가 입력처럼 처리하는 것을 상상할 수 있지만 TensorFlow는 더 나은 방법으로 처리 할 수 있습니다
Variable
. AVariable
는 TensorFlow의 상호 작용 작업 그래프에있는 수정 가능한 텐서입니다. 계산에 의해 사용되거나 수정 될 수도 있습니다. 머신 러닝 애플리케이션의 경우 일반적으로 모델 매개 변수는Variable
s입니다.
W = tf.Variable(tf.zeros([784, 10]))
b = tf.Variable(tf.zeros([10]))
우리는이 생성
Variable
함으로써들tf.Variable
의 초기 값을Variable
:이 경우, 우리는 모두 초기화W
및b
제로의 전체 텐서한다. 우리가 배울 것 때문에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
(바이어스))로, 트레이너는 각 실행 / 단계에서 업데이트 / 수정합니다.
하지만 자리가 어떤 초기 값을 필요로하지 않습니다, 당신은 것을 만들 때 x
와 y
당신이있는 자리를 공급하는 경우 TF 대신 나중에 메모리를 할당하지 않습니다 sess.run()
사용 feed_dict
TensorFlow 그들 (의 적절한 크기의 메모리를 할당합니다, 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로 전달 될 a
및 b
피드 목록있어 후자의 경우 7 ouputting adder_node에 다음 각각과, 제 1 단계 및 (2) 다음으로,도 3 및도 4 (추가 될 a
와 b
).
관련 읽는다 :
- tf.placeholder 문서
- tf . 가변 문서
- 변수 대 자리 표시 자 .
변수
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.]]
참고 문헌 :
- https://www.tensorflow.org/guide/variables
- https://www.tensorflow.org/api_docs/python/tf/placeholder
- 오라일리 : Scikit-Learn & Tensorflow를 이용한 실습 머신 러닝
Tensorflow는 세 가지 유형의 컨테이너를 사용하여 프로세스를 저장 / 실행합니다.
상수 : 상수는 일반적인 데이터를 보유합니다.
변수 : cost_function.과 같은 각각의 기능으로 데이터 값이 변경됩니다.
자리 표시 자 : 교육 / 테스트 데이터가 그래프로 전달됩니다.
Variable
tensorflow에서 프로그래밍 언어에서 사용하는 일반적인 변수로 생각하십시오 . 변수를 초기화하고 나중에 수정할 수도 있습니다. 반면에 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 개의 열과 원하는 수의 행으로 모든 행렬을 공급할 수 있습니다.
또한 자리 표시자는 입력 데이터 (모델에 피드를 제공하는 데 사용되는 일종의 변수)에 사용되며 변수는 시간이 지남에 따라 학습하는 가중치와 같은 매개 변수입니다.
자리 표시 자 :
자리 표시자는 나중에 데이터를 할당 할 변수입니다. 데이터 없이도 연산을 생성하고 계산 그래프를 작성할 수 있습니다. 그런 다음 TensorFlow 용어에서 이러한 자리 표시자를 통해 데이터를 그래프에 공급합니다.
초기 값은 필요하지 않지만 다음과 같이 기본값을 가질 수 있습니다.
tf.placeholder_with_default)
런타임시 다음과 같은 가치를 제공해야합니다.
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
변수 :
- TensorFlow 변수는 프로그램이 조작하는 공유 된 영구 상태를 나타내는 가장 좋은 방법입니다.
- 변수는 tf.Variable 클래스를 통해 조작됩니다. tf.Variable은 ops를 실행하여 값을 변경할 수있는 텐서를 나타냅니다.
예 : tf.Variable("Welcome to tensorflow!!!")
계산 그래프를 생각해보십시오 . 이러한 그래프에서 데이터를 그래프로 전달하려면 입력 노드가 필요합니다. 이러한 노드는 tensorflow 에서 자리 표시 자로 정의해야합니다 .
파이썬에서 일반적인 프로그램으로 생각하지 마십시오. 파이썬 프로그램을 작성하고 변수로 다른 답변에서 설명한 모든 것들을 수행 할 수 있지만 tensorflow의 계산 그래프의 경우 데이터를 그래프에 공급하려면 해당 노드를 자리 표시 자로 정의해야합니다.
'Programing' 카테고리의 다른 글
NumPy 배열을 Python List 구조로 변환 하시겠습니까? (0) | 2020.04.02 |
---|---|
window.location =과 window.location.replace ()의 차이점은 무엇입니까? (0) | 2020.04.02 |
XSD 파일에 대해 XML 파일의 유효성을 검사하는 가장 좋은 방법은 무엇입니까? (0) | 2020.04.02 |
루비-배열 테스트 (0) | 2020.04.01 |
Html.fromHtml은 Android N에서 더 이상 사용되지 않습니다. (0) | 2020.04.01 |