【问题标题】:One Hot Encoding dimension - Model Compexity一个热编码维度 - 模型复杂度
【发布时间】:2019-01-15 16:47:49
【问题描述】:

我会解释我的问题:

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

我想使用 one-hot 编码来表示每个样本。如果我们考虑对那些代码较少的样本进行填充操作,则表示应该是一个 800x600 的矩阵。

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

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

现在,我有两个考虑:

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

【问题讨论】:

  • 您已使用 Python 标记发布此内容,因此您必须有一些您尝试运行的代码。请在您的问题中包含这一点,并具体说明您的要求,以便我们更好地帮助您。

标签: deep-learning one-hot-encoding


【解决方案1】:

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

这些事件可以通过嵌入矩阵来翻译。 然后您可以使用 LSTM(或 GRU 或 RNN o Bilateral 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)
    

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-02-29
    • 2018-04-05
    • 2017-02-19
    • 1970-01-01
    • 1970-01-01
    • 2016-07-18
    • 1970-01-01
    • 2021-07-26
    相关资源
    最近更新 更多