programing

TensorFlow에서 변수와 get_variable의 차이

newstyles 2023. 7. 23. 14:08

TensorFlow에서 변수와 get_variable의 차이

제가 아는 한,Variable변수를 만들기 위한 기본 작업입니다.get_variable체중 공유에 주로 사용됩니다.

한편으로, 어떤 사람들은 다음과 같은 방법을 사용할 것을 제안합니다.get_variable원시적인 것 대신에Variable변수가 필요할 때마다 작동합니다.반면에, 저는 단지 어떤 용도로도 볼 뿐입니다.get_variableTensorFlow의 공식 문서 및 데모에서.

따라서 저는 이 두 메커니즘을 올바르게 사용하는 방법에 대한 몇 가지 경험칙을 알고 싶습니다."표준" 원칙이 있습니까?

항상 사용하는 것이 좋습니다.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())

자세한 내용은 여기를 참조하십시오.

하나와 다른 하나 사이의 두 가지 주요 차이점을 찾을 수 있습니다.

  1. 첫번째는tf.Variable항상 새로운 변수를 생성하는 반면,tf.get_variable그래프에서 지정된 매개 변수를 가진 기존 변수를 가져오며 변수가 없으면 새 변수를 만듭니다.

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