저는 TensorFlow의 초보자입니다. 나는 사이의 차이에 대해 혼란스러워하고있어 tf.placeholder
및 tf.Variable
. 내 견해로 tf.placeholder
는 입력 데이터에 tf.Variable
사용되며 데이터 상태를 저장하는 데 사용됩니다. 이것이 내가 아는 전부입니다.
누군가 차이점에 대해 더 자세히 설명해 주시겠습니까? 특히 사용 tf.Variable
시기와 사용시기는 tf.placeholder
?
저는 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 에서 자세한 내용을 참조하십시오 . (예는 웹 페이지에서 가져옵니다.)
tensorflow
하고 deep learning
하고 AI
있습니다.
차이점은 tf.Variable
선언 할 때 초기 값을 제공해야한다는 것입니다. 으로 tf.placeholder
당신은 초기 값을 제공 할 필요가 없습니다 당신은과 런타임시를 지정할 수 있습니다 feed_dict
인수 내부Session.run
텐서 계산은 그래프 로 구성되므로 그래프 로 두 가지를 해석하는 것이 좋습니다.
간단한 선형 회귀를 예로 들어 보겠습니다.
WX+B=Y
여기서, W
및 B
가중치와 바이어스 및 서 X
관찰을 위해 '입력 및 Y
관찰에 대한 출력이다.
분명히 X
과 Y
의 차이가 동일한 특성 (매니페스트 변수)의 아르 W
및 B
(잠재 변수). X
그리고 Y
시료 (관측)하고 그에 따라 필요한 값이다 장소 채워질 때, W
그리고 B
가중치 및 바이어스이다 변수 상이한 사용 훈련되어야 그래프 (이전 값은 후자의 영향) X
및 Y
쌍. 변수 를 훈련 시키기 위해 플레이스 홀더 에 다른 샘플을 배치 합니다 .
우리는 할 필요가 저장하거나 복원 변수 (검문소) 저장하거나 코드를 사용하여 그래프를 다시.
자리 표시 자는 주로 다른 데이터 집합 (예 : 교육 데이터 또는 테스트 데이터)의 소유자입니다. 그러나 변수 는 특정 작업, 즉 입력 결과를 예측하거나 입력을 원하는 레이블에 매핑하기 위해 교육 프로세스에서 학습됩니다. 다른 샘플이나 동일한 샘플을 사용하여 모델을 재교육하거나 미세 조정하여 종종 dict을 통해 플레이스 홀더 에 채울 때까지 동일하게 유지 됩니다. 예를 들어 :
session.run(a_graph, dict = {a_placeholder_name : sample_values})
자리 표시 자는 모델을 설정하기위한 매개 변수로 전달됩니다.
교육 도중 모델의 자리 표시 자 (추가, 삭제, 모양 변경 등)를 변경해도 다른 수정없이 체크 포인트를 다시로드 할 수 있습니다. 그러나 저장된 모델의 변수가 변경되면 검사 점을 다시로드하고 훈련을 계속하도록 검사 점을 조정해야합니다 (그래프에 정의 된 모든 변수는 검사 점에서 사용 가능해야 함).
안전하게 당신이 하네스를 훈련하는 매개 변수를 필요로하는 경우 동안 자리, 그들을 막을 수 있도록 값이 샘플에서 경우 (관찰 당신이 이미 가지고), 요약하는 변수 (간단히 말하면, 설정된 변수 원하는 값에 대한 TF를 자동으로 사용하기 위해).
스타일 전송 모델 과 같은 일부 흥미로운 모델에서는 입력 픽스가 최적화되고 일반적으로 불리는 모델 변수가 고정 된 다음 해당 링크에 구현 된대로 입력 (일반적으로 무작위로 초기화)을 변수로 만들어야합니다.
자세한 내용은이 간단하고 예시적인 doc을 참조하십시오 .
사이의 가장 큰 차이점 tf.Variable 과 tf.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
. AVariable
는 TensorFlow의 상호 작용 작업 그래프에있는 수정 가능한 텐서입니다. 계산으로 사용하거나 수정할 수도 있습니다. 머신 러닝 애플리케이션의 경우 일반적으로 모델 매개 변수는Variable
s입니다.
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]
Tensorflow는 세 가지 유형의 컨테이너를 사용하여 프로세스를 저장 / 실행합니다.
상수 : 상수는 일반적인 데이터를 보유합니다.
변수 : cost_function.과 같은 기능별로 데이터 값이 변경됩니다.
자리 표시 자 : 교육 / 테스트 데이터가 그래프로 전달됩니다.
스 니펫 예제 :
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
).
관련 읽는다 :
변수
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.]]
참고 문헌 :
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
변수 :
예 : tf.Variable("Welcome to tensorflow!!!")
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 로의 마이그레이션에 대한 자세한 내용은 마이그레이션 안내서 를 참조하십시오 .
Variable
s에 대한 그라디언트를 원 하지만 s에 대한 그라디언트를 원할 것입니다placeholder
(이 값은 항상 제공되어야 함).