我正在使用nn.TransformerEncoder()
执行序列分类任务。谁的管道类似于nn.LSTM()
。
我尝试了几种时间特征融合方法:
选择最终输出作为整个序列的表示。
使用仿射变换融合这些功能。
逐帧对序列进行分类,然后选择最大值作为整个序列的类别。
但是,所有这三种方法的准确性都非常差,只有4种类别的分类准确率只有[25%]。在将nn.LSTM与最后一个隐藏状态一起使用时,我可以轻松实现83%精度。我尝试了很多nn.TransformerEncoder()
的超参数,但准确性没有任何改善。我现在不知道如何调整此模型。你能给我一些实用的建议吗?谢谢。
对于LSTM
:forward()
为:
def forward(self, x_in, x_lengths, apply_softmax=False):
# Embed
x_in = self.embeddings(x_in)
# Feed into RNN
out, h_n = self.LSTM(x_in) #shape of out: T*N*D
# Gather the last relevant hidden state
out = out[-1,:,:] # N*D
# FC layers
z = self.dropout(out)
z = self.fc1(z)
z = self.dropout(z)
y_pred = self.fc2(z)
if apply_softmax:
y_pred = F.softmax(y_pred, dim=1)
return y_pred
对于transformer
:
def forward(self, x_in, x_lengths, apply_softmax=False):
# Embed
x_in = self.embeddings(x_in)
# Feed into RNN
out = self.transformer(x_in)#shape of out T*N*D
# Gather the last relevant hidden state
out = out[-1,:,:] # N*D
# FC layers
z = self.dropout(out)
z = self.fc1(z)
z = self.dropout(z)
y_pred = self.fc2(z)
if apply_softmax:
y_pred = F.softmax(y_pred, dim=1)
return y_pred
我正在使用nn.TransformerEncoder()执行序列分类任务。谁的管道类似于nn.LSTM()。我尝试了几种时间特征融合方法:选择最终输出为...