Оценка TensorFlow RNN чувствительна к пакетному заполнению - PullRequest
0 голосов
/ 10 февраля 2019

Я тренирую классификатор предложений с TensorFlow 1.9.0 в Windows 10, используя RNN (tf.nn.bidirectional_dynamic_rnn) с обучением партии и определяя точную длину последовательности каждого элемента пакета с помощью входного параметра bidirectional_dynamic_rnn sequence_length.

Насколько я понимаю, указание sequence_length позволяет игнорировать заполнение.Но если я создаю пакет с повторяющимся в одном предложении временем batch_size с различным количеством вставленных отступов, я получаю прогноз с изменяющейся вероятностью метки (для примера, который я посмотрел, вероятность того, что метка будет истинной, уменьшается с увеличением количества площадок)).

Что может быть причиной этого?Ожидается ли это?

Я добавил часть своего кода, которая может иметь значение.

Спасибо за вашу помощь!

def evaluate(data_set, sess, data_index, batch_size, self):
    steps = len(data_set) // batch_size
    sentence_ls = []
    for step in range(steps):
        prior_index = data_index
        batch_inputs, batch_labels, data_index = generate_batch(batch_size, 
                                                                            data_set, 
                                                                            data_index)

        train_seq_len = seq_len(batch_inputs, self.batch_size)
        feed_dict = {self._train_inputs : batch_inputs, self._train_labels : batch_labels, 
                     self._seq_len: train_seq_len, self._keep_prob_ph: 1} #no dropout during evaluation   

        correct_pred, probs = sess.run([self._correct_prediction, self._probs], feed_dict=feed_dict)
        #probs is a list of probability for each label 

        for idx in range(batch_inputs.shape[0]):
            label = batch_labels[idx]
            sentence = " ".join(data_set[prior_index + idx].words_parsed_text)
            prob = probs[idx]
            sentence_attention_ls.append([label, sentence, correct_pred[idx], prob])

    return sentence_ls


def seq_len(batch, batch_size):
    seq_len_ls = [] 
    for i in range(batch_size):
        seq_len = 0
        macro_seq_len = batch.shape[1] #the max seq lenght of the batch
        for j in range(macro_seq_len):
            if batch[i][j] != 1: # 1 = _PAD_
                seq_len += 1
        seq_len_ls.append(seq_len) 
    return seq_len_ls


##########
#some of the code that creates the RNN
##########

seq_len = tf.placeholder(tf.int32, [None], name='seq_len') 

lstm_fw_cell1 = tf.nn.rnn_cell.LSTMCell(self.hidden_size, forget_bias=1.0, state_is_tuple=True,
                                      initializer=self.initializer)
lstm_fw_cell2 = tf.nn.rnn_cell.LSTMCell(self.hidden_size, forget_bias=1.0, state_is_tuple=True,
                                      initializer=self.initializer)
lstm_fw_cell = tf.contrib.rnn.MultiRNNCell([lstm_fw_cell1, lstm_fw_cell2])


lstm_bw_cell1 = tf.nn.rnn_cell.LSTMCell(self.hidden_size, forget_bias=1.0, state_is_tuple=True,
                                      initializer=self.initializer)
lstm_bw_cell2 = tf.nn.rnn_cell.LSTMCell(self.hidden_size, forget_bias=1.0, state_is_tuple=True,
                                      initializer=self.initializer)        
lstm_bw_cell = tf.contrib.rnn.MultiRNNCell([lstm_bw_cell1, lstm_bw_cell2])

outputs, states = tf.nn.bidirectional_dynamic_rnn(cell_fw=lstm_fw_cell, cell_bw=lstm_bw_cell, 
                                                inputs=input_layer, sequence_length=seq_len, 
                                                dtype=tf.float32, scope="1_BiLSTM")



probs = tf.nn.softmax(logits, name='probs')
correct_prediction = tf.equal(prediction, tf.cast(train_labels, tf.float32), name='correct_prediction')


...