tensorflow 모델 매개 변수 저장 및 불러오기 문제

14125 단어 deeplearn

tensorflow 모델 매개 변수 저장 및 불러오기 문제


드디어 버그 원인을 찾았습니다!적어 두다플랫폼에 익숙하지 않은 탓인가!Q: 왜 두 모델 대상이 같은 파일에서 함께 실행되는지, 그들이 분리해서 실행할 때 훈련된 모델을 직접 읽으면 오류가 발생하고, 항상 정확하고, 읽기 오류가 있습니까?같은 파일에서 직접 훈련을 하고 모델을 다시 불러오는 예측이 틀리지 않을 뿐만 아니라, 더욱 이상한 것은 이때 파일 안의 대상을 나누어 불러오는 모델이 틀리지 않는다는 것이다.
model.py, 안에 모델 V와 모델 P가 있고 모델 P도 있습니다.py 및 modelV.py는 각각 ModelP와 ModeV 두 대상만 포함하고 먼저 모델P를 사용합니다.py 및 modelV.py는 각각 모형을 훈련한 다음에 모델에서.py에 불러오기:
# -*- coding: utf8 -*-

import tensorflow as tf

class ModelV():

    def __init__(self):

        self.v1 = tf.Variable(66, name="v1")
        self.v2 = tf.Variable(77, name="v2")
        self.save_path = "model_v/model.ckpt"
        self.init = tf.global_variables_initializer()
        self.saver = tf.train.Saver()
        self.sess = tf.Session()

    def train(self):
        self.sess.run(self.init)
        print 'v2', self.v2.eval(self.sess)

        self.saver.save(self.sess, self.save_path)
        print "ModelV saved."

    def predict(self):

        all_vars = tf.trainable_variables()
        for v in all_vars:
            print(v.name)
        self.saver.restore(self.sess, self.save_path)
        print "ModelV restored."
        print 'v2', self.v2.eval(self.sess)
        print '------------------------------------------------------------------'

class ModelP():

    def __init__(self):

        self.p1 = tf.Variable(88, name="p1")
        self.p2 = tf.Variable(99, name="p2")
        self.save_path = "model_p/model.ckpt"
        self.init = tf.global_variables_initializer()
        self.saver = tf.train.Saver()
        self.sess = tf.Session()

    def train(self):
        self.sess.run(self.init)
        print 'p2', self.p2.eval(self.sess)

        self.saver.save(self.sess, self.save_path)
        print "ModelP saved."

    def predict(self):

        all_vars = tf.trainable_variables()
        for v in all_vars:
            print v.name
        self.saver.restore(self.sess, self.save_path)
        print "ModelP restored."
        print 'p2', self.p2.eval(self.sess)
        print '---------------------------------------------------------------------'


if __name__ == '__main__':
    v = ModelV()
    p = ModelP()
    v.predict()
    #v.train()
    p.predict() 
    #p.train()

여기global_variables_initializer () 가 중요합니다!대상 모델P와 모델V 내부에 각각 분배되고 정의된 tf임에도 불구하고.Variable (), 즉 v1 v2와 p1 p2. 그러나 tf 모듈에 있어 전역 변수입니다. 다음 코드를 통해 모든 변수를 볼 수 있습니다. 같은 파일에서 ModelP와 ModelV를 동시에 실행하면 초기화한 후에 같은 변수를 출력할 수 있습니다. 이것은 문제의 관건입니다.
all_vars = tf.trainable_variables()
for v in all_vars:
    print(v.name)

잘못 1모델 P와 모델 V 초기화 순서를 교환해서 오류 정보의 변화를 볼 수 있습니다
v1:0
v2:0
p1:0
p2:0
ModelV restored.
v2 77
v1:0
v2:0
p1:0
p2:0
W tensorflow/core/framework/op_kernel.cc:975] Not found: Key v2 not found in checkpoint
W tensorflow/core/framework/op_kernel.cc:975] Not found: Key v1 not found in checkpoint

