質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

0回答

244閲覧

pythonにおけるLSTM言語モデルの作成の際、プログラムがうまく動いてくれません。

SioRyu

総合スコア28

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2018/12/14 09:02

編集2018/12/15 09:44

pythonでLSTM言語モデルを作成したいのですが、なぜかプログラムがうまく動いでくれません。友達と全く同じプログラムを使用しているのですが、自分のだけがうまく動かず。

実行結果

total [#####.............................................] 10.00%
this epoch [..................................................] 0.00%
1 iter, 1 epoch / 100 epochs
inf iters/sec. Estimated time to finish: 0:00:00.
total [##########........................................] 20.00%
this epoch [..................................................] 0.00%
2 iter, 2 epoch / 100 epochs
1.4468 iters/sec. Estimated time to finish: 0:00:05.529369.
total [###############...................................] 30.00%
this epoch [..................................................] 0.00%
3 iter, 3 epoch / 100 epochs
1.7996 iters/sec. Estimated time to finish: 0:00:03.889694.
total [####################..............................] 40.00%
this epoch [..................................................] 0.00%
4 iter, 4 epoch / 100 epochs
1.9458 iters/sec. Estimated time to finish: 0:00:03.083603.
total [#########################.........................] 50.00%
this epoch [..................................................] 0.00%
5 iter, 5 epoch / 100 epochs
2.0332 iters/sec. Estimated time to finish: 0:00:02.459158.
total [##############################....................] 60.00%
this epoch [..................................................] 0.00%
6 iter, 6 epoch / 100 epochs
2.077 iters/sec. Estimated time to finish: 0:00:01.925839.
total [###################################...............] 70.00%
this epoch [..................................................] 0.00%
7 iter, 7 epoch / 100 epochs
2.1166 iters/sec. Estimated time to finish: 0:00:01.417369.
total [########################################..........] 80.00%
this epoch [..................................................] 0.00%
8 iter, 8 epoch / 100 epochs
2.1533 iters/sec. Estimated time to finish: 0:00:00.928817.
total [#############################################.....] 90.00%
this epoch [..................................................] 0.00%
9 iter, 9 epoch / 100 epochs
2.1796 iters/sec. Estimated time to finish: 0:00:00.458808.
total [##################################################] 100.00%
this epoch [..................................................] 0.00%
10 iter, 10 epoch / 100 epochs
2.1963 iters/sec. Estimated time to finish: 0:00:00.
プログラム 'python.exe' はコード 0 (0x0) で終了しました。

このように言語モデルの作成がうまくいきません。どのように直せばいいのでしょうか?
トレーナープログラム:

python

1# coding: utf-8 2import chainer 3import chainer.functions as F 4import chainer.links as L 5from chainer import training, datasets, iterators, optimizers, reporter 6from chainer.training import extensions 7import numpy as np 8import os 9from lstmlm import LSTMLM 10 11# LSTMLM用Updaterのクラス 12class LSTMLMUpdater(training.StandardUpdater): 13 def __init__(self, train_iter, optimizer, device_no): 14 """コンストラクタ(引数はStandardUpdaterの引数) 15 Args: 16 train_iter (SerialIterator): 訓練用データセットのイテレータ 17 optimizer (指定Optimizer): オプチマイザー 18 device_no (int):GPU番号 19 """ 20 super(LSTMLMUpdater, self).__init__(train_iter, optimizer, device=device_no) 21 22 # 23 def update_core(self): 24 """ミニバッチ(文のミニバッチ)学習 25 """ 26 # 累積ロスの初期化 27 loss = 0 28 29 # IteratorとOptimizerを取得 30 train_iter = self.get_iterator('main') 31 optimizer = self.get_optimizer('main') 32 # モデルを取得 33 model = optimizer.target 34 35 # 文を1バッチ分取得 36 x = train_iter.__next__() 37 38 # LSTMの状態をリセット 39 model.reset_state() 40 41 # 文の長さだけ繰り返し学習 42 for i in range(len(x[0])-1): 43 # 入力データ配列作成 44 xarray = xp.array([s[i] for s in x], dtype=xp.int32) 45 # 教師データ(次の文字)配列作成 46 t = xp.array([s[i+1] for s in x], dtype=xp.int32) 47 # 全部が終端文字なら学習終了 48 if xp.min(xarray) == 1 and xp.max(xarray) == 1: 49 break 50 # LSTMLMを1ステップ実行 51 y = model(xarray) 52 # ロス計算 53 loss += F.softmax_cross_entropy(y, t) 54 # ロスをレポート 55 reporter.report({'loss': loss}) 56 # 勾配データをリセット 57 optimizer.target.cleargrads() 58 # 誤差逆伝播 59 loss.backward() 60 # 重みのアップデート 61 optimizer.update() 62# 63def read_dataset(ds_path): 64 """データセット(コーパス)の読み込み 65 Args: 66 ds_path (str): データセットパス 67 Returns: 68 sentences (list): 文(単語IDリスト)のリスト 69 """ 70 71 #ファイルそのままドラッグすると不具合が出るので修正 72 if ds_path.find('"') != -1: 73 ds_path = ds_path.strip('"') 74 # データセットファイルをオープン 75 f = open(ds_path, 'r', encoding='utf8') 76 # データセットファイルから文リストの読み込み 77 sentences = [] 78 line = f.readline() 79 while line: 80 #改行で不具合が出るので修正 81 line = line.strip('\n') 82 #空行で不具合が出るので修正 83 if not line: 84 break 85 # 文の開始記号を0とする 86 s = [0] 87 # 1行の中の単語IDを数字のリストにして追加(map:リストの各要素にintを適用, extend:sにリストの要素を追加) 88 s.extend(list(map(int,line.split(',')))) 89 # 最後に終端記号1を入れる 90 s.append(1) 91 # 文を追加 92 sentences.append(s) 93 line = f.readline() 94 f.close() 95 return sentences 96# 97def train_lstmlm(sentences, n_units, n_epochs, batch_size, interval_of_model_snap, device_no): 98 """LSTM言語モデルの訓練 99 Args: 100 sentences (list): 文(単語IDリスト)のリスト 101 n_units (int): LSTMのユニット数 102 n_epochs (int): エポック数 103 batch_size (int):バッチサイズ 104 interval_of_model_snap (int): 中間モデルの保存間隔(エポック) 105 device_no (int): GPU番号(-1はCPU) 106 """ 107 # 語彙数(開始記号0,終端記号1含む) 108 n_vocab = max([max(s) for s in sentences]) + 1 109 # 文の最大長 110 s_max = max([len(s) for s in sentences]) 111 # バッチ処理のため全ての文を同じ長さに揃える 112 for i in range(len(sentences)): 113 # 短い文に対して不足分を終端記号で埋める 114 sentences[i].extend([1]*(s_max-len(sentences[i]))) 115 116 # モデルの作成 117 model = LSTMLM(n_vocab, n_units) 118 if device_no >= 0: 119 model.to_gpu() 120 121 # オプティマイザを選択 122 optimizer = optimizers.Adam() 123 optimizer.setup(model) 124 125 # 訓練用のデータセットIteratorを作成(学習をどのように繰り返すかを設定) 126 train_iter = iterators.SerialIterator(sentences, batch_size, shuffle=False) 127 128 # モデルパラメータを更新するためのUpdaterを作成 129 updater = LSTMLMUpdater(train_iter, optimizer, device_no=device_no) 130 # Updaterを引数としてTrainerを作成 131 trainer = training.Trainer(updater, (n_epochs, 'epoch'), out="result") 132 # Trainerエクステンション:学習の進展を表示 133 trainer.extend(extensions.ProgressBar(update_interval=1)) 134 # Trainerエクステンション:ログを出力 135 trainer.extend(extensions.LogReport()) 136 # Trainerエクステンション:ロスのグラフを画像として保存 137 if extensions.PlotReport.available(): 138 trainer.extend(extensions.PlotReport(['loss'], x_key='epoch', file_name='loss.png')) 139 # 初期モデルスナップ 140 if not os.path.exists('result'): 141 os.mkdir('result') 142 chainer.serializers.save_npz('result/e0_model.npz', model ) 143 # Trainerエクステンション:中間モデルスナップ 144 trainer.extend(extensions.snapshot_object(model, filename='e{.updater.epoch}_model.npz'), trigger=(interval_of_model_snap, 'epoch')) 145 # Trainerエクステンション:最終モデル,トレーナー,オプティマイザースナップ 146 trainer.extend(extensions.snapshot(filename='final_e{.updater.epoch}_trainer.npz'), trigger=(n_epochs, 'epoch')) 147 trainer.extend(extensions.snapshot_object(model, filename='final_e{.updater.epoch}_model.npz'), trigger=(n_epochs, 'epoch')) 148 trainer.extend(extensions.snapshot_object(optimizer, filename='final_e{.updater.epoch}_optimizer.npz'), trigger=(n_epochs, 'epoch')) 149 150 # 訓練実行 151 trainer.run() 152# 153if __name__ == '__main__': 154 # GPU番号指定(CPUのみ使用の場合は-1) 155 device_no = 0 156 # GPUGPU使用時とCPU使用時で必要な設定 157 if device_no >= 0: 158 import cupy as xp 159 chainer.cuda.get_device_from_id(0).use() 160 chainer.cuda.check_cuda_available() 161 else: 162 xp = np 163 # LSTMのユニット数 164 num_of_units = 200 165 # エポック数 166 num_of_epochs = 100 167 # バッチサイズ 168 batch_size = 10 169 # 中間モデルの保存間隔 170 interval_of_model_snap = 10 171 # 訓練用コーパスの読み込み 172 ds_path = input('Input a training corpus (wakati sentences represented by word IDs) path < ') 173 sentences = read_dataset(ds_path) 174 # 訓練 175 train_lstmlm(sentences, num_of_units, num_of_epochs, batch_size, interval_of_model_snap, device_no)

lstmlmのプログラムと

python

1# coding: utf-8 2import chainer 3import chainer.links as L 4 5# LSTM Language Modelクラス 6class LSTMLM(chainer.Chain): 7 def __init__(self, n_vocab, n_units): 8 """コンストラクタ(LSTMLMネットワークのリンクの定義) 9 Args: 10 n_vocab (int): 埋め込み語彙数 11 n_units (int): 隠れユニット数 12 """ 13 super(LSTMLM, self).__init__() 14 with self.init_scope(): 15 self.embed = L.EmbedID(n_vocab, n_units) 16 self.lstm1 = L.LSTM(n_units, n_units) 17 self.lstm2 = L.LSTM(n_units, n_units) 18 self.decode = L.Linear(n_units, n_vocab) 19 # 20 def reset_state(self): 21 """LSTMの状態のリセット 22 """ 23 self.lstm1.reset_state() 24 self.lstm2.reset_state() 25 # 26 def __call__(self, x): 27 """順伝播 28 Args: 29 x (array): 入力単語One-hotベクトルアレイ 30 Returns: 31 y (array): 出力値アレイ 32 """ 33 h0 = self.embed(x) 34 h1 = self.lstm1(h0) 35 h2 = self.lstm2(h1) 36 y = self.decode(h2) 37 return y 38

友達のも同じソースコードのはずなのですが。実行途中の表示が
イメージ説明
このようになるのが正しいとおもいます。
何かのバージョンが古いからうまくいかないのでしょうか?それとも何かを間違えているのでしょうか?ご指摘くださるとうれしいです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問