Keras中嵌入层的大小问题

时间:2020-03-09 02:53:52

标签: python tensorflow machine-learning keras kaggle

问题: 我所定义的错误提示,我定义的Keras嵌入层大小似乎不正确。

InvalidArgumentError: indices[19,0] = 99 is not in [0, 31)

代码: Kaggle笔记本-https://www.kaggle.com/benseto/tf-ffnnregressor 不知道您是否需要一个帐户来访问代码。如果是这样,我将考虑将其导出到外部。

问题摘要:

我正在使用旧的“推土机蓝皮书” Kaggle竞赛来学习。我正在尝试为该回归练习(价格预测)训练前馈神经网络。由于分类特征具有许多独特的特征,因此我采取的策略是针对这些分类特征中的每一个训练Keras嵌入层,而不是一键编码(这会使数据帧变得笨拙)。

我几乎可以解决这个问题,但是我相信嵌入层的大小有误:

fit()期间出错:

InvalidArgumentError: indices[19,0] = 99 is not in [0, 31)

通过搜索堆栈溢出,人们已经得出结论,这是由于嵌入层的大小不正确,通常输入维需要为vocab_size + 1。

要为每个分类特征生成单独的Keras嵌入层,链接笔记本的单元格25定义了每个嵌入层:

# Build layer to ingest each categorical features vector
def build_embedding_layer(num_categories, inputs, concats, name = 'categorical'):
    categories = num_categories + 1             # Per Keras docs, embedding input dim should be input_size + 1
    dimensions = min(50, categories // 2 + 1)

    input = keras.layers.Input(shape = (1,), name = name)
    embedding = keras.layers.Embedding(categories, dimensions, input_length = 1)(input)
    embedding = keras.layers.Reshape(target_shape = (dimensions,))(embedding)

    inputs.append(input)
    concats.append(embedding)

在上述函数中,num_categories是每个特征向量的唯一记录数,而input和concats表示包含每个特征的最终输入张量的数组。

我尝试过什么: 我尝试过手动将嵌入层的大小增加到很多,但是在调用fit()时仍然遇到上述问题。

在这一点上,我很困惑,对于这个问题的任何建议和/或见解都将受到赞赏。

1 个答案:

答案 0 :(得分:0)

作为后续,我将这段代码引入了另一个环境(Google Colab)中,并且在那里工作。因此,原始运行时环境(Kaggle)必须存在一个错误,并且代码本身也没有错。