2017-01-12 4 views
1

그래프 및 변수 값을 포함하여 Tensorflow (0.12.0) 모델을 저장 한 다음 나중에로드하고 실행하려고합니다. 나는 이것에 대한 문서 및 기타 게시물을 읽었지만 작동하도록 기본을 얻을 수 없습니다. 나는 this page in the Tensorflow docs에서 기술을 사용하고있다. 코드 :Tensorflow 모델 저장 및로드

저장 간단한 모델 :

myVar = tf.Variable(7.1) 
tf.add_to_collection('modelVariables', myVar) # why? 
init_op = tf.global_variables_initializer() 
with tf.Session() as sess: 
    sess.run(init_op) 
    print sess.run(myVar) 
    saver0 = tf.train.Saver() 
    saver0.save(sess, './myModel.ckpt') 
    saver0.export_meta_graph('./myModel.meta') 

나중에 부하 모델을 실행합니다

with tf.Session() as sess: 
    saver1 = tf.train.import_meta_graph('./myModel.meta') 
    saver1.restore(sess, './myModel.meta') 
    print sess.run(myVar) 

질문 1 : 구원의 코드가 보인다 작동 할 수 있지만, 로딩 코드는이를 생산 오류 :

W tensorflow/core/util/tensor_slice_reader.cc:95] Could not open ./myModel.meta: Data loss: not an sstable (bad magic number): perhaps your file is in a different file format and you need to use a different restore operator? 

해결 방법.

질문 2 : 나는 TF의 문서에서 패턴을 따르지이 줄을 포함 ...

tf.add_to_collection('modelVariables', myVar) 

...하지만 왜 그 라인이 필요하다? expert_meta_graph 전체 그래프를 기본적으로 내보내지 않습니까? 그렇지 않다면 저장하기 전에 그래프의 모든 변수를 콜렉션에 추가해야합니까? 또는 복원 후에 액세스 할 변수를 콜렉션에 추가하기 만합니까?

---------------------- 업데이트 1 월 12 일 2017 ------------------ -----------

아래의 Kashyap의 제안을 바탕으로 부분 성공했지만 여전히 신비가 존재합니다. 아래 코드는 tf.add_to_collectiontf.get_collection이 포함 된 행을 포함하는 경우에만 이지만을 처리합니다. 이 줄이 없으면 '로드'모드에서 마지막 줄에 오류가 발생합니다. NameError: name 'myVar' is not defined. 기본적으로 Saver.save은 그래프의 모든 변수를 저장하고 복원하므로 컬렉션에 사용될 변수의 이름을 지정해야하는 이유는 무엇입니까? 이것은 Tensorflow의 변수 이름을 파이썬 이름으로 매핑하는 것과 관련이 있다고 가정합니다. 그러나 여기 게임의 규칙은 무엇입니까? 이것이 필요한 변수는 무엇입니까?

mode = 'load' # or 'save' 
if mode == 'save': 
    myVar = tf.Variable(7.1) 
    init_op = tf.global_variables_initializer() 
    saver0 = tf.train.Saver() 
    tf.add_to_collection('myVar', myVar) ### WHY NECESSARY? 
    with tf.Session() as sess: 
     sess.run(init_op) 
     print sess.run(myVar) 
     saver0.save(sess, './myModel') 
if mode == 'load': 
    with tf.Session() as sess: 
     saver1 = tf.train.import_meta_graph('./myModel.meta') 
     saver1.restore(sess, tf.train.latest_checkpoint('./')) 
     myVar = tf.get_collection('myVar')[0] ### WHY NECESSARY? 
     print sess.run(myVar) 
+0

[Tensorflow : 이전에 저장된 모델 (Python)을 복원하는 방법] (http://stackoverflow.com/questions/33759623/tensorflow-how-to-restore-a-previously-save-model-python) – Kashyap

답변

1

나는 똑같은 것을 알아 내려고 노력했으며 성공적으로 Supervisor을 사용하여이를 수행 할 수있었습니다. 자동으로 모든 변수와 그래프 등을로드합니다. 여기에 문서 - https://www.tensorflow.org/programmers_guide/supervisor이 있습니다. 다음은 내 코드입니다 -

보시다시피
sv = tf.train.Supervisor(logdir="/checkpoint', save_model_secs=60) 
    with sv.managed_session() as sess: 
     if not sv.should_stop(): 
      #Do run/eval/train ops on sess as needed. Above works for both saving and loading 

, 이것은 Saver 객체를 사용하여 개별 변수를 다루는 것보다 훨씬 간단 등 한 그래프가 동일하게 유지로 (나의 이해는 우리가 원하는 때 Saver 편리 오는 것입니다 사전에 훈련 된 모델을 다른 그래프에 재사용).

1

Question1

이 질문은 이미하고 철저하게 here 대답했다. export_meta_graph을 명시 적으로 호출 할 필요는 없습니다. save method으로 전화하십시오. (저장 방법은 내부적으로 export_meta_graph 메소드를 호출하기 때문이다.) 이것은 또한 .meta 파일을 생성합니다

saver0.save(sess, './myModel.ckpt')

예를

를 들어 myModel.ckpt 파일 또한 myModel.ckpt.meta 파일을 생성합니다.

은 그럼 당신은

with tf.Session() as sess: 
    saver1 = tf.train.import_meta_graph('./myModel.ckpt.meta') 
    saver1.restore(sess, './myModel') 
    print sess.run(myVar) 

Question2를 사용하여 모델을 복원 할 수 있습니다

컬렉션은 학습 속도, 정규화 당신이 사용한 요소 및 기타 정보 및 이와 같은 사용자 정보를 저장하는 데 사용됩니다

그래프를 내보낼 때 저장됩니다. Tensorflow 자체는 "TRAINABLE_VARIABLES"와 같은 일부 컬렉션을 정의합니다.이 컬렉션은 사용자가 작성한 모델의 모든 학습 가능한 변수를 가져 오는 데 사용됩니다. 그래프의 모든 콜렉션을 내보내거나, 익스포트 할 콜렉션을 export_meta_graph 함수로 지정할 수 있습니다.

예 tensorflow는 정의한 모든 변수를 내 보냅니다. 그러나 그래프로 내보낼 필요가있는 다른 정보가 필요하면 컬렉션에 추가 할 수 있습니다.

+0

감사합니다. Kashyap. 나는 그 방법을 시도했지만 여전히 성공하지 못했습니다. 위의 원본 게시물에 세부 정보를 추가했습니다. –

+0

내 게시물을 업데이트했습니다 ... 새 코드가 작동하고 컬렉션에 변수를 추가하는 것이 선택적인 이유를 분명히해야합니다. – Kashyap

+0

이상합니다. 내가 mode = save와 mode = load로 코드를 실행하면,'NameError : name 'myVar'not defined'가 발생합니다. Tensorflow 0.12.0과 Python 2.7.11을 사용하고 있습니다. –