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 слой бесполезно ...
Заранее благодарю за помощь.