나는 Tensorflow가 그래프를 관리하는 것처럼 보이는 펑키 한 일이 있음을 깨달았습니다.Tensorflow는 어떻게 그래프를 관리합니까?
모델을 빌드 (및 다시 빌드)하기가 번거롭기 때문에 클래스에 내 사용자 정의 모델을 랩핑하기로 결정하여 다른 곳에서 쉽게 다시 인스턴스화 할 수있었습니다.
(원래 장소에서) 코드를 연습하고 테스트했을 때 그래프의 변수를로드 한 코드에서 변수 재 정의와 기타 모든 종류의 이상한 오류가 발생했습니다. 이것은 (비슷한 질문에 대한 마지막 질문에서) 모든 것이 두 번 호출된다는 암시였습니다.
추적 기능을 수행 한 후로드 된 코드를 사용하는 방식으로 변경되었습니다. 그것은 너무
class MyModelUser(object):
def forecast(self):
# .. build the model in the same way as in the training code
# load the model checkpoint
# call the "predict" function on the model
# manipulate the prediction and return it
같은 구조를 가지고 그리고 몇 가지 코드에 내가
def test_the_model(self):
model_user = MyModelUser()
print(model_user.forecast()) # 1
print(model_user.forecast()) # 2
을했고 (분명히) 나는이 개 예측이를 볼 것으로 예상 MyModelUser
사용하는 클래스 내에서 사용 된 라고 불렀다. 대신, 최초의 예측이라고 예상대로 작동했지만 두 번째 호출이 변수 재사용의 TON에 ValueError 이들 중 하나의 예를 던졌다되었다이었다
ValueError: Variable weight_def/weights already exists, disallowed. Did you mean to set reuse=True in VarScope?
나는이 시리즈를 추가하여 오류를 진압하기 위해 관리 변수를 만들기 위해 get_variable
을 사용한 try/except 블록 중 하나를 선택하고 범위에서 reuse_variables
을 호출 한 다음 예외를 제외하고는 get_variable
을 호출합니다. 내가 말한 변덕에
tensorflow.python.framework.errors.NotFoundError: Tensor name "weight_def/weights/Adam_1" not found in checkpoint files
이 있었다 중 하나가 불쾌한 오류의 새로운 세트에 가져 "나는 __init__
로 모델링 건물 코드를 이동하는 경우 그래서 그 한 번만 내장 무엇?"
내 새로운 모델 사용자 : 지금
class MyModelUser(object):
def __init__(self):
# ... build the model in the same way as in the training code
# load the model checkpoint
def forecast(self):
# call the "predict" function on the model
# manipulate the prediction and return it
및 예상대로
def test_the_model(self):
model_user = MyModelUser()
print(model_user.forecast()) # 1
print(model_user.forecast()) # 2
작품, 오류없이 두 개의 예측을 인쇄. 이것은 내가 변수 재사용을 제거 할 수 있다고 믿게한다.
내 질문은 :
왜 수정 했습니까? 이론적으로 그래프는 원래의 예측 방법에서 매번 재구성되어야하므로 하나 이상의 그래프를 생성해서는 안됩니다. 함수가 완료된 후에도 Tensorflow가 그래프를 유지합니까? 왜 창조 코드를 __init__
으로 옮기는 것이 효과가 있었습니까? 이로 인해 절망적으로 혼란스러워졌습니다.