InvalidArgumentError в слое Keras Embedding из-за отрицательного поиска индекса - PullRequest
0 голосов
/ 30 апреля 2018

Я получаю InvalidArgumentError при попытке обучить модели глубокого обучения, реализованной в Керасе. Я искал похожие проблемы в Keras и TensorFlow, однако мое сообщение об ошибке кажется необычным из-за индекса, который не может быть найден. Ниже приведено сообщение об ошибке.

tenorflow.python.framework.errors_impl. InvalidArgumentError : индексы [427,9] = -2147483648 отсутствуют в [0, 38545) [[Узел: time_distributed_1 / Gather = Gather [Tindices = DT_INT32, Tparams = DT_FLOAT, validate_indices = true, _device = "/ job: localhost / replica: 0 / task: 0 / device: CPU: 0"] (встраивание / чтение, time_distributed_1 / Cast)]]

Я использую Python 3.5.2 с версией TensorFlow 1.4.1 и версией Keras 2.1.5.

Как вы можете заметить, не только искомый индекс отрицателен, он фактически равен -2 ^ 31. (т. е. самое низкое 32-разрядное целое число со знаком)

Ниже приведен код, который я использовал для подготовки модели.

import numpy
from keras.layers import Embedding, Bidirectional, LSTM, TimeDistributed
from keras_contrib.layers import CRF

# Form embedding layer's weight matrix
V = len(word_to_index) + 1  # V = 38545
embedding_weights = numpy.zeros((V, N))
for word, index in word_to_index.items():
    embedding_weights[index, :] = word_vec_dict[word]

embedding_layer = Embedding(V, N,
                            weights=[embedding_weights], mask_zero=True)

model = Sequential()
model.add(TimeDistributed(embedding_layer,
                          input_shape=(C, U)))

model.add(TimeDistributed(Bidirectional(LSTM(M // 2, return_sequences=True))))
model.add(TimeDistributed(GlobalMaxPooling1D()))
model.add(Bidirectional(LSTM(H // 2, return_sequences = True), merge_mode='concat'))
crf = CRF(num_tags, sparse_target=True)
model.add(crf)
model.compile('adam', loss = crf.loss_function, metrics=[crf.accuracy])

Данные, подаваемые на эту модель, имеют размеры (C, U, N) и имеют тип int. (т. е. исключая размер размера партии B) Проще говоря, каждый образец в партии - это разговор длиной C. Каждый разговор состоит из высказываний с фиксированной длиной U. Наконец, каждое высказывание состоит из N положительных индексов. (т. е. индексы соответствующих слов в словаре)

Я даже проверил весь набор данных (после его преобразования в индексы), используя циклы simple for, и не смог найти никакого значения индекса вне диапазона [0, 38545). Почему такой цикл индекса для -2^31 происходит во время тренировки?

1 Ответ

0 голосов
/ 04 мая 2018

Я наконец решил проблему. Во время обучения модели я использовал генерацию пакетов и оставил часть входного массива неинициализированной в функции генератора пакетов.

Мне неясно, почему искомый индекс был -2147483648, точно. Однако, я думаю, поскольку неинициализированная часть массива содержала значения, которые больше, чем размер словаря, и даже границы 32-разрядного целого числа в этом отношении, это вызвало неопределенное поведение.

После того, как я правильно инициализировал весь пакетный ввод, проблема была решена. Ниже приведена несколько упрощенная версия функции пакетного генератора, которую я использовал. Добавленный раздел инициализации имеет комментарий к нему, чтобы выделить то, что рассказано выше.

def batch_generator(dataset_x, dataset_y, tag_indices, mini_batch_list, C, U,
                    num_tags, word_index_to_append, tag_index_to_append):
    num_mini_batches = len(mini_batch_list)

    index_list = [x for x in range(num_mini_batches)]
    random.shuffle(index_list)

    k = -1
    while True:
        k = (k + 1) % len(index_list)
        index = index_list[k]
        conversation_indices = mini_batch_list[index]

        num_conversations = len(conversation_indices)
        batch_features = numpy.empty(shape = (num_conversations, C, U),
                                     dtype = int)
        label_list = []

        for i in range(num_conversations):
            utterances = dataset_x[conversation_indices[i]]
            labels = copy.deepcopy(dataset_y[conversation_indices[i]])
            num_utterances = len(utterances)
            num_labels_to_append = max(0, C - len(labels))
            labels += [tag_index_to_append] * num_labels_to_append
            tags = to_categorical(labels, num_tags)
            del labels

            for j in range(num_utterances):
                utterance = copy.deepcopy(utterances[j])
                num_to_append = max(0, U - len(utterance))
                if num_to_append > 0:
                    appendage = [word_index_to_append] * num_to_append
                    utterance += appendage

                batch_features[i][j] = utterance

            # ADDING THE TWO LINES BELOW SOLVED THE ISSUE
            remaining_space = (C - num_utterances, U)
            batch_features[i][num_utterances:] = numpy.ones(remaining_space) *\
                                                 word_index_to_append
            label_list.append(tags)

        batch_labels = numpy.array(label_list)
        yield batch_features, batch_labels
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...