Я пытаюсь обучить 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 продолжает жаловаться на шаг и смежные подпространства.
Я пытаюсь обучить GRU на уровне символов в исходном коде ядра Linux, но цикл обучения продолжает завершать работу со сбоем из-за этой ошибки:
RuntimeError: размер представления несовместим с размером и шагом входного тензора (по крайней мере одно измерение охватывает два смежных подпространства). Вместо этого используйте .reshape(...).
Это происходит прямо во время расчета потерь. Вот код: [code]import torch import torch.nn as nn import torch.optim as optim import requests
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)