一个热编码维度-模型兼容性

时间:2019-01-15 16:47:49

标签: deep-learning one-hot-encoding

我将解释我的问题:

  • 我大约有50.000个样本,每个样本都由代表“事件”的代码列表描述
  • 唯一代码的数量大约为800。
  • 一个样本最多可以包含600个代码。

我想使用一键编码来表示每个样本。如果考虑对代码较少的那些样本进行填充操作,则表示形式应为800x600矩阵。

将此新表示形式提供为网络的输入,意味着将每个矩阵展平为大小为800x600(460.000值)的向量。

最后,数据集应包含50.000个大小为460.000的向量。

现在,我有两个注意事项:

  • 如何处理这样大小的数据集?(我尝试使用数据生成器来即时获取表示形式,但是它们确实很慢)。
  • 每个样本都有一个460.000大小的向量作为输入,这意味着我的模型的复杂度(要学习的参数数量)非常高(在我的情况下约为15.000.000),因此,我需要一个庞大的数据集正确训练模型。不是吗?

1 个答案:

答案 0 :(得分:0)

为什么不使用NLP中使用的常规模型?

可以通过嵌入矩阵来翻译这些事件。 然后,您可以使用LSTM(或GRU或RNN或双边LSTM)表示事件链,使用LSTM代替常规网络的区别在于,您使用同一模块重复N次。 因此,您的输入实际上不是460,000,而是内部的事件A间接帮助您了解事件B。这是因为LSTM具有一个模块,可针对链中的每个事件重复其自身。

您在这里有一个示例: https://www.kaggle.com/ngyptr/lstm-sentiment-analysis-keras

广义上讲,我将要做以下工作(使用Keras伪代码):

  • 检测事件总数。我生成一个唯一列表。
    unique_events = list (set ([event_0, ..., event_n]))
    You can perform the translation of a sequence with:
    seq_events_idx = map (unique_events.index, seq_events)
    
  • 在每个序列中添加必要的填充:
    sequences_pad = pad_sequences (sequences, max_seq)
    
  • 然后,您可以直接使用嵌入将事件转移到您考虑的维的关联向量。
    input_ = Input (shape = (max_seq,), dtype = 'int32')
    embedding = Embedding (len(unique_events),
                        dimensions,
                        input_length = max_seq,
                        trainable = True) (input_)
    
  • 然后定义LSTM的体系结构(例如):
    lstm = LSTM (128, input_shape = (max_seq, dimensions), dropout = 0.2, recurrent_dropout = 0.2, return_sequences = True) (embedding)
    
  • 添加密集和所需的结果:
    out = Dense (10, activation = 'softmax') (lstm)
    

我认为这种类型的模型可以帮助您并提供更好的结果。