Когда я использовал контрольную точку tenorflow, выполнялась ли операция, подобная 'tf.variable'? - PullRequest
0 голосов
/ 25 декабря 2018

Я обучил модель. Структура модели следующая. Я обучаю и сохраняю модель, и я получаю файл контрольных точек. Я могу перезагрузить контрольную точку и предсказать тестовый файл. Я могу получить то, что хочу получить. Нопринцип, который я не могу понять. Вопрос в том, что когда я перезагружаю контрольную точку и использую pred_= sess.run([model.out], feed_dict={model.query: query_data, model.doc: doc_data}, запускается ли операция, подобная 'tf.variable'?Потому что, когда я запускаю эту команду, будет выполняться операция, которая используется в model.out.

Я предполагаю, что, когда тензорный поток загружает контрольную точку, он знает, что есть некоторая переменная. Когда происходит такая операция, как'tf.Variable', сначала нужно определить, находится ли имя переменной в контрольной точке, если она существует, опция' tf.variable 'не будет выполнена. Я сканирую какой-то документ, я только знаю, что .ckpt.meta сохранил структуру графика,и .index сохраняют сопоставление имени и тензора. Но я не получил доказательств своего предположения. Может кто-нибудь сказать мне, что мое предположение верно. Большое спасибо.

    with tf.device(device_name):
        with tf.name_scope('input'):
            self.query = tf.placeholder(tf.int32, shape=[None, FLAGS.sentence_length], name='QueryData')
            self.doc = tf.placeholder(tf.int32, shape=[None, FLAGS.sentence_length], name="DocData")
            self.label = tf.placeholder(tf.float32, shape=[None, 2], name='Label')
        with tf.name_scope('w2v'):
            if FLAGS.fine_tune:
                self.words = tf.Variable(self.__load_w2v('../../model/vec.txt', FLAGS.embedding_dim), dtype=tf.float32, name='words')
            else:
                self.words = tf.Variable(tf.random_uniform([FLAGS.vocab_size, FLAGS.embedding_dim]), dtype=tf.float32, name='words')
            self.query_words = tf.nn.embedding_lookup(self.words, self.query)
            self.doc_words = tf.nn.embedding_lookup(self.words, self.doc)
            self.query_words_out = tf.expand_dims(self.query_words, -1)
            self.doc_words_out = tf.expand_dims(self.doc_words, -1)
        with tf.name_scope('convolution_layer'):
            self.wc = {}
            self.bc = {}
            self.query_conv = {}
            self.query_pool = {}
            self.query_pool_list = []
            self.doc_conv = {}
            self.doc_pool = {}
            self.doc_pool_list = []
            for i, size in enumerate(self.conv_kernel_size):                  
                self.wc[size] = tf.Variable(tf.random_normal([size, FLAGS.embedding_dim, 1, self.conv_kernel_number[i]]),
                                       'wc' + str(size))
                self.bc[size] = tf.Variable(tf.random_normal([self.conv_kernel_number[i]]), 'bc' + str(size))
                self. query_conv[size] = self.__conv2d('conv' + str(size), self.query_words_out, self.wc[size], self.bc[size])
                self.query_pool[size] = self.__full_max_pool('pool' + str(size), self.query_conv[size], [0, 3, 2, 1])
                self.query_pool_list.append(self.query_pool[size])
                self.doc_conv[size] = self.__conv2d('conv' + str(size), self.doc_words_out, self.wc[size], self.bc[size])
                self.doc_pool[size] = self.__full_max_pool('pool' + str(size), self.doc_conv[size], [0, 3, 2, 1])
                self.doc_pool_list.append(self.doc_pool[size])
            self.query_pool_merge = tf.concat(self.query_pool_list, 3)
            self.query_conv_out = tf.nn.l2_normalize(tf.nn.relu(tf.reshape(self.query_pool_merge, [-1, sum(self.conv_kernel_number)])), 1)
            self.doc_pool_merge = tf.concat(self.doc_pool_list, 3)
            self.doc_conv_out = tf.nn.l2_normalize(tf.nn.relu(tf.reshape(self.doc_pool_merge, [-1, sum(self.conv_kernel_number)])), 1)

        with tf.name_scope('dense_layer_1'):
            self.l1_par_range = np.sqrt(6.0 / (sum(self.conv_kernel_number) + self.L1_N))
            self.wd1 = tf.Variable(tf.random_uniform([sum(self.conv_kernel_number), self.L1_N], -self.l1_par_range, self.l1_par_range))
            self.bd1 = tf.Variable(tf.random_uniform([self.L1_N], -self.l1_par_range, self.l1_par_range))
            self.query_l1 = tf.matmul(self.query_conv_out, self.wd1) + self.bd1
            self.doc_l1 = tf.matmul(self.doc_conv_out, self.wd1) + self.bd1
            self.query_l1_out = tf.nn.l2_normalize(tf.nn.relu(self.query_l1), 1)
            self.doc_l1_out = tf.nn.l2_normalize(tf.nn.relu(self.doc_l1), 1)

        with tf.name_scope('dense_layer_2'):
            self.l2_par_range = np.sqrt(6.0 / (self.L1_N + self.L2_N))
            self.wd2 = tf.Variable(tf.random_uniform([self.L1_N, self.L2_N], -self.l2_par_range, self.l2_par_range))
            self.bd2 = tf.Variable(tf.random_uniform([self.L2_N], -self.l2_par_range, self.l2_par_range))
            self.query_l2 = tf.matmul(self.query_l1_out, self.wd2) + self.bd2
            self.doc_l2 = tf.matmul(self.doc_l1_out, self.wd2) + self.bd2
            self.query_l2_out = tf.nn.l2_normalize(tf.nn.relu(self.query_l2), 1)
            self.doc_l2_out = tf.nn.l2_normalize(tf.nn.relu(self.doc_l2), 1)

        with tf.name_scope('cosine_similarity'):              
            prod = tf.reduce_sum(tf.multiply(self.query_l2_out, self.doc_l2_out), 1, True)
            unprod = tf.abs(1 - prod)
            self.out = tf.concat([unprod, prod], axis=1)

        with tf.name_scope('loss'):
            self.pred_y = tf.argmax(tf.nn.softmax(self.out), 1)
            self.label_y = tf.argmax(self.label, 1)
            self.pred = tf.equal(self.pred_y, self.label_y)
            self.accuracy = tf.reduce_mean(tf.cast(self.pred, tf.float32))
            self.loss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits=self.out, labels=self.label))

        with tf.name_scope('train'):
            self.learning_rate = tf.Variable(float(self.LEARNING_RATE), trainable=False)
            self.learning_rate_decay_op = self.learning_rate.assign(self.learning_rate * self.LEARNING_RATE_DECAY_FACTOR)
            self.train_step = tf.train.AdamOptimizer(self.learning_rate).minimize(self.loss)
        tf.summary.scalar('loss', self.loss)
        tf.summary.scalar('accuracy', self.accuracy)
        self.merged = tf.summary.merge_all()
...