我有一千个带有相关的肯定或否定标签(相同的一千个)的复习句子(或段落),所以我正尝试使用手套词嵌入(预训练的词表示),因此下面是已确定的体系结构(很多到一个)。
通过将下面的图片视为单个评论预测,
我正在尝试将每个句子固定为最多1000个单词(时间顺序)(通过删除多余的单词或通过零向量填充)[每个单词将转换为300D数组]
但是我不知道如何在Keras或Tensorflow中实现这种架构
对于每个单元格的形状引起很多困惑,任何人都可以通过考虑具有1000个单词序列的1层LSTM(每个单词将具有300D向量/数组)来相应地解释形状(LSTM中的每个单元格)。 / p>
答案 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。