質問編集履歴

2 プライバシー上

SioRyu

SioRyu score 5

2018/12/15 18:44  投稿

pythonにおけるLSTM言語モデルの作成の際、プログラムがうまく動いてくれません。
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
```
友達のも同じソースコードのはずなのですが。実行途中の表示が
![イメージ説明](a131cd46240e5e800da39bf86f303997.jpeg)
このようになるのが正しいとおもいます。
何かのバージョンが古いからうまくいかないのでしょうか?それとも何かを間違えているのでしょうか?ご指摘くださるとうれしいです。
  • Python

    12871 questions

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

  • Visual Studio

    2503 questions

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

1 タイトルの不備を訂正

SioRyu

SioRyu score 5

2018/12/15 17:34  投稿

pythonにおけるLSTMモデルの作成の際、プログラムがうまく動いてくれません。
pythonにおけるLSTM言語モデルの作成の際、プログラムがうまく動いてくれません。
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
```
友達のも同じソースコードのはずなのですが。実行途中の表示が
![イメージ説明](a131cd46240e5e800da39bf86f303997.jpeg)
このようになるのが正しいとおもいます。
何かのバージョンが古いからうまくいかないのでしょうか?それとも何かを間違えているのでしょうか?ご指摘くださるとうれしいです。
  • Python

    12871 questions

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

  • Visual Studio

    2503 questions

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

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る