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

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

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

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

Python

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

受付中

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

SioRyu
SioRyu

総合スコア0

Visual Studio

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

Python

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

0回答

0評価

0クリップ

5閲覧

投稿2018/12/14 09:02

編集2022/01/12 10:55

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

# coding: utf-8 # lstmlm_trainer.py # Copyright (C) 2018 Atsumi Laboratory. All rights reserved. import chainer import chainer.functions as F import chainer.links as L from chainer import training, datasets, iterators, optimizers, reporter from chainer.training import extensions import numpy as np import os from lstmlm import LSTMLM # LSTMLM用Updaterのクラス class LSTMLMUpdater(training.StandardUpdater): def __init__(self, train_iter, optimizer, device_no): """コンストラクタ(引数はStandardUpdaterの引数) Args: train_iter (SerialIterator): 訓練用データセットのイテレータ optimizer (指定Optimizer): オプチマイザー device_no (int):GPU番号 """ super(LSTMLMUpdater, self).__init__(train_iter, optimizer, device=device_no) # def update_core(self): """ミニバッチ(文のミニバッチ)学習 """ # 累積ロスの初期化 loss = 0 # IteratorとOptimizerを取得 train_iter = self.get_iterator('main') optimizer = self.get_optimizer('main') # モデルを取得 model = optimizer.target # 文を1バッチ分取得 x = train_iter.__next__() # LSTMの状態をリセット model.reset_state() # 文の長さだけ繰り返し学習 for i in range(len(x[0])-1): # 入力データ配列作成 xarray = xp.array([s[i] for s in x], dtype=xp.int32) # 教師データ(次の文字)配列作成 t = xp.array([s[i+1] for s in x], dtype=xp.int32) # 全部が終端文字なら学習終了 if xp.min(xarray) == 1 and xp.max(xarray) == 1: break # LSTMLMを1ステップ実行 y = model(xarray) # ロス計算 loss += F.softmax_cross_entropy(y, t) # ロスをレポート reporter.report({'loss': loss}) # 勾配データをリセット optimizer.target.cleargrads() # 誤差逆伝播 loss.backward() # 重みのアップデート optimizer.update() # def read_dataset(ds_path): """データセット(コーパス)の読み込み Args: ds_path (str): データセットパス Returns: sentences (list): 文(単語IDリスト)のリスト """ #ファイルそのままドラッグすると不具合が出るので修正 if ds_path.find('"') != -1: ds_path = ds_path.strip('"') # データセットファイルをオープン f = open(ds_path, 'r', encoding='utf8') # データセットファイルから文リストの読み込み sentences = [] line = f.readline() while line: #改行で不具合が出るので修正 line = line.strip('\n') #空行で不具合が出るので修正 if not line: break # 文の開始記号を0とする s = [0] # 1行の中の単語IDを数字のリストにして追加(map:リストの各要素にintを適用, extend:sにリストの要素を追加) s.extend(list(map(int,line.split(',')))) # 最後に終端記号1を入れる s.append(1) # 文を追加 sentences.append(s) line = f.readline() f.close() return sentences # def train_lstmlm(sentences, n_units, n_epochs, batch_size, interval_of_model_snap, device_no): """LSTM言語モデルの訓練 Args: sentences (list): 文(単語IDリスト)のリスト n_units (int): LSTMのユニット数 n_epochs (int): エポック数 batch_size (int):バッチサイズ interval_of_model_snap (int): 中間モデルの保存間隔(エポック) device_no (int): GPU番号(-1はCPU) """ # 語彙数(開始記号0,終端記号1含む) n_vocab = max([max(s) for s in sentences]) + 1 # 文の最大長 s_max = max([len(s) for s in sentences]) # バッチ処理のため全ての文を同じ長さに揃える for i in range(len(sentences)): # 短い文に対して不足分を終端記号で埋める sentences[i].extend([1]*(s_max-len(sentences[i]))) # モデルの作成 model = LSTMLM(n_vocab, n_units) if device_no >= 0: model.to_gpu() # オプティマイザを選択 optimizer = optimizers.Adam() optimizer.setup(model) # 訓練用のデータセットIteratorを作成(学習をどのように繰り返すかを設定) train_iter = iterators.SerialIterator(sentences, batch_size, shuffle=False) # モデルパラメータを更新するためのUpdaterを作成 updater = LSTMLMUpdater(train_iter, optimizer, device_no=device_no) # Updaterを引数としてTrainerを作成 trainer = training.Trainer(updater, (n_epochs, 'epoch'), out="result") # Trainerエクステンション:学習の進展を表示 trainer.extend(extensions.ProgressBar(update_interval=1)) # Trainerエクステンション:ログを出力 trainer.extend(extensions.LogReport()) # Trainerエクステンション:ロスのグラフを画像として保存 if extensions.PlotReport.available(): trainer.extend(extensions.PlotReport(['loss'], x_key='epoch', file_name='loss.png')) # 初期モデルスナップ if not os.path.exists('result'): os.mkdir('result') chainer.serializers.save_npz('result/e0_model.npz', model ) # Trainerエクステンション:中間モデルスナップ trainer.extend(extensions.snapshot_object(model, filename='e{.updater.epoch}_model.npz'), trigger=(interval_of_model_snap, 'epoch')) # Trainerエクステンション:最終モデル,トレーナー,オプティマイザースナップ trainer.extend(extensions.snapshot(filename='final_e{.updater.epoch}_trainer.npz'), trigger=(n_epochs, 'epoch')) trainer.extend(extensions.snapshot_object(model, filename='final_e{.updater.epoch}_model.npz'), trigger=(n_epochs, 'epoch')) trainer.extend(extensions.snapshot_object(optimizer, filename='final_e{.updater.epoch}_optimizer.npz'), trigger=(n_epochs, 'epoch')) # 訓練実行 trainer.run() # if __name__ == '__main__': # GPU番号指定(CPUのみ使用の場合は-1) device_no = 0 # GPUGPU使用時とCPU使用時で必要な設定 if device_no >= 0: import cupy as xp chainer.cuda.get_device_from_id(0).use() chainer.cuda.check_cuda_available() else: xp = np # LSTMのユニット数 num_of_units = 200 # エポック数 num_of_epochs = 100 # バッチサイズ batch_size = 10 # 中間モデルの保存間隔 interval_of_model_snap = 10 # 訓練用コーパスの読み込み ds_path = input('Input a training corpus (wakati sentences represented by word IDs) path < ') sentences = read_dataset(ds_path) # 訓練 train_lstmlm(sentences, num_of_units, num_of_epochs, batch_size, interval_of_model_snap, device_no)

lstmlmのプログラムと

python

# coding: utf-8 # lstmlm.py # Copyright (C) 2018 Atsumi Laboratory. All rights reserved. import chainer import chainer.links as L # LSTM Language Modelクラス class LSTMLM(chainer.Chain): def __init__(self, n_vocab, n_units): """コンストラクタ(LSTMLMネットワークのリンクの定義) Args: n_vocab (int): 埋め込み語彙数 n_units (int): 隠れユニット数 """ super(LSTMLM, self).__init__() with self.init_scope(): self.embed = L.EmbedID(n_vocab, n_units) self.lstm1 = L.LSTM(n_units, n_units) self.lstm2 = L.LSTM(n_units, n_units) self.decode = L.Linear(n_units, n_vocab) # def reset_state(self): """LSTMの状態のリセット """ self.lstm1.reset_state() self.lstm2.reset_state() # def __call__(self, x): """順伝播 Args: x (array): 入力単語One-hotベクトルアレイ Returns: y (array): 出力値アレイ """ h0 = self.embed(x) h1 = self.lstm1(h0) h2 = self.lstm2(h1) y = self.decode(h2) return y

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

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

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

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

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

同じタグがついた質問を見る

Visual Studio

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

Python

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