首页 > 解决方案 > LSTM / 预训练词嵌入 - 正面/负面评论预测

问题描述

我有一千个带有正面或负面标签的评论句子(或段落)(相同的一千个),所以我正在尝试使用手套词嵌入(预训练词表示),所以下面是已经确定的架构(多对一) .

通过将下图视为单个评论预测,

我正在尝试将每个句子固定为最多 1000 个单词(时间序列)(通过删除多余的单词或通过零向量填充)[每个单词将被转换为 300D 数组]

但我不知道如何在 Keras 或 Tensorflow 中实现这种架构

对每个单元的形状有很多困惑,任何人都可以通过考虑具有 1000 个单词序列的 1 层 LSTM(并且每个单词将有 300D 向量/数组)来相应地解释形状(LSTM 中的每个单元)。

在此处输入图像描述

建筑图片在此处输入图像描述

标签: pythontensorflowkerasdeep-learninglstm

解决方案


您需要为模型确定几个超参数。

因此,如果您的句子长度是固定的,则在占位符中使用 1000 ,否则使用 'None' :

sentence = tf.placeholder(shape=[None,1000],dtype=tf.int32,name='sentences')

then define labels :

labels = tf.placeholder(shape=[None,],dtype=tf.int32,name='labels')

因此,如果您的句子批次为 10,长度为 1000:

句子 = [10x1000]

现在,您可以从头开始使用 Embedding,也可以使用预训练的 Embedding。对于使用预训练嵌入,您可以定义如下变量:

Word_embedding = tf.get_variable(name="Word_embedding", 
                                 shape=[24,100], 
                                 initializer=tf.constant_initializer(np.array(load_embedding_matrix)), 
                                 trainable=False
                                )


embedding_loopup= tf.nn.embedding_lookup(Word_embedding,sentences)

嵌入查找后,您的句子将变为 [10x1000x300]

这是在 Tensorflow 中嵌入的完整详细教程。

在您必须将其提供给 LSTM 模型之后,但是由于您使用的是填充,所以您必须向 LSTM 提供序列长度,这是句子的实际长度。

sequence_leng = tf.count_nonzero(sentence,axis=-1)

现在在 LSTM 部分,您必须定义 LSTM 的 Num_units ,它们是 LSTM 单元中的节点,带有 lstm 示例的简单动态 rnn 是:

with tf.variable_scope('encoder') as scope:
    cell= tf.contrib.rnn.LSTMCell(num_units=100)
    rnn_output = tf.nn.dynamic_rnn(cell,embedding_loopup,sequence_leng,dtype=tf.float32)

现在您的 num_units 为 100,例如:

每个 time_step 输出形状将为 10x 100,包含所有时间步长形状的 rnn 的最终输出将为 10x1000x100

对于投影,您必须采用最后一个时间步输出:

transpose the output ==> 10x1000x100 to 1000x10x100 now take last timestep 10x100

投影后是 [10x100] x [hidden_​​unit x no_of categories] 假设您的类别是 2 个标签

[10x100] x [100x 2] 那么最终输出将是 10x2

从那里获取 argmax 概率指数,这将是您的预测。

现在获取 rnn 的最后一个输出,并使用没有任何激活函数的线性投影进行投影。

这是带有双向 rnn的情感教程。


推荐阅读