실제로 분리 운행할 때 모델이 저장한 매개 변수는 정확하다. 왜냐하면 하나의 모델에Variable는 v1v2 또는 p1p2만 있기 때문이다.그러나 한 파일이 동시에 실행될 때 모델 매개 변수는 실제로 v1 v2 p1 p2 4개로 저장됩니다. 기본적으로 생성된 Saver는 모든 매개 변수를 직접 저장하기 때문입니다.Saver.restore () 는 기본값 (Variable 매개 변수 목록이 없을 때) 이미 정의된 전역 모델 변수에 따라 대응하는 매개 변수 값을 불러오고 ModelV를 진행합니다.predict 시 순서대로 (debug에서 알 수 있듯이 매개 변수 순서대로 한 번 검사해야 함) 모델 파일에서 해당하는 키를 찾으면 대응하는 v1v2를 찾을 수 있고 불러오는 데 성공하지만 모델 P.predict 시 모델p의 모형 파일에서 v1과 v2를 찾을 수 없고 p1과 p2만 있으면 오류가 발생합니다.그러나 이곳의 첫 번째 탑재 중 p1p2를 찾을 수 없습니다.
Saver.save() 및 Saver.restore()는 한 쌍으로 각각 모델을 저장하고 불러오는 매개 변수만 저장하지만 모델의 구조를 어떻게 알 수 있습니까?당신이 정의해야 하고 저장된 모델과 일치해야 불러올 수 있습니다.모델을 정의하지 않고 모델 구조와 모델 매개변수 값을 직접 로드하려면 다음을 사용합니다.
#    ,     
new_saver = tf.train.import_meta_graph("model_v/model.ckpt.meta")
print "ModelV construct"
all_vars = tf.trainable_variables()
for v in all_vars:
    print v.name
    #print v.name,v.eval(self.sess) # v  , 
#        
new_saver.restore(self.sess, tf.train.latest_checkpoint('model_v/'))
print "ModelV restored."
all_vars = tf.trainable_variables()
for v in all_vars:
    print v.name,v.eval(self.sess)

캐리어 구조, 즉 모델 매개 변수 변수가 완성되면 변수가 생기지만 그의 값에 접근할 수 없습니다. 아직 값을 부여하지 않았기 때문에restore를 한 번 더 하면 값을 얻을 수 있습니다.
그렇다면 상술한 오류의 해결 방법은 바로 이 개선 버전의 모델이다.py;사실train.Saver는 파라미터를 가지고 있을 수 있습니다. 그는 당신이 저장하고 싶은 모델 파라미터를 저장할 수 있습니다. 파라미터를 가지고 있지 않으면 tf를 저장할 수 있습니다.trainable_variables () 모든variable, tf.trainable_variables () 는 tf 전역에서 얻을 수 있기 때문에 모델이 저장되고 불러올 때 대응하는 파라미터를 가진 tf를 구성합니다.train.Saver를 사용하면 올바른 모델을 저장하고 로드할 수 있습니다.
# -*- coding: utf8 -*-

import tensorflow as tf

class ModelV():

    def __init__(self):

        self.v1 = tf.Variable(66, name="v1")
        self.v2 = tf.Variable(77, name="v2")
        self.save_path = "model_v/model.ckpt"
        self.init = tf.global_variables_initializer()

        self.sess = tf.Session()

    def train(self):
        saver = tf.train.Saver([self.v1, self.v2])
        self.sess.run(self.init)
        print 'v2', self.v2.eval(self.sess)

        saver.save(self.sess, self.save_path)
        print "ModelV saved."

    def predict(self):
        saver = tf.train.Saver([self.v1, self.v2])
        all_vars = tf.trainable_variables()
        for v in all_vars:
            print v.name

        v_vars = [v for v in all_vars if v.name == 'v1:0' or v.name == 'v2:0']
        print "ModelV restored."
        saver.restore(self.sess, self.save_path)
        for v in v_vars:
            print v.name,v.eval(self.sess)  
        print 'v2', self.v2.eval(self.sess)
        print '------------------------------------------------------------------'

class ModelP():

    def __init__(self):

        self.p1 = tf.Variable(88, name="p1")
        self.p2 = tf.Variable(99, name="p2")
        self.save_path = "model_p/model.ckpt"
        self.init = tf.global_variables_initializer()
        self.sess = tf.Session()

    def train(self):
        saver = tf.train.Saver([self.p1, self.p2])
        self.sess.run(self.init)
        print 'p2', self.p2.eval(self.sess)

        saver.save(self.sess, self.save_path)
        print "ModelP saved."

    def predict(self):
        saver = tf.train.Saver([self.p1, self.p2])
        all_vars = tf.trainable_variables()
        p_vars = [v for v in all_vars if v.name == 'p1:0' or v.name == 'p2:0']
        for v in all_vars:
            print v.name
            #print v.name,v.eval(self.sess)
        saver.restore(self.sess, self.save_path)
        print "ModelP restored."
        for p in p_vars:
            print p.name,p.eval(self.sess)
        print 'p2', self.p2.eval(self.sess)
        print '----------------------------------------------------------'


if __name__ == '__main__':
    v = ModelV()
    p = ModelP()
    v.predict()
    #v.train()
    p.predict() 
    #p.train()

요약: 저장과 로드가 올바르게 수행될 수 있도록 구성된 Saver에는 Variable 매개 변수가 있는 것이 좋습니다.

좋은 웹페이지 즐겨찾기