variable_scope와 name_scope의 차이점은 무엇입니까?
이 질문에 이미 답변이 있습니다.
variable_scope
과 의 차이점은 무엇입니까 name_scope
? 변수 범위 튜토리얼 에 대해 이야기 variable_scope
암시 적으로 개방 name_scope
. 또한에서 변수를 만들면 name_scope
범위 이름으로 이름이 자동으로 확장 된다는 것을 알았 습니다. 그렇다면 차이점은 무엇입니까?
간단한 예제를 작성하여 모든 것을 시각화하기 전에 variable_scope 와 name_scope (거의 동일하게 보임) 의 차이점을 이해하는 데 문제가있었습니다 .
import tensorflow as tf
def scoping(fn, scope1, scope2, vals):
with fn(scope1):
a = tf.Variable(vals[0], name='a')
b = tf.get_variable('b', initializer=vals[1])
c = tf.constant(vals[2], name='c')
with fn(scope2):
d = tf.add(a * b, c, name='res')
print '\n '.join([scope1, a.name, b.name, c.name, d.name]), '\n'
return d
d1 = scoping(tf.variable_scope, 'scope_vars', 'res', [1, 2, 3])
d2 = scoping(tf.name_scope, 'scope_name', 'res', [1, 2, 3])
with tf.Session() as sess:
writer = tf.summary.FileWriter('logs', sess.graph)
sess.run(tf.global_variables_initializer())
print sess.run([d1, d2])
writer.close()
여기에서 몇 가지 변수와 상수를 만들고 범위로 그룹화하는 함수를 만듭니다 (제공 한 유형에 따라 다름). 이 함수에서는 모든 변수의 이름도 인쇄합니다. 그 후 그래프를 실행하여 결과 값의 값을 얻고 이벤트 파일을 저장하여 텐서 보드에서 조사합니다. 이것을 실행하면 다음을 얻을 수 있습니다.
scope_vars
scope_vars/a:0
scope_vars/b:0
scope_vars/c:0
scope_vars/res/res:0
scope_name
scope_name/a:0
b:0
scope_name/c:0
scope_name/res/res:0
TB를 열면 유사한 패턴이 표시됩니다 (보시다시피 직사각형 b
외부에 있음 scope_name
).
이것은 당신에게 답을줍니다 :
이제 tf.variable_scope()
모든 변수 (생성 방법에 관계없이), ops, 상수의 이름에 접두사를 추가하는 것을 볼 수 있습니다. 반면에 사용하려는 변수와 범위를 알고 있다고 가정하므로로 tf.name_scope()
생성 된 변수는 무시 tf.get_variable()
됩니다.
공유 변수 에 대한 좋은 문서 는
tf.variable_scope()
:에 전달 된 이름의 네임 스페이스를 관리합니다tf.get_variable()
.
동일한 문서에서 변수 범위의 작동 방식과 유용성에 대해 자세히 설명합니다.
당신이 변수를 만들 때 tf.get_variable
대신 tf.Variable
, Tensorflow은 충돌 있는지 확인하기 위해 같은 방법으로 생성 바르의 이름을 확인하기 시작합니다. 그럴 경우 예외가 발생합니다. 를 사용하여 var를 만들고 컨텍스트 관리자 tf.get_variable
를 사용하여 변수 이름의 접두사를 변경하려고 tf.name_scope
하면 Tensorflow에서 예외가 발생하는 것을 막을 수 없습니다. tf.variable_scope
이 경우 컨텍스트 관리자 만이 변수의 이름을 효과적으로 변경합니다. 또는 변수를 재사용하려면 두 번째로 var를 만들기 전에 scope.reuse_variables ()를 호출해야합니다.
요약하면, tf.name_scope
해당 범위에서 생성 된 모든 텐서에 접두사를 추가하고 (으로 생성 된 변수 제외 tf.get_variable
)으로 tf.variable_scope
생성 된 변수에 접두사를 추가합니다 tf.get_variable
.
tf.variable_scope
재사용 tf.name_scope
을 처리하기 위한 진화입니다 Variable
. 아시다시피, 그것은 이상 tf.name_scope
을 수행하므로 사용할 실제 이유가 tf.name_scope
없습니다. 당연히 TF 개발자는tf.variable_scope
.
tf.name_scope
여전히 주변에 누워있는 것에 대한 나의 이해 는 그 둘의 동작에 미묘한 비 호환성이 있다는 것 tf.variable_scope
입니다 tf.name_scope
. 이는 .
'developer tip' 카테고리의 다른 글
HTML 파일에서 "data-require" "data-semver"는 무엇입니까? (0) | 2020.10.30 |
---|---|
커밋 메시지 유형으로 "chore"를 언제 사용합니까? (0) | 2020.10.30 |
ConcurrentSkipListMap은 언제 사용해야합니까? (0) | 2020.10.30 |
size_t의 최대 값을 찾는 이식 가능한 방법은 무엇입니까? (0) | 2020.10.30 |
사용자가 스크롤하고 있는지 감지 (0) | 2020.10.30 |