AI Lab6
AI Lab6
問題 1.
(プログラム)
import requests
import torch
import torch.nn.functional as F
import nltk
import tarfile
def iwslt15(train_test):
url = "https://github.com/stefan-it/nmt-en-vi/raw/master/data/"
r = requests.get(url+train_test+"-en-vi.tgz")
filename = train_test+"-en-vi.tar.gz"
f.write(r.content)
tarfile.open(filename, 'r:gz').extractall("iwslt15")
iwslt15("train")
iwslt15("test-2013")
f = open("iwslt15/train.en")
f.close()
f = open("iwslt15/train.vi")
f.close()
f = open("iwslt15/tst2013.en")
f.close()
f = open("iwslt15/tst2013.vi")
f.close()
for i in range(10):
print(train_en[i])
print(train_vi[i])
MODELNAME = "iwslt15-en-vi-rnn.model"
EPOCH = 10
BATCHSIZE = 128
LR = 0.0001
vocab = {}
vocab[token] = 0
vocab[token] += 1
vocabidx = {}
idx = len(vocablist)
vocablist.append((token, freq))
vocabidx[token] = idx
vocabidx['<unk>'] = 0
vocabidx['<pad>'] = 1
vocabidx['<cls>'] = 2
vocabidx['<eos>'] = 3
rr = []
tkl = ['<cls>']
tkl.append('<eos>')
rr.append(tkl)
return rr
for i in range(5):
print(train_en_prep[i])
print(train_vi_prep[i])
print(test_en_prep[i])
print(train_data[i])
for i in range(5):
print(test_data[i])
bb = []
ben =[]
bvi = []
ben.append(en)
bvi.append(vi)
bb.append((ben, bvi))
ben = []
bvi = []
if len(ben) > 0:
bb.append((ben, bvi))
return bb
for i in range(5):
print(train_data[i])
def padding_batch(b):
for tkl in b:
tkl.append('<pad>')
def padding(bb):
for ben, bvi in bb:
padding_batch(ben)
padding_batch(bvi)
padding(train_data)
for i in range(3):
print(train_data[i])
ben],
vi in test_data]
for i in range(3):
print(train_data[i])
for i in range(3):
print(test_data[i])
class RNNEncDec(torch.nn.Module):
super(RNNEncDec, self).__init__()
padding_idx=vocabidx_x['<pad>'])
padding_idx=vocabidx_y['<pad>'])
x, y = x[0], x[1]
e_x = self.encemb(x)
n_x = e_x.size()[0]
h = torch.zeros(300, dtype=torch.float32).to(DEVICE)
for i in range(n_x):
h = F.relu(e_x[i] + self.encrnn(h))
e_y = self.decemb(y)
n_y = e_y.size()[0]
for i in range(n_y-1):
h = F.relu(e_y[i] + self.decrnn(h))
return loss
e_x = self.encemb(x)
n_x = e_x.size()[0]
h = torch.zeros(300, dtype=torch.float32).to(DEVICE)
for i in range(n_x):
h = F.relu(e_x[i] + self.encrnn(h))
y = torch.tensor([vocabidx_y['<cls>']]).to(DEVICE)
e_y = self.decemb(y)
pred = []
for i in range(30):
h = F.relu(e_y + self.decrnn(h))
pred_id = self.decout(h).squeeze().argmax()
if pred_id == vocabidx_y['<eos>']:
break
pred_y = vocablist_y[pred_id][0]
pred.append(pred_y)
y[0] = pred_id
e_y = self.decemb(y)
return pred
def train():
vocabidx_vi).to(DEVICE)
loss = 0
step = 0
optimizer.zero_grad()
batchloss.backward()
optimizer.step()
if step % 100 == 0:
step += 1
torch.save(model.state_dict(), MODELNAME)
def test():
total = 0
correct = 0
vocabidx_vi).to(DEVICE)
model.load_state_dict(torch.load(MODELNAME))
model.eval()
ref = []
pred = []
print("INPUT", en)
print("REF", vi)
print("MT", p)
ref.append([vi])
pred.append(p)
print("total:", len(test_data))
print("bleu:", bleu)
train()
test()
(実行結果)
問題 2.
(プログラム)
import requests
import torch
import torch.nn.functional as F
import nltk
import tarfile
def iwslt15(train_test):
url = "https://github.com/stefan-it/nmt-en-vi/raw/master/data/"
r = requests.get(url+train_test+"-en-vi.tgz")
filename = train_test+"-en-vi.tar.gz"
f.write(r.content)
tarfile.open(filename, 'r:gz').extractall("iwslt15")
iwslt15("train")
iwslt15("test-2013")
f = open("iwslt15/train.en")
f.close()
f = open("iwslt15/train.vi")
f.close()
f = open("iwslt15/tst2013.en")
f.close()
f = open("iwslt15/tst2013.vi")
f.close()
for i in range(10):
print(train_en[i])
print(train_vi[i])
MODELNAME = "iwslt15-en-vi-lstm-dropout.model"
EPOCH = 10
BATCHSIZE = 128
LR = 0.0001
vocab = {}
vocab[token] = 0
vocab[token] += 1
vocabidx = {}
idx = len(vocablist)
vocablist.append((token, freq))
vocabidx[token] = idx
vocabidx['<unk>'] = 0
vocabidx['<pad>'] = 1
vocabidx['<cls>'] = 2
vocabidx['<eos>'] = 3
rr = []
tkl = ['<cls>']
tkl.append('<eos>')
rr.append(tkl)
return rr
for i in range(5):
print(train_en_prep[i])
print(train_vi_prep[i])
print(test_en_prep[i])
for i in range(5):
print(train_data[i])
for i in range(5):
print(test_data[i])
ben =[]
bvi = []
ben.append(en)
bvi.append(vi)
bb.append((ben, bvi))
ben = []
bvi = []
if len(ben) > 0:
bb.append((ben, bvi))
return bb
for i in range(5):
print(train_data[i])
def padding_batch(b):
for tkl in b:
tkl.append('<pad>')
def padding(bb):
padding_batch(ben)
padding_batch(bvi)
padding(train_data)
for i in range(3):
print(train_data[i])
ben],
vi in test_data]
for i in range(3):
print(train_data[i])
for i in range(3):
print(test_data[i])
class LSTMEncDec(torch.nn.Module):
super(LSTMEncDec, self).__init__()
self.vocabidx_y = vocabidx_y
padding_idx=vocabidx_x['<pad>'])
padding_idx=vocabidx_y['<pad>'])
self.dropout = torch.nn.Dropout(0.5)
emb_src = self.encemb(src)
_, (h, c) = self.enc_lstm(emb_src)
emb_tgt = self.decemb(tgt)
outputs = self.dropout(outputs)
logits = self.decout(outputs)
tgt_y = tgt[1:].reshape(-1)
ignore_index=self.vocabidx_y['<pad>'])
return loss
emb_src = self.encemb(x)
_, (h, c) = self.enc_lstm(emb_src)
inputs = torch.tensor([[vocabidx_y['<cls>']]]).to(x.device)
pred = []
for _ in range(max_len):
emb = self.decemb(inputs)
output = self.dropout(output)
logits = self.decout(output.squeeze(0))
next_id = logits.argmax(dim=-1)
if next_id.item() == vocabidx_y['<eos>']:
break
pred.append(vocablist_y[next_id.item()][0])
inputs = next_id.unsqueeze(0)
return pred
def train():
vocabidx_vi).to(DEVICE)
step = 0
optimizer.zero_grad()
batchloss.backward()
optimizer.step()
if step % 100 == 0:
step += 1
torch.save(model.state_dict(), MODELNAME)
def test():
total = 0
correct = 0
vocabidx_vi).to(DEVICE)
model.load_state_dict(torch.load(MODELNAME))
model.eval()
ref = []
pred = []
print("INPUT", en)
print("REF", vi)
print("MT", p)
ref.append([vi])
pred.append(p)
print("total:", len(test_data))
print("bleu:", bleu)
train()
test()
(実行結果)