【问题标题】:Can we have inputs that is more than 1D in Pytorch (e.g word-embedding)我们可以在 Pytorch 中输入超过一维的输入吗(例如词嵌入)
【发布时间】:2021-07-27 21:07:45
【问题描述】:

假设我有一些文本,我想将它们分为三组food, sports, science。如果我有一个句子 I dont like to each mushrooms,我们可以使用 wordembedding(比如 100 维)为这个特定的句子创建一个 6x100 矩阵。

通常在训练神经网络时,我们的数据是二维数组,维度为n_obs x m_features

如果我想在词嵌入句子上训练神经网络(我正在使用 Pytorch),那么我们的输入是 3D n_obs x (m_sentences x k_words)

例如

#Say word-embedding is 3-dimensions
I = [1,2,3]
dont = [4,5,6]
eat = [7,8,9]
mushrooms = [10,11,12]

"I dont eat mushrooms" = [I,dont,eat,mushrooms] #First observation

当我们有 N>2 维时,最好的方法是进行某种池化,例如均值,还是我们可以使用实际的 2D 特征作为输入?

【问题讨论】:

    标签: neural-network nlp pytorch text-classification


    【解决方案1】:

    从技术上讲,输入将是一维的,但这并不重要。

    您的神经网络的内部架构将负责识别不同的单词。例如,您可以使用步长等于嵌入大小的卷积。

    您可以将 2D 输入展平为 1D,它会正常工作。这是您通常使用词嵌入的方式。

    I = [1,2,3]
    dont = [4,5,6]
    eat = [7,8,9]
    mushrooms = [10,11,12]
    
    input = np.array([I,dont,eat,mushrooms]).flatten()
    

    神经网络的输入必须始终具有相同的大小,但由于句子不同,您可能必须将句子的最大长度限制为设定的单词长度,并在结尾添加填充短句:

    I = [1,2,3]
    Am = [4,5,6]
    short = [7,8,9]
    paddingword = [1,1,1]
    
    input = np.array([I,Am,eat,short, paddingword]).flatten()
    

    您可能还想查看doc2vec from gensim,这是一种为文本制作嵌入的简单方法,然后很容易用于文本分类问题。

    【讨论】:

    • 我也想过扁平化,但是你最终得到 [1,2,3,4,5,6,7,8,9,0,0,0] (如果我们零 - pad) 例如,现在特征 1 不对应于单词 1,而是对应于第一个单词的第一个维度。那么我们不会失去每个单词的效果/上下文吗?
    • 要解决这个问题,您可以使用窗口和步幅大小等于词嵌入大小的卷积。虽然你最好只使用 gensin doc2vec
    • 啊啊啊当然!!为什么我没有想到这一点(现在我明白你在答案中的建议是什么意思了)
    猜你喜欢
    • 2019-10-23
    • 1970-01-01
    • 2020-08-30
    • 1970-01-01
    • 2020-01-01
    • 2020-07-16
    • 1970-01-01
    • 1970-01-01
    • 2020-11-20
    相关资源
    最近更新 更多