我想在毕道尔实现一个角色级别的CNN。
我的输入有4维度:
(batch_size,seq_length,padded_character_length,embedding_dim)
我想知道是应该合并两个维度并使用Conv1D-layer,还是在现有维度上使用Conv2D-layer。
考虑到输入的维度在技术上都能正常工作,我还看到了这两个版本的实现。所以我想知道哪种方法更好。
这两种方法中的一种比另一种有特殊的优势吗?
发布于 2019-03-26 19:06:04
我同意Venkatesh的观点,即1D可能对您的实现更有意义。我通常使用在Keras中找到的TimeDistributed层,而不是合并。这需要一个层,并跨时间维度应用它。优点是,在您想要合并它们之前,您可以将每个维度中的特征保持分离。
如果您正在使用填充(正如您前面提到的),那么在时间维度上应用相同的层更有意义,而不是合并层和在实际字符之间创建尴尬的填充空间。TimeDistributed层解决了这个问题。
我在谷歌上搜索了一会儿,找到了一个尝试在PyTorch中实现这个特性的人,这至少会让你开始工作。
我的最新型号有5,12小时周期,每个12小时周期有零星的活动,因此它被填充到标准长度30,所以最终的输入形状是(?,5,30,embedding_size)。我使用TimeDistributed 1DCNN在一个时间段内生成特征,然后我最大限度地将这些特性集合起来并连接起来,以创建一个新的形状(?,5,n_feats),其中现在有5组功能地图。我再一次用一个不同的一维CNN层来处理这些数据,这个层可以观察5,12个小时的时段。每个周期中的填充是相互独立的,所以我不能简单地使用2D CNN作为同一索引上的元素,在不同时期不能代表相同的时间。
编辑:
我认为Keras实现稍微复杂一些,但应该比较接近。他们的文档说:“这个包装器将一个层应用于输入的每一个时态切片。”如果到达那里需要合并,那么在那之后恢复它们可能是围绕功能映射的一些考虑事项。例如,如果过滤器的大小为2,那么第一个特征映射中的最后一个项(整形后)将包括两个时间片之间的最后一个特性和第一个特征。
下面是再多一个链接关于在PyTorch中讨论此功能的讨论,这可能会有所帮助。
发布于 2019-03-26 13:20:50
没有什么比Conv1D和Conv2D更好的了。
通常,Conv1D用于文本数据,Conv2D用于图像数据。
考虑到您将实现字符级CNN,使用Conv1D更有意义。
发布于 2019-04-26 20:04:44
我只想回到这里,因为我已经尝试了这两个变体,使用了Conv2D和Conv1D和TimeDistributed。
经过几次实验后,我将继续使用Conv2D层,因为这将为我的设置带来更好的结果。
我想结果确实取决于具体的实现,但是我不能支持Conv1D层通常更适合字符级CNN的说法。
因此,Conv2D层绝对值得考虑这个应用程序!
https://stackoverflow.com/questions/55357600
复制相似问题