序列分类的注意机制(seq2seq tensorflow r1.1)

3

我正在尝试构建一个带有注意力机制的双向RNN,用于序列分类。我在理解辅助函数方面遇到了一些问题。我看到用于训练的辅助函数需要解码器输入,但是由于我想要从整个序列中获得单个标签,我不确定应该在这里给出什么输入。目前我已经构建了以下结构:

# Encoder LSTM cells
lstm_fw_cell = rnn.BasicLSTMCell(n_hidden)
lstm_bw_cell = rnn.BasicLSTMCell(n_hidden)

# Bidirectional RNN
outputs, states = tf.nn.bidirectional_dynamic_rnn(lstm_fw_cell,
                  lstm_bw_cell, inputs=x, 
                  sequence_length=seq_len, dtype=tf.float32)

# Concatenate forward and backward outputs
encoder_outputs = tf.concat(outputs,2)

# Decoder LSTM cell
decoder_cell = rnn.BasicLSTMCell(n_hidden)

# Attention mechanism
attention_mechanism = tf.contrib.seq2seq.LuongAttention(n_hidden, encoder_outputs)
attn_cell = tf.contrib.seq2seq.AttentionWrapper(decoder_cell, 
            attention_mechanism, attention_size=n_hidden)
            name="attention_init")

# Initial attention
attn_zero = attn_cell.zero_state(batch_size=tf.shape(x)[0], dtype=tf.float32)
init_state = attn_zero.clone(cell_state=states[0])

# Helper function
helper = tf.contrib.seq2seq.TrainingHelper(inputs = ???)

# Decoding
my_decoder = tf.contrib.seq2seq.BasicDecoder(cell=attn_cell,
             helper=helper,
             initial_state=init_state)

decoder_outputs, decoder_states = tf.contrib.seq2seq.dynamic_decode(my_decoder)

我的输入是一个序列 [批次大小,序列长度,特征数],输出是一个具有N个可能类别的单一向量 [批次大小,n_classes]。
你知道我在这里缺少什么,或者是否可以使用seq2seq进行序列分类吗?
1个回答

3
一个Seq2Seq模型从定义上来说并不适合这样的任务。正如其名称所示,它将输入序列(句子中的单词)转换为标签序列(单词的词性)。在您的情况下,您正在寻找每个样本的单个标签,而不是一系列标签。
幸运的是,您已经拥有了所需的一切,因为您只需要编码器(RNN)的输出或状态。
使用最简单的方法是使用RNN的最终状态创建分类器。在此之上添加一个形状为[n_hidden, n_classes]的全连接层。在此上可以训练一个softmax层和损失函数,以预测最终类别。
原则上,这不包括注意机制。但是,如果您想要包含其中一个,可以通过用学习向量加权RNN的每个输出,然后取总和来完成。但是,这并不能保证提高结果。有关更多参考,请参阅https://arxiv.org/pdf/1606.02601.pdf,如果我没记错的话,该论文实现了这种类型的注意机制。

我不同意seq2seq不适用于分类。在这里,它被用于分类任务:https://andriymulyar.com/blog/bert-document-classification - artona

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接