Почему .view() дает сбой после изменения размеров GRU?Python

Программы на Python
Ответить
Anonymous
 Почему .view() дает сбой после изменения размеров GRU?

Сообщение Anonymous »

Я пытаюсь обучить GRU на уровне символов в исходном коде ядра Linux, но цикл обучения продолжает завершать работу со сбоем из-за этой ошибки:

RuntimeError: размер представления несовместим с размером и шагом входного тензора (по крайней мере одно измерение охватывает два смежных подпространства). Вместо этого используйте .reshape(...).

Это происходит прямо во время расчета потерь. Вот код:

Код: Выделить всё

import torch
import torch.nn as nn
import torch.optim as optim
import requests

base = "[https://raw.githubusercontent.com/torvalds/linux/master/](https://raw.githubusercontent.com/torvalds/linux/master/)"
files = [
"kernel/sched/core.c",
"kernel/fork.c",
"mm/memory.c",
"fs/inode.c",
"lib/string.c",
"kernel/exit.c"
]

text = ''
for f in files:
try:
r = requests.get(base + f, timeout=10)
if r.ok:
text += r.text
except:
pass

chars = sorted(set(text))
vocab = {c: i for i, c in enumerate(chars)}
vocab_inv = {i: c for i, c in enumerate(chars)}
data = torch.tensor([vocab[c] for c in text], dtype=torch.long)

class CharGRU(nn.Module):
def __init__(self, vocab_size):
super().__init__()
self.embed = nn.Embedding(vocab_size, 256)
self.gru = nn.GRU(256, 512, 2, batch_first=True)
self.fc = nn.Linear(512, vocab_size)

def forward(self, x, h=None):
x = self.embed(x)
out, h = self.gru(x, h)
return self.fc(out), h

batch_size = 64
seq_length = 100

device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
model = CharGRU(len(chars)).to(device)
optimizer = optim.Adam(model.parameters())
criterion = nn.CrossEntropyLoss()

num_batches = len(data) // (batch_size * seq_length)
data = data[:num_batches * batch_size * seq_length].view(batch_size, -1)

for epoch in range(1, 101):
model.train()
total = 0.0
count = 0
hidden = None

for i in range(0, data.size(1) - seq_length, seq_length):
X = data[:, i:i+seq_length].to(device)
Y = data[:, i+1:i+seq_length+1].to(device)

if hidden is not None:
hidden = hidden.detach()

logits, hidden = model(X, hidden)
loss = criterion(logits.view(-1, len(chars)), Y.view(-1))

Почему .view() здесь взрывается? Я проверил фигуры, они кажутся в порядке, но PyTorch продолжает жаловаться на шаг и смежные подпространства.

Подробнее здесь: https://stackoverflow.com/questions/798 ... -for-a-gru
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»