微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

前馈神经网络语言模型

如何解决前馈神经网络语言模型

我目前正在尝试使用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

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

解决方法

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

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

您的第二层(由relu激活的Dense)现在将其转换为大小为(batch,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)

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。