17 KiB
17 KiB
from torchtext.vocab import build_vocab_from_iterator
from nltk.tokenize import word_tokenize
def get_words_from_line(line):
line = line.split('\t')
left_context = line[2]
right_context = line[3]
line = ' '.join([left_context, right_context])
tokenized = word_tokenize(line)
for word in tokenized:
yield word.lower()
def get_context_from_line(line):
line = line.split('\t')
left_context = line[2]
right_context = line[3]
left_context = [cleanString(t) for t in word_tokenize(left_context)]
right_context = [cleanString(t) for t in word_tokenize(right_context)]
yield left_context[-2:] + right_context[:2]
def cleanString(value):
value = value.strip('')
value = value.strip('\n')
value = value.strip('\t')
value = value.lower()
return value
def get_word_lines_from_file(file_name):
with open(file_name, 'r') as fh:
for line in fh:
yield get_words_from_line(line)
vocab_size = 20000
vocab = build_vocab_from_iterator(
get_word_lines_from_file('dev-0/in.tsv'),
max_tokens = vocab_size,
specials = ['<unk>'])
vocab.set_default_index(vocab['<unk>'])
from torch import nn
import torch
embed_size = 100
context_size = 4
class SimpleNgramNeuralLanguageModel(nn.Module):
def __init__(self, vocabulary_size, embedding_size, context_size):
super(SimpleNgramNeuralLanguageModel, self).__init__()
self.embedding = nn.Embedding(vocabulary_size, embedding_size)
self.fn1 = nn.Linear(embedding_size * context_size, vocabulary_size)
self.fn2 = nn.Linear(vocabulary_size, vocabulary_size)
self.out = nn.Softmax(dim=0)
def forward(self, x):
x = torch.as_tensor([torch.cat((self.embedding(val[0]), self.embedding(val[1]), self.embedding(val[2]), self.embedding(val[3]))) for val in x])
x = self.fn1(x)
x = self.fn2(x)
x = self.out(x)
return x
model = SimpleNgramNeuralLanguageModel(vocab_size, embed_size, context_size)
from torch.utils.data import IterableDataset, DataLoader
class Ngrams(IterableDataset):
def __init__(self, text_file, vocabulary_size, expected_file):
self.vocab = build_vocab_from_iterator(
get_word_lines_from_file(text_file),
max_tokens = vocabulary_size,
specials = ['<unk>'])
self.vocab.set_default_index(self.vocab['<unk>'])
self.vocabulary_size = vocabulary_size
self.text_file = text_file
self.expected_file = expected_file
def __iter__(self):
with open(self.text_file, 'r') as inData:
with open(self.expected_file, 'r') as expData:
for lineIn, lineExp in zip(inData, expData):
yield torch.as_tensor([self.vocab[t] for chunk in get_context_from_line(lineIn) for t in chunk]), torch.as_tensor(self.vocab[cleanString(lineExp)])
train_dataset = Ngrams('dev-0/in.tsv', vocab_size, 'dev-0/expected.tsv')
device = 'cuda'
model = SimpleNgramNeuralLanguageModel(vocab_size, embed_size, context_size).to(device)
data = DataLoader(train_dataset, batch_size=1)
optimizer = torch.optim.Adam(model.parameters())
criterion = torch.nn.NLLLoss()
model.train()
step = 0
for x, y in data:
print(x)
print(y)
x = x.to(device)
y = y.to(device)
optimizer.zero_grad()
ypredicted = model(x)
print(ypredicted)
loss = criterion(torch.log(ypredicted), y)
if step % 100 == 0:
print(step, loss)
step += 1
loss.backward()
optimizer.step()
break
# torch.save(model.state_dict(), 'model1.bin')
#Policzmy najbardziej prawdopodobne kontynuację dla zadanego słowa:
tensor([[239, 466, 232, 1]]) tensor([2])
[0;31m---------------------------------------------------------------------------[0m [0;31mRuntimeError[0m Traceback (most recent call last) [1;32m/home/ramon/projects/retro-gap/main.ipynb Cell 4'[0m in [0;36m<cell line: 9>[0;34m()[0m [1;32m <a href='vscode-notebook-cell:/home/ramon/projects/retro-gap/main.ipynb#ch0000003?line=12'>13</a>[0m y [39m=[39m y[39m.[39mto(device) [1;32m <a href='vscode-notebook-cell:/home/ramon/projects/retro-gap/main.ipynb#ch0000003?line=13'>14</a>[0m optimizer[39m.[39mzero_grad() [0;32m---> <a href='vscode-notebook-cell:/home/ramon/projects/retro-gap/main.ipynb#ch0000003?line=14'>15</a>[0m ypredicted [39m=[39m model(x) [1;32m <a href='vscode-notebook-cell:/home/ramon/projects/retro-gap/main.ipynb#ch0000003?line=15'>16</a>[0m [39mprint[39m(ypredicted) [1;32m <a href='vscode-notebook-cell:/home/ramon/projects/retro-gap/main.ipynb#ch0000003?line=16'>17</a>[0m loss [39m=[39m criterion(torch[39m.[39mlog(ypredicted), y) File [0;32m~/.local/lib/python3.10/site-packages/torch/nn/modules/module.py:1110[0m, in [0;36mModule._call_impl[0;34m(self, *input, **kwargs)[0m [1;32m <a href='file:///home/ramon/.local/lib/python3.10/site-packages/torch/nn/modules/module.py?line=1105'>1106</a>[0m [39m# If we don't have any hooks, we want to skip the rest of the logic in[39;00m [1;32m <a href='file:///home/ramon/.local/lib/python3.10/site-packages/torch/nn/modules/module.py?line=1106'>1107</a>[0m [39m# this function, and just call forward.[39;00m [1;32m <a href='file:///home/ramon/.local/lib/python3.10/site-packages/torch/nn/modules/module.py?line=1107'>1108</a>[0m [39mif[39;00m [39mnot[39;00m ([39mself[39m[39m.[39m_backward_hooks [39mor[39;00m [39mself[39m[39m.[39m_forward_hooks [39mor[39;00m [39mself[39m[39m.[39m_forward_pre_hooks [39mor[39;00m _global_backward_hooks [1;32m <a href='file:///home/ramon/.local/lib/python3.10/site-packages/torch/nn/modules/module.py?line=1108'>1109</a>[0m [39mor[39;00m _global_forward_hooks [39mor[39;00m _global_forward_pre_hooks): [0;32m-> <a href='file:///home/ramon/.local/lib/python3.10/site-packages/torch/nn/modules/module.py?line=1109'>1110</a>[0m [39mreturn[39;00m forward_call([39m*[39;49m[39minput[39;49m, [39m*[39;49m[39m*[39;49mkwargs) [1;32m <a href='file:///home/ramon/.local/lib/python3.10/site-packages/torch/nn/modules/module.py?line=1110'>1111</a>[0m [39m# Do not call functions when jit is used[39;00m [1;32m <a href='file:///home/ramon/.local/lib/python3.10/site-packages/torch/nn/modules/module.py?line=1111'>1112</a>[0m full_backward_hooks, non_full_backward_hooks [39m=[39m [], [] [1;32m/home/ramon/projects/retro-gap/main.ipynb Cell 2'[0m in [0;36mSimpleNgramNeuralLanguageModel.forward[0;34m(self, x)[0m [1;32m <a href='vscode-notebook-cell:/home/ramon/projects/retro-gap/main.ipynb#ch0000001?line=14'>15</a>[0m [39mdef[39;00m [39mforward[39m([39mself[39m, x): [0;32m---> <a href='vscode-notebook-cell:/home/ramon/projects/retro-gap/main.ipynb#ch0000001?line=15'>16</a>[0m x [39m=[39m torch[39m.[39mas_tensor([torch[39m.[39mcat(([39mself[39m[39m.[39membedding(val[[39m0[39m]), [39mself[39m[39m.[39membedding(val[[39m1[39m]), [39mself[39m[39m.[39membedding(val[[39m2[39m]), [39mself[39m[39m.[39membedding(val[[39m3[39m]))) [39mfor[39;00m val [39min[39;00m x]) [1;32m <a href='vscode-notebook-cell:/home/ramon/projects/retro-gap/main.ipynb#ch0000001?line=16'>17</a>[0m x [39m=[39m [39mself[39m[39m.[39mfn1(x) [1;32m <a href='vscode-notebook-cell:/home/ramon/projects/retro-gap/main.ipynb#ch0000001?line=17'>18</a>[0m x [39m=[39m [39mself[39m[39m.[39mfn2(x) [1;32m/home/ramon/projects/retro-gap/main.ipynb Cell 2'[0m in [0;36m<listcomp>[0;34m(.0)[0m [1;32m <a href='vscode-notebook-cell:/home/ramon/projects/retro-gap/main.ipynb#ch0000001?line=14'>15</a>[0m [39mdef[39;00m [39mforward[39m([39mself[39m, x): [0;32m---> <a href='vscode-notebook-cell:/home/ramon/projects/retro-gap/main.ipynb#ch0000001?line=15'>16</a>[0m x [39m=[39m torch[39m.[39mas_tensor([torch[39m.[39mcat(([39mself[39;49m[39m.[39;49membedding(val[[39m0[39;49m]), [39mself[39m[39m.[39membedding(val[[39m1[39m]), [39mself[39m[39m.[39membedding(val[[39m2[39m]), [39mself[39m[39m.[39membedding(val[[39m3[39m]))) [39mfor[39;00m val [39min[39;00m x]) [1;32m <a href='vscode-notebook-cell:/home/ramon/projects/retro-gap/main.ipynb#ch0000001?line=16'>17</a>[0m x [39m=[39m [39mself[39m[39m.[39mfn1(x) [1;32m <a href='vscode-notebook-cell:/home/ramon/projects/retro-gap/main.ipynb#ch0000001?line=17'>18</a>[0m x [39m=[39m [39mself[39m[39m.[39mfn2(x) File [0;32m~/.local/lib/python3.10/site-packages/torch/nn/modules/module.py:1110[0m, in [0;36mModule._call_impl[0;34m(self, *input, **kwargs)[0m [1;32m <a href='file:///home/ramon/.local/lib/python3.10/site-packages/torch/nn/modules/module.py?line=1105'>1106</a>[0m [39m# If we don't have any hooks, we want to skip the rest of the logic in[39;00m [1;32m <a href='file:///home/ramon/.local/lib/python3.10/site-packages/torch/nn/modules/module.py?line=1106'>1107</a>[0m [39m# this function, and just call forward.[39;00m [1;32m <a href='file:///home/ramon/.local/lib/python3.10/site-packages/torch/nn/modules/module.py?line=1107'>1108</a>[0m [39mif[39;00m [39mnot[39;00m ([39mself[39m[39m.[39m_backward_hooks [39mor[39;00m [39mself[39m[39m.[39m_forward_hooks [39mor[39;00m [39mself[39m[39m.[39m_forward_pre_hooks [39mor[39;00m _global_backward_hooks [1;32m <a href='file:///home/ramon/.local/lib/python3.10/site-packages/torch/nn/modules/module.py?line=1108'>1109</a>[0m [39mor[39;00m _global_forward_hooks [39mor[39;00m _global_forward_pre_hooks): [0;32m-> <a href='file:///home/ramon/.local/lib/python3.10/site-packages/torch/nn/modules/module.py?line=1109'>1110</a>[0m [39mreturn[39;00m forward_call([39m*[39;49m[39minput[39;49m, [39m*[39;49m[39m*[39;49mkwargs) [1;32m <a href='file:///home/ramon/.local/lib/python3.10/site-packages/torch/nn/modules/module.py?line=1110'>1111</a>[0m [39m# Do not call functions when jit is used[39;00m [1;32m <a href='file:///home/ramon/.local/lib/python3.10/site-packages/torch/nn/modules/module.py?line=1111'>1112</a>[0m full_backward_hooks, non_full_backward_hooks [39m=[39m [], [] File [0;32m~/.local/lib/python3.10/site-packages/torch/nn/modules/sparse.py:158[0m, in [0;36mEmbedding.forward[0;34m(self, input)[0m [1;32m <a href='file:///home/ramon/.local/lib/python3.10/site-packages/torch/nn/modules/sparse.py?line=156'>157</a>[0m [39mdef[39;00m [39mforward[39m([39mself[39m, [39minput[39m: Tensor) [39m-[39m[39m>[39m Tensor: [0;32m--> <a href='file:///home/ramon/.local/lib/python3.10/site-packages/torch/nn/modules/sparse.py?line=157'>158</a>[0m [39mreturn[39;00m F[39m.[39;49membedding( [1;32m <a href='file:///home/ramon/.local/lib/python3.10/site-packages/torch/nn/modules/sparse.py?line=158'>159</a>[0m [39minput[39;49m, [39mself[39;49m[39m.[39;49mweight, [39mself[39;49m[39m.[39;49mpadding_idx, [39mself[39;49m[39m.[39;49mmax_norm, [1;32m <a href='file:///home/ramon/.local/lib/python3.10/site-packages/torch/nn/modules/sparse.py?line=159'>160</a>[0m [39mself[39;49m[39m.[39;49mnorm_type, [39mself[39;49m[39m.[39;49mscale_grad_by_freq, [39mself[39;49m[39m.[39;49msparse) File [0;32m~/.local/lib/python3.10/site-packages/torch/nn/functional.py:2183[0m, in [0;36membedding[0;34m(input, weight, padding_idx, max_norm, norm_type, scale_grad_by_freq, sparse)[0m [1;32m <a href='file:///home/ramon/.local/lib/python3.10/site-packages/torch/nn/functional.py?line=2176'>2177</a>[0m [39m# Note [embedding_renorm set_grad_enabled][39;00m [1;32m <a href='file:///home/ramon/.local/lib/python3.10/site-packages/torch/nn/functional.py?line=2177'>2178</a>[0m [39m# XXX: equivalent to[39;00m [1;32m <a href='file:///home/ramon/.local/lib/python3.10/site-packages/torch/nn/functional.py?line=2178'>2179</a>[0m [39m# with torch.no_grad():[39;00m [1;32m <a href='file:///home/ramon/.local/lib/python3.10/site-packages/torch/nn/functional.py?line=2179'>2180</a>[0m [39m# torch.embedding_renorm_[39;00m [1;32m <a href='file:///home/ramon/.local/lib/python3.10/site-packages/torch/nn/functional.py?line=2180'>2181</a>[0m [39m# remove once script supports set_grad_enabled[39;00m [1;32m <a href='file:///home/ramon/.local/lib/python3.10/site-packages/torch/nn/functional.py?line=2181'>2182</a>[0m _no_grad_embedding_renorm_(weight, [39minput[39m, max_norm, norm_type) [0;32m-> <a href='file:///home/ramon/.local/lib/python3.10/site-packages/torch/nn/functional.py?line=2182'>2183</a>[0m [39mreturn[39;00m torch[39m.[39;49membedding(weight, [39minput[39;49m, padding_idx, scale_grad_by_freq, sparse) [0;31mRuntimeError[0m: CUDA error: no kernel image is available for execution on the device CUDA kernel errors might be asynchronously reported at some other API call,so the stacktrace below might be incorrect. For debugging consider passing CUDA_LAUNCH_BLOCKING=1.