Замораживание моделей TensorFlow с экспоненциальной скользящей средней дает разные предполагаемые вероятности - PullRequest
0 голосов
/ 21 февраля 2019

Я пытаюсь заморозить начальную модель на основе v3 и выполнить логический вывод.Однако я получаю противоречивые предполагаемые вероятности, используя замороженную модель по сравнению с исходной моделью.

Я выяснил, что различия получены из экспоненциальной скользящей средней (EMA) как в обучении, так и в умозаключениях.Когда я отключаю EMA в обеих моделях, я получаю одинаковые вероятности (разница <1e-5). </p>

Используемый мной код заморозки:

from __future__ import print_function
import tensorflow as tf
from nets.inception_v3 import inception_v3, inception_v3_arg_scope
from tensorflow.python.framework import graph_util
import sys 
slim = tf.contrib.slim

checkpoint_file = '/my/model'

with tf.Graph().as_default() as graph:

    images = tf.placeholder(shape=[None, 100, 221, 6], dtype=tf.float32, name = 'input')

    with slim.arg_scope(inception_v3_arg_scope()):
        logits, end_points = inception_v3(images, num_classes = 3, create_aux_logits = False, is_training = False)

    variables_to_restore = slim.get_variables_to_restore()

    MOVING_AVERAGE_DECAY = 0.9999
    variable_averages = tf.train.ExponentialMovingAverage(
        MOVING_AVERAGE_DECAY)
    for var in variables_to_restore:
        tf.add_to_collection(tf.GraphKeys.MOVING_AVERAGE_VARIABLES, var)
    variables_to_restore = variable_averages.variables_to_restore()        #This line is commented if EMA is turned off

    saver = tf.train.Saver(variables_to_restore)

    #Setup graph def
    input_graph_def = graph.as_graph_def()
    output_node_names = "InceptionV3/Predictions/Reshape_1"
    output_graph_name = "./frozen_inception_v3_new_100_221_ema.pb"

    with tf.Session() as sess:
        saver.restore(sess, checkpoint_file)

        #Exporting the graph
        print ("Exporting graph...")
        output_graph_def = graph_util.convert_variables_to_constants(
                sess,
                input_graph_def,
                output_node_names.split(","))

        with tf.gfile.GFile(output_graph_name, "wb") as f:
            f.write(output_graph_def.SerializeToString())

Часть EMA одинаковас кодом исходной модели.

Я неправильно замораживаю график вывода EMA?

1 Ответ

0 голосов
/ 01 марта 2019

Проблема решена.Часть EMA, которую я использую

MOVING_AVERAGE_DECAY = 0.9999
variable_averages = tf.train.ExponentialMovingAverage(
    MOVING_AVERAGE_DECAY)
for var in variables_to_restore:
    tf.add_to_collection(tf.GraphKeys.MOVING_AVERAGE_VARIABLES, var)
variables_to_restore = variable_averages.variables_to_restore()

, неверна.Если я удалю

for var in variables_to_restore:
    tf.add_to_collection(tf.GraphKeys.MOVING_AVERAGE_VARIABLES, var)

, то результаты хорошие.

...