1. 環境は、Window 10 Home (64bit) 上で行った。
2. Anaconda3 (64bit) – Spyder上で、動作確認を行った。
3. python の バージョンは、python 3.7.0 である。
4. pytorch の バージョンは、pytorch 0.4.1 である。
5. GPU は, NVIDIA社 の GeForce GTX 1050 である。
6. CPU は, Intel社 の Core(TM) i7-7700HQ である。
今回確認した内容は、現場で使える! PyTorch開発入門 深層学習モデルの作成とアプリケーションへの実装 (AI & TECHNOLOGY) の 5.5 Encoder-Decoderモデルによる機械翻訳 (P.135 – P.148) である。
※1. プログラムの詳細は, 書籍を参考(P.135 – P.148)にして下さい.
※2. 前回の続きで, 翻訳させる部分を確認した.
※3. ハマった箇所として, Decoderクラスで,
ValueError: First argument of _symbolic_pack_padded_sequence is expected to be a tensor, but got an object of type
といった error が出力されたが,
pad_packed_sequence と 書くべきところを, pack_padded_sequence とタイプミスしたことが原因と分かった.
※4. 以下のように, 実行完了までに, 22050秒程度かかったので, 実行される場合は, 就寝直前などが良いと思われる.
■機械翻訳の動作確認(書籍から一部抜粋・加筆).
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 |
# -*- coding: utf-8 -*- # 1. library import. from __future__ import print_function import torch from torch import nn, optim from torch.utils.data import (Dataset, DataLoader) import os, re, time, collections, itertools from tqdm import tqdm from statistics import mean ~(略)~ # 4. create Dataset Class. start = time.time() batch_size = 64 max_len = 10 folder_path = os.path.expanduser('~') folder_path = folder_path + '\\.spyder-py3\\pytorch\\translation\\' dss = [] dss.append(["Spanish:", TranslationPairDataset(folder_path + "\\spa.txt", max_len = max_len)]) dss.append(["Swedish:", TranslationPairDataset(folder_path + "\\swe.txt", max_len = max_len)]) dss.append(["German:", TranslationPairDataset(folder_path + "\\deu.txt", max_len = max_len)]) dss.append(["French:", TranslationPairDataset(folder_path + "\\fra.txt", max_len = max_len)]) dss.append(["Russian:", TranslationPairDataset(folder_path + "\\rus.txt", max_len = max_len)]) ~(略)~ # 7. declare functions to translate. def translate(input_str, ds, enc, dec, max_len = 15, device = "cpu"): ~(略)~ # 8. sample output. for ds in dss: # <class '__main__.TranslationPairDataset'> # print(type(ds[1])) enc = Encoder(len(ds[1].src_word_list), 100, 100, 2) dec = Decoder(len(ds[1].trg_word_list), 100, 100, 2) enc.to("cuda:0") dec.to("cuda:0") opt_enc = optim.Adam(enc.parameters(), 0.002) opt_dec = optim.Adam(dec.parameters(), 0.002) loss_f = nn.CrossEntropyLoss() loader = DataLoader(ds[1], batch_size = batch_size, shuffle = True, num_workers = 0) for epoch in range(31): ~(略)~ with torch.no_grad(): if epoch % 10 == 0: print('-' + str(ds[0]) + '-------------------------------------------------') print("epoch:", epoch, " mean(losses):", mean(losses)) # RuntimeError: Expected object of type torch.cuda.LongTensor # but found type torch.LongTensor for argument #3 'index' # -> 書籍通り, device="cuda:0" を指定すること. print(translate("I am a student.", ds[1], enc, dec, device="cuda:0")) print(translate("This is PyTorch practice.", ds[1], enc, dec, device="cuda:0")) # 9. display processing time. end = time.time() print('--------------------------------------------------') print('Elapsed Time: ' + str(end - start) + "[sec]") |
■実行結果(一部抜粋).
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 |
100%|██████████| 1618/1618 [01:23<00:00, 19.44it/s] -Spanish:------------------------------------------------- epoch: 0 mean(losses): 5.396342428711937 un poco . es más de la noche . 100%|██████████| 1618/1618 [01:22<00:00, 19.54it/s] ~(略)~ 100%|██████████| 1618/1618 [01:22<00:00, 19.54it/s] -Spanish:------------------------------------------------- epoch: 10 mean(losses): 0.7926316856232798 un estudiante . es considerada . 100%|██████████| 1618/1618 [01:22<00:00, 19.56it/s] ~(略)~ 100%|██████████| 1618/1618 [01:23<00:00, 20.10it/s] -Spanish:------------------------------------------------- epoch: 20 mean(losses): 0.5196756887789562 un estudiante . es inútil en la piel . 100%|██████████| 1618/1618 [01:24<00:00, 19.24it/s] ~(略)~ 100%|██████████| 1618/1618 [01:22<00:00, 20.03it/s] -Spanish:------------------------------------------------- epoch: 30 mean(losses): 0.4120407043892904 un estudiante . es imposible . 100%|██████████| 257/257 [00:09<00:00, 28.35it/s] -Swedish:------------------------------------------------- epoch: 0 mean(losses): 6.12821638537752 är . är inte att . 100%|██████████| 257/257 [00:09<00:00, 28.40it/s] ~(略)~ 100%|██████████| 257/257 [00:08<00:00, 31.00it/s] -Swedish:------------------------------------------------- epoch: 10 mean(losses): 1.8426892344589827 är en . här är det där . 100%|██████████| 257/257 [00:08<00:00, 30.27it/s] ~(略)~ 100%|██████████| 257/257 [00:08<00:00, 30.80it/s] -Swedish:------------------------------------------------- epoch: 20 mean(losses): 0.5760257180330818 är en . här är det är fantastiskt . 100%|██████████| 257/257 [00:08<00:00, 29.81it/s] ~(略)~ 100%|██████████| 257/257 [00:08<00:00, 30.30it/s] -Swedish:------------------------------------------------- epoch: 30 mean(losses): 0.2997655678352029 är en . här är det är planen . 100%|██████████| 2348/2348 [02:12<00:00, 17.67it/s] -German:------------------------------------------------- epoch: 0 mean(losses): 5.027261478429758 ist ein . ist es . 100%|██████████| 2348/2348 [02:13<00:00, 17.65it/s] ~(略)~ 100%|██████████| 2348/2348 [02:13<00:00, 17.58it/s] -German:------------------------------------------------- epoch: 10 mean(losses): 0.9117057771252205 ist student . ist es wert . 100%|██████████| 2348/2348 [02:13<00:00, 17.64it/s] ~(略)~ 100%|██████████| 2348/2348 [02:13<00:00, 17.55it/s] -German:------------------------------------------------- epoch: 20 mean(losses): 0.6697443485437706 ist student . ist das verb . 100%|██████████| 2348/2348 [02:13<00:00, 17.65it/s] ~(略)~ 100%|██████████| 2348/2348 [02:13<00:00, 17.62it/s] -German:------------------------------------------------- epoch: 30 mean(losses): 0.5699677927835227 ist student . ist das öl geworden . 100%|██████████| 2134/2134 [01:55<00:00, 18.87it/s] -French:------------------------------------------------- epoch: 0 mean(losses): 5.04731517924029 un bon . est un bon . 100%|██████████| 2134/2134 [01:54<00:00, 18.59it/s] ~(略)~ 100%|██████████| 2134/2134 [01:54<00:00, 18.21it/s] -French:------------------------------------------------- epoch: 10 mean(losses): 0.8460186128037603 étudiant . est armé . 100%|██████████| 2134/2134 [01:54<00:00, 18.69it/s] ~(略)~ 100%|██████████| 2134/2134 [01:54<00:00, 18.65it/s] -French:------------------------------------------------- epoch: 20 mean(losses): 0.5978371058822013 étudiant . est pratique de base . 100%|██████████| 2134/2134 [01:54<00:00, 18.61it/s] ~(略)~ 100%|██████████| 2134/2134 [01:54<00:00, 18.63it/s] -French:------------------------------------------------- epoch: 30 mean(losses): 0.4971667532900727 est étudiant . sont des prisons . 100%|██████████| 4760/4760 [06:08<00:00, 12.93it/s] -Russian:------------------------------------------------- epoch: 0 mean(losses): 4.048154222138789 . - это странно . 100%|██████████| 4760/4760 [06:11<00:00, 13.34it/s] ~(略)~ 100%|██████████| 4760/4760 [06:10<00:00, 12.84it/s] -Russian:------------------------------------------------- epoch: 10 mean(losses): 0.5733920362629309 студент . лёгкий . 100%|██████████| 4760/4760 [06:10<00:00, 13.61it/s] ~(略)~ 100%|██████████| 4760/4760 [06:11<00:00, 12.81it/s] -Russian:------------------------------------------------- epoch: 20 mean(losses): 0.45048556828073094 студент . лёгкий . 100%|██████████| 4760/4760 [06:12<00:00, 13.12it/s] ~(略)~ 100%|██████████| 4760/4760 [06:12<00:00, 12.76it/s] -Russian:------------------------------------------------- epoch: 30 mean(losses): 0.3992980748602823 студента . — это веселье . -------------------------------------------------- Elapsed Time: 22050.92427301407[sec] |
■実行結果(epoch 30).
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
①スペイン語("I am a student." について, 部分的に, 翻訳出来たように見える) I am a student. -> un estudiante . (※Google翻訳: "a student .") This is PyTorch practice. -> es imposible . (※Google翻訳: "it is impossible .") ②スウェーデン語(翻訳失敗に見える.) I am a student. -> är en . (※Google翻訳: "is one.") This is PyTorch practice. -> här är det är planen . (※Google翻訳: "here it is the plan.") ③ドイツ語("I am a student." について, 部分的に, 翻訳出来たように見える) I am a student. -> ist student . (※Google翻訳: "is a student.") This is PyTorch practice. -> ist das öl geworden . (※Google翻訳: "has become the oil.") ④フランス語("I am a student." について, 部分的に, 翻訳出来たように見える) I am a student. -> est étudiant . (※Google翻訳: "is a student.") This is PyTorch practice. -> sont des prisons . (※Google翻訳: "are prisons.") ⑤ロシア語("I am a student." について, 部分的に, 翻訳出来たように見える) I am a student. -> студента . (※Google翻訳: "a student.") This is PyTorch practice. -> — это веселье . (※Google翻訳: "- this is fun.") |
■参考書籍
現場で使える! PyTorch開発入門 深層学習モデルの作成とアプリケーションへの実装 (AI & TECHNOLOGY)