Как я могу реализовать несколько скрытых слоев в RNN (PyTorch)? - PullRequest
0 голосов
/ 17 января 2019

My Pytorch RNN для классификации имен не позволяет мне выбирать несколько скрытых слоев. Если я выберу более одного слоя, я получаю следующее сообщение об ошибке:

Traceback (последний вызов был последним): файл "TRAIN2.py", строка 63,

строка 104, в процессе обучения: y_hat = y_hat.view (batch_size, n_categories) RuntimeError: фигура '[26718, 6]' недопустима для ввода размера 320616

Я не знаю точно, в чем проблема, но входной размер удваивается, когда я выбираю 2 слоя, утраиваем 3 слоя и т. Д. Мой выходной размер равен 6, и когда я выбираю 1 слой, он работает, но с двумя Слоев там вдвое больше, и я получаю ошибку, а с 3 слоями в 3 раза больше входов. Разве размер ввода не должен оставаться неизменным независимо от количества слоев?

Я прикрепляю основной файл (где ошибка появляется при вычислении потерь) и мою сетевую архитектуру.

for epoch in range(start_epoch, epochs):

   for batch_number, (x_batch, y_batch) in enumerate(batches):

      # Initialise the hidden layer
      hidden = model.initialise_hidden(batch_size=batch_size)

      if torch.cuda.is_available():
        x_batch = x_batch.to(device)
        y_batch = y_batch.to(device)

      # Model
      y_hat = rnn_gru(x_batch)

      # Loss
      y_hat = y_hat.view(batch_size, n_categories)
      loss = criterion(y_hat, y_batch)
      current_loss = current_loss + loss.item()

      # Restore Gradients
      optimizer.zero_grad()

      # Backward
      loss.backward()

      # Step
      optimizer.step()

А это моя модель

class RNN_GRU(nn.Module):

  # input_size = Vocabulary size
  # hidden_size = Size of the hidden "units" in the GRU's
  # n_layers -> Connections between the GRU's
  # dropout -> fraction of nodes to be shut down

  def __init__(self, input_size, embedding_size, hidden_size, output_size, n_layers, dropout):
    super(RNN_GRU, self).__init__()

    # Members
    self.n_layers = n_layers
    self.hidden_size = hidden_size

    # 1) Embedding
    self.embedding = nn.Embedding(num_embeddings=input_size, embedding_dim=embedding_size)

    # 2) Packing
    #self.pack = nn.utils.rnn.pack_padded_sequence(batch_first=False)

    # 3) GRU
    self.gru = nn.GRU(input_size=embedding_size, hidden_size=hidden_size, num_layers=n_layers, bias=True, batch_first=False, dropout=dropout, bidirectional=False)

    # 4) Linear
    self.linear = nn.Linear(in_features=hidden_size, out_features=output_size, bias=True)

  def forward(self, x):

    # X -> [batch_size, n]
    #     [x11, x12, x13, ..., x1n1]
    # X:  [x21, x22, x23, ..., x2n2]
    #     [x31, x32, x33, ..., x3n3]
    # xYZ -> Name Y, character Z code
    # nY -> Length (num chars) of name Y. n1, n2, n3, ..., can be different (if no padding)

    batch_size = x.size(0)

    # 0.1) From the input name, get the embedding vector (for dimension requirements, it has to be transposed)
    input = self.embedding(x.t())

Я знаю, что использование нескольких слоев, вероятно, не увеличивает производительность, но я хочу использовать ненулевую частоту выпадения, для которой мне говорят, что она активна только на всех слоях, но на последнем и поэтому имеет только 1 слой бесполезно ...

Заранее благодарю за помощь.

...