前馈神经网络语言模型

时间:2020-10-22 10:57:37

标签: python tensorflow neural-network language-model

我目前正在尝试使用TensorFlow 2.0开发前馈神经网络n元语法模型。只是要清楚一点,我不希望通过循环神经网络来实现这一点,我只是想使用一些Dense层和一个Softmax层来完成此任务。 这是我使用的参考;该模型的架构也已概述, https://www.researchgate.net/publication/301875194_Authorship_Attribution_Using_a_Neural_Network_Language_Model

但是,当我尝试执行此操作时,我一直遇到错误。下面是我的模型,

tf.keras.optimizers.Adam(learning_rate=0.01)
model = tf.keras.Sequential([
                             tf.keras.layers.Embedding(total_words, 300, weights = [embeddings_matrix], input_length=inputs.shape[1], trainable = False),
                             tf.keras.layers.Dense(100, activation = 'relu'),
                             tf.keras.layers.Dense(total_words, activation = 'softmax')
])

model.compile(loss = 'categorical_crossentropy', optimizer = 'adam', metrics = ['accuracy'])

运行此代码时,出现的错误如下,

ValueError: Shapes (None, 7493) and (None, 116, 7493) are incompatible

有人可以告诉我如何解决吗?我有些困惑。

1 个答案:

答案 0 :(得分:2)

在您链接的论文中,该小组旨在在考虑源词上下文的同时进行词对词翻译。因此,网络的输入是一堆单词-上下文。您的单词堆栈小批处理应具有batch x input_length的维数,并包含(整数)索引,因为Embedding层基本上是一个查找表(例如,在输入“ 5”上返回其权重的第五行)。 这与论文似乎有点不同,在论文中,输入似乎是单编码的矢量。

由于嵌入层为输入中的每个整数返回一个矩阵行,因此它将输出(batch, input_length, 300)大小的张量,其中300为您的嵌入大小。

您的第二层(由relu激活的Dense)现在将其转换为大小为(batch, input_length, 100)的张量,而保持input_length维度不变。 TF-Keras中的密集层在输入的最后一个轴上变换,因此在您的第一个密集中,一堆大小为1 x 1 x 300的子张量将被变换为大小为1 x 1 x 100,然后沿着尺寸连接0和1。第二个密集区中也会发生同样的事情。

由于您不想在上下文中预测所有单词,因此必须“摆脱” input_length维度。在本文中,将嵌入物堆叠起来以生成大小batch x (input_length*embedding_size)的张量,然后将其馈送到密集层。他们在第1页的最后一段中对此进行了描述。

在嵌入和密集之间的Flatten()层应该在实现中起作用,因为它将压缩所有维度(批处理维度除外)。然后,第一个Dense将获得一个batch x (input_length*300)张量,第二个Dense将获得一个batch x 100张量,模型将输出一个batch x total_words张量。

在您的实现中,我会猜测这应该为每个批处理条目包含一个单词的一次性编码。这就是他们在论文中使用的类别分类交叉熵的含义。

顺便说一句,不建议在嵌入层中设置权重-您应使用embeddings_initializer=tf.keras.initializers.Constant(embeddings_matrix)

编辑:关于尺寸的进一步说明,这不适合评论

相关问题