我在尝试训练在 Keras 中实现的深度学习模型时收到InvalidArgumentError
。我已经在 Keras 和 TensorFlow 中搜索了类似的问题,但由于找不到索引,我的错误消息似乎不寻常。下面是错误消息。
tensorflow.python.framework.errors_impl。无效参数错误: 索引 [427,9] = -2147483648 不在 [0, 38545] 中 [[节点:time_distributed_1/收集 = 收集[索引=DT_INT32, 参数=DT_FLOAT, validate_indices=true, _device="/作业:本地主机/副本:0/任务:0/设备:CPU:0"](嵌入/读取,time_distributed_1/强制转换(]]
我正在使用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
个正指数组成。(即词汇表中相关单词的索引(
我什至使用简单的 for 循环检查了整个数据集(在转换为索引后(,找不到超出范围[0, 38545)
的任何索引值。为什么在训练期间会出现这样的-2^31
索引循环?
我终于解决了这个问题。我在训练模型时使用批处理生成,并且在批处理生成器函数中保留了未初始化的输入数组的一部分。
我不清楚为什么被查找的索引是-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