Я делаю задачу классификации последовательности, используя nn.TransformerEncoder()
.Чей конвейер похож на nn.LSTM()
.
Я попробовал несколько методов объединения временных характеристик:
Выбор конечных выходов в качестве представления всей последовательности.
Использование аффинного преобразования для объединения этих функций.
Классификация последовательности кадр за кадром, а затем выберите максимальные значения для категориився последовательность.
Но все эти 3 метода получили ужасную точность, только 25% для классификации по 4 категориям.Используя 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