Как встроить последовательность предложений в RNN? - PullRequest
3 голосов
/ 12 февраля 2020

Я пытаюсь создать модель RNN (в Pytorch), которая берет пару предложений и затем классифицирует ее как Класс 0 или Класс 1 .

Ради этого вопроса давайте предположим, что max_len предложения равен 4, а max_amount временных шагов равно 5. Таким образом, каждая точка данных находится в форме (0 - это значение, которое используется для заполнения дополненного значения):

    x[1] = [
    # Input features at timestep 1
    [1, 48, 91, 0],
    # Input features at timestep 2
    [20, 5, 17, 32],
    # Input features at timestep 3
    [12, 18, 0, 0],
    # Input features at timestep 4
    [0, 0, 0, 0],
    # Input features at timestep 5
    [0, 0, 0, 0]
    ]
    y[1] = [1]

Когда у меня есть только одно предложение на цель : я просто передаю каждое слово в слой внедрения, а затем в LSTM или GRU, но я немного застрял что делать, когда у меня есть последовательность предложений на цель ?

Как создать вложение, которое может обрабатывать предложения?

1 Ответ

2 голосов
/ 12 февраля 2020

Самый простой способ - использовать 2 вида LSTM.

Подготовить набор данных для игрушек

xi = [
# Input features at timestep 1
[1, 48, 91, 0],
# Input features at timestep 2
[20, 5, 17, 32],
# Input features at timestep 3
[12, 18, 0, 0],
# Input features at timestep 4
[0, 0, 0, 0],
# Input features at timestep 5
[0, 0, 0, 0]
]
yi = 1

x = torch.tensor([xi, xi])
y = torch.tensor([yi, yi])

print(x.shape)
# torch.Size([2, 5, 4])

print(y.shape)
# torch.Size([2])

Тогда x - это партия входов. Здесь batch_size = 2.

Вставить ввод

vocab_size = 1000
embed_size = 100
hidden_size = 200
embed = nn.Embedding(vocab_size, embed_size)

# shape [2, 5, 4, 100]
x = embed(x)

Первое слово-LSTM - это кодирование каждой последовательности в вектор

# convert x into a batch of sequences
# Reshape into [2, 20, 100]
x = x.view(bs * 5, 4, 100)

wlstm = nn.LSTM(embed_size, hidden_size, batch_first=True)
# get the only final hidden state of each sequence

_, (hn, _) = wlstm(x)

# hn shape [1, 10, 200]

# get the output of final layer
hn = hn[0] # [10, 200]

Второй результат -LSTM - кодировать последовательности в один вектор

# Reshape hn into [bs, num_seq, hidden_size]
hn = hn.view(2, 5, 200)

# Pass to another LSTM and get the final state hn
slstm = nn.LSTM(hidden_size, hidden_size, batch_first=True)
_, (hn, _) = slstm(hn) # [1, 2, 200]

# Similarly, get the hidden state of the last layer
hn = hn[0] # [2, 200]

Добавить несколько слоев классификации

pred_linear = nn.Linear(hidden_size, 1)

# [2, 1]
output = torch.sigmoid(pred_linear(hn))

...