【问题标题】:Character level CNN - 1D or 2D字符级 CNN - 1D 或 2D
【发布时间】:2019-08-16 20:42:48
【问题描述】:

我想在 Pytorch 中实现一个字符级的 CNN。

我的输入有 4 个维度:

(batch_size, seq_length, padded_character_length, embedding_dim)

我想知道是否应该合并两个维度并使用Conv1D-layer,或者在现有维度上使用Conv2D-layer。

鉴于输入的尺寸技术上都可以正常工作,我也看到了这两个版本的实现。所以我想知道更喜欢哪种方法。

这两种方法中的一种是否比另一种具有特别的优势?

【问题讨论】:

  • 我想知道padded_character_length 是用于在单词级别填充字符吗?假设它 = 4:name -> [n, a, m, e]is -> [i, s, 0, 0]。我的理解正确吗?
  • @DavidNg 是的,每个单词都被填充或截断为固定数量的字符。

标签: neural-network deep-learning nlp conv-neural-network pytorch


【解决方案1】:

没有什么比 Conv1D 和 Conv2D 最好的了。

一般Conv1D用于文本数据,Conv2D用于图像数据。

考虑到您将实现字符级 CNN,使用 Conv1D 更有意义。

【讨论】:

    【解决方案2】:

    我同意 Venkatesh 的观点,即 1D 可能对您的实施更有意义。我通常不使用合并,而是使用 Keras 中的 TimeDistributed 层。这需要一层并将其应用于时间维度。优点是您可以将每个维度的特征分开,直到您想要合并它们。

    如果您使用填充(如您所提到的),那么在时间维度上应用相同的图层而不是合并图层并在实际字符之间创建尴尬的填充空间更有意义。 TimeDistributed 层解决了这个问题。

    我在 Google 上搜索了一下,发现有人尝试在 PyTorch 中实现此功能,这至少可以帮助您入门。

    PyTorch TimeDistributed

    稍微扩展一下我的用法.. 我的最新型号有 5、12 小时周期,每个 12 小时周期都有零星活动,因此它被填充以达到 30 的标准长度,所以最终的输入形状是 (?, 5, 30, embedding_size)。我使用 TimeDistributed 1D CNN 在单个周期生成特征,然后我将这些特征最大池化并连接以创建一个新形状 (?, 5, n_feats),其中现在有 5 组特征图.我再次使用不同的 1D CNN 层运行该数据,该层看起来跨越 5、12 小时的周期。每个时期的填充是相互独立的,所以我不能简单地使用 2D CNN,因为同一索引处的元素不会代表跨时期的相同时间。

    编辑:

    我认为 Keras 的实现要复杂一些,但应该很接近。他们的文档说“这个包装器将一个层应用于输入的每个时间切片。”如果到达那里需要合并然后恢复,那么它们可能是围绕特征图的一些考虑因素。例如,如果过滤器大小为 2,则第一个特征图中的最后一项(重塑后)将包括两个时间片之间的最后一个特征和第一个特征。

    这里是 one more link 讨论 PyTorch 中的此功能可能会有所帮助。

    【讨论】:

    • 谢谢你的回复,我想我会这样尝试。看看那个 PyTorch 实现,它似乎基本上合并/展平了两个维度,将重新整形的输入转发到一个模块中,然后恢复维度。或者 TimeDistributed 通常还有什么其他功能吗?
    【解决方案3】:

    我只是想回到这里,因为我尝试了两种变体,使用 Conv2D Conv1DTimeDistributed.
    经过几次实验后,我将继续使用 Conv2D 层,因为这会为我的设置带来明显更好的结果。

    我猜结果确实取决于具体的实现,但是我不能支持 Conv1D 层通常更适合字符级 CNN 的说法。

    所以 Conv2D 层对于这个应用程序绝对值得考虑!

    【讨论】:

    • 您能详细解释一下这个例子中Conv2D 的内核大小和内核数量吗?谢谢!
    • 我使用的版本类似于您可以找到的 here under Embedding。内核大小为 (1, 5),因此内核几乎像一维卷积一样移动,除了它处理一个额外的维度而没有任何展平。
    • 感谢您的代码参考。值得一读的是模块是如何组合在一起的 Embedding :)
    猜你喜欢
    • 2021-05-19
    • 1970-01-01
    • 1970-01-01
    • 2021-05-27
    • 1970-01-01
    • 2018-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多