Похоже, что параметры нормализации партии не обновляются в Tensorflow? - PullRequest
0 голосов
/ 29 марта 2020

Я новичок в TensorFlow. Мы устанавливаем одинаковые данные обучения на этапе обучения и на этапе тестирования. Но потери при обучении составляют

enter image description here

Потеря при испытании равна (Данные испытаний совпадают с данными по обучению.)

enter image description here

Очень странно, что две вышеупомянутые потери различны. Я не знаю, неправильно ли использовать пакетную нормализацию. Я дважды проверил, что мы установили обучение = True на этапе обучения, а обучение = False на этапе тестирования. Похоже, что параметры нормализации партии не обновляются. Кто-нибудь может мне помочь и посмотреть?

Шаг поезда и шаг теста:

  with tf.Graph().as_default():
        train_model = RnnClassifier(training=True)
        test_model = RnnClassifier(training=False)

        with tf.name_scope('train'):
            model_train_tensor_dict = train_model.forward(next_train_inputs)

            model_train_loss = model_train_tensor_dict['loss']
            global_step = tf.get_variable('global_step',
                                          dtype=tf.int32,
                                          initializer=0,
                                          trainable=False)
            learning_rate = tf.train.exponential_decay(FLAGS.base_learning_rate,
                                                       global_step,
                                                       FLAGS.learning_rate_decay_steps,
                                                       FLAGS.learning_rate_decay_rate,
                                                       staircase=True)
            optimizer = tf.train.MomentumOptimizer(learning_rate=learning_rate, momentum=0.9)
            with tf.control_dependencies(tf.get_collection(tf.GraphKeys.UPDATE_OPS)):
                model_train_ops = optimizer.minimize(model_train_loss, global_step=global_step)
            model_train_tensor_dict['global_step'] = global_step

        with tf.name_scope('test'):
            model_test_tensor_dict = test_model.forward(next_test_inputs)

RnnКлассификатор:

class BNLSTMCell(RNNCell):
    def __init__(self,
                 num_units,
                 training,
                 name,
                 reuse,
                 gate_initializer=tf.initializers.orthogonal(),
                 bias_initializer=tf.initializers.ones()):
        self.num_units = num_units
        self.training = training
        self.name = name
        self.reuse=reuse
        self.gate_initailizer = gate_initializer
        self.bias_initailizer = bias_initializer

    @property
    def state_size(self):
        '''
        :return: (cell_size, hidden_size)
        '''
        return (self.num_units, self.num_units)

    @property
    def output_size(self):
        return self.num_units

    def __call__(self, inputs, state, scope=None)
        if scope is None:
            scope = self.name
        with tf.variable_scope(scope, reuse=self.reuse):
            cell_state, hidden_state = state
            feature_size = inputs.get_shape().as_list()[1]

            W_XH = tf.get_variable('W_XH', shape=[feature_size, 4 * self.num_units], \
                                   initializer=self.gate_initailizer)
            print('W_XH: {}'.format(W_XH))

            W_HH = tf.get_variable('W_HH', shape=[self.num_units, 4 * self.num_units], \
                                   initializer=self.gate_initailizer)
            bias = tf.get_variable('bias', shape=[4 * self.num_units], \
                                   initailizer=self.bias_initailizer)

            hidden = bn('bn_xWXH', tf.matmul(inputs, W_XH), training=self.training) + \
                     bn('bn_hWHH', tf.matmul(hidden_state, W_HH), training=self.training) + \
                     bias
            forget, input, output, candidate_cell_state = tf.split(hidden, num_or_size_splits=4, axis=1)

            next_cell_state = tf.math.sigmoid(forget) * cell_state + \
                              tf.math.sigmoid(input) * tf.math.tanh(candidate_cell_state)

            bn_next_cell_state = bn('bn_next_cell_state', next_cell_state, training=self.training)
            next_hidden_state = tf.math.sigmoid(output) * tf.math.tanh(bn_next_cell_state)

            return next_hidden_state, (next_cell_state, next_hidden_state)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...