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

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

ただいまの
回答率

90.45%

  • Python

    12364questions

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

  • Visual Studio

    2434questions

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

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

受付中

回答 0

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 321

SioRyu

score 5

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) で終了しました。

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

# coding: utf-8
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のプログラムと

# coding: utf-8
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ページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

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

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

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

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

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

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

  • ただいまの回答率 90.45%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

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

  • Python

    12364questions

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

  • Visual Studio

    2434questions

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