LSTM /预训练词嵌入-正面/负面评论预测

时间:2018-08-16 22:30:33

标签: python tensorflow keras deep-learning lstm

我有一千个带有相关的肯定或否定标签(相同的一千个)的复习句子(或段落),所以我正尝试使用手套词嵌入(预训练的词表示),因此下面是已确定的体系结构(很多到一个)。

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

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

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

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

enter image description here

建筑图片enter image description here

1 个答案:

答案 0 :(得分:2)

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

因此,如果您的句子长度固定,请在占位符中使用1000,否则使用“无”:

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]

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

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]

这里是full detailed tutorial的Tensorflow嵌入。

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

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 [隐藏单元x类别数]   假设您的类别是2个标签

     

[10x100] x [100x 2],则最终输出将为10x2

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

现在获取rnn的最后输出,并使用线性投影进行投影,而无需任何激活功能。

这里是sentiment tutorial,具有双向rnn。