Я получаю 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
происходит во время тренировки?