gpt4 book ai didi

python - 前馈神经网络语言模型

转载 作者:行者123 更新时间:2023-12-04 08:42:45 24 4
gpt4 key购买 nike

我目前正在尝试使用 TensorFlow 2.0 开发前馈神经网络 n-gram 语言模型。明确地说,我不希望通过循环神经网络来实现这一点,我只想使用几个 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并包含(整数)索引,因为嵌入层基本上是一个查找表(例如,在输入 '5' 上返回其权重的第五行)。
这与论文有点不同,其中输入似乎是单热编码向量。
由于嵌入层为输入中的每个整数返回一个矩阵行,因此它将输出大小为 (batch, input_length, 300) 的张量。 300 是您的嵌入大小。
您的第二层(relu 激活的 Dense)现在会将其转换为大小为 (batch, input_length, 100) 的张量,留下input_length - 尺寸完好无损。 TF-Keras 中的密集层在输入的最后一个轴上进行变换,因此在您的第一个 Dense 中是一堆大小为 1 x 1 x 300 的子张量将转换为大小 1 x 1 x 100然后沿着维度 0 和 1 连接。同样的事情会发生在你的第二个 Dense 中。
由于您不想预测上下文中的所有单词,因此您必须“摆脱”input_length尺寸。在论文中,嵌入被堆叠以产生大小为 batch x (input_length*embedding_size) 的张量。然后将其馈送到密集层。他们在第 1 页的最后一段对此进行了描述。
一个 Flatten() Embedding 和 Dense 之间的 -layer 应该在您的实现中发挥作用,因为它会压缩所有维度(批处理维度除外)。然后,第一个 Dense 会得到一个 batch x (input_length*300)张量,第二个 batch x 100 Tensor,模型会输出batch x total_words张量。
在您的实现中,我猜这应该包含每个批处理条目的一个词的单热编码。这就是他们在论文中使用的,也是分类交叉熵有意义的地方。
顺便说一句,不推荐在嵌入层中设置权重 - 您应该使用 embeddings_initializer=tf.keras.initializers.Constant(embeddings_matrix) .
编辑:进一步澄清尺寸,这不适合评论

关于python - 前馈神经网络语言模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64480794/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com