TensorFlow에서 변수와 get_variable의 차이
제가 아는 한,Variable
변수를 만들기 위한 기본 작업입니다.get_variable
체중 공유에 주로 사용됩니다.
한편으로, 어떤 사람들은 다음과 같은 방법을 사용할 것을 제안합니다.get_variable
원시적인 것 대신에Variable
변수가 필요할 때마다 작동합니다.반면에, 저는 단지 어떤 용도로도 볼 뿐입니다.get_variable
TensorFlow의 공식 문서 및 데모에서.
따라서 저는 이 두 메커니즘을 올바르게 사용하는 방법에 대한 몇 가지 경험칙을 알고 싶습니다."표준" 원칙이 있습니까?
항상 사용하는 것이 좋습니다.tf.get_variable(...)
만약 당신이 언제든지 변수를 공유할 필요가 있다면, 이것은 코드를 리팩터링하는 것을 훨씬 더 쉽게 할 것입니다. 예를 들어, 다중 gpu CIFAR의 예를 참조하십시오.그것에는 단점이 없습니다.
순수하다tf.Variable
하위 수준임, 어느 시점에tf.get_variable()
존재하지 않으므로 일부 코드는 여전히 낮은 수준의 방법을 사용합니다.
tf.변수는 클래스이며, tf를 만드는 몇 가지 방법이 있습니다.다음을 포함한 변수tf.Variable.__init__
그리고.tf.get_variable
.
initial_value로 새 tf.Variable.__init__
변수를 만듭니다.
W = tf.Variable(<initial-value>, name=<optional-name>)
tf.get_variable
이 매개 변수를 사용하여 기존 변수를 가져오거나 새 변수를 만듭니다.이니셜라이저를 사용할 수도 있습니다.
W = tf.get_variable(name, shape=None, dtype=tf.float32, initializer=None,
regularizer=None, trainable=True, collections=None)
다음과 같은 이니셜라이저를 사용하면 매우 유용합니다.xavier_initializer
:
W = tf.get_variable("W", shape=[784, 256],
initializer=tf.contrib.layers.xavier_initializer())
자세한 내용은 여기를 참조하십시오.
하나와 다른 하나 사이의 두 가지 주요 차이점을 찾을 수 있습니다.
첫번째는
tf.Variable
항상 새로운 변수를 생성하는 반면,tf.get_variable
그래프에서 지정된 매개 변수를 가진 기존 변수를 가져오며 변수가 없으면 새 변수를 만듭니다.tf.Variable
초기 값을 지정해야 합니다.
기능을 명확히 하는 것이 중요합니다.tf.get_variable
이름 앞에 현재 변수 범위를 붙여 재사용 검사를 수행합니다.예:
with tf.variable_scope("one"):
a = tf.get_variable("v", [1]) #a.name == "one/v:0"
with tf.variable_scope("one"):
b = tf.get_variable("v", [1]) #ValueError: Variable one/v already exists
with tf.variable_scope("one", reuse = True):
c = tf.get_variable("v", [1]) #c.name == "one/v:0"
with tf.variable_scope("two"):
d = tf.get_variable("v", [1]) #d.name == "two/v:0"
e = tf.Variable(1, name = "v", expected_shape = [1]) #e.name == "two/v_1:0"
assert(a is c) #Assertion is true, they refer to the same object.
assert(a is d) #AssertionError: they are different objects
assert(d is e) #AssertionError: they are different objects
마지막 어설션 오류는 다음과 같습니다.같은 범위에서 이름이 같은 두 변수는 동일한 변수여야 합니다.하지만 만약 당신이 변수들의 이름을 테스트한다면.d
그리고.e
텐서플로가 변수의 이름을 변경했다는 것을 알게 될 것입니다.e
:
d.name #d.name == "two/v:0"
e.name #e.name == "two/v_1:0"
또 다른 차이점은 한 사람이 있다는 것입니다.('variable_store',)
수집하지만 다른 하나는 그렇지 않습니다.
소스 코드를 참조하십시오.
def _get_default_variable_store():
store = ops.get_collection(_VARSTORE_KEY)
if store:
return store[0]
store = _VariableStore()
ops.add_to_collection(_VARSTORE_KEY, store)
return store
다음을 예로 들어 보겠습니다.
import tensorflow as tf
from tensorflow.python.framework import ops
embedding_1 = tf.Variable(tf.constant(1.0, shape=[30522, 1024]), name="word_embeddings_1", dtype=tf.float32)
embedding_2 = tf.get_variable("word_embeddings_2", shape=[30522, 1024])
graph = tf.get_default_graph()
collections = graph.collections
for c in collections:
stores = ops.get_collection(c)
print('collection %s: ' % str(c))
for k, store in enumerate(stores):
try:
print('\t%d: %s' % (k, str(store._vars)))
except:
print('\t%d: %s' % (k, str(store)))
print('')
출력:
collection ('__variable_store',): 0: {'word_embeddings_2': <tf.Variable 'word_embeddings_2:0' shape=(30522, 1024) dtype=float32_ref>}
언급URL : https://stackoverflow.com/questions/37098546/difference-between-variable-and-get-variable-in-tensorflow
'programing' 카테고리의 다른 글
테이블에 문 수준 트리거를 구현할 때 영향을 받는 모든 행에 대해 OLD 및 NEW 레코드를 가져올 수 있습니까? (0) | 2023.07.28 |
---|---|
미국 달러 금액을 나타내기 위해 사용할 수 있는 가장 좋은 장고 모델 필드는 무엇입니까? (0) | 2023.07.28 |
PHP 헤더 리디렉션 301 - 의미는 무엇입니까? (0) | 2023.07.23 |
틴터 창을 닫으려면 어떻게 해야 합니까? (0) | 2023.07.23 |
Python, Pandas : DataFrame의 내용을 텍스트 파일로 씁니다. (0) | 2023.07.23 |