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

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

ただいまの
回答率

90.39%

  • Python

    12789questions

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

  • Python 3.x

    10678questions

    Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

  • 機械学習

    1015questions

    機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

  • Keras

    543questions

Kerasを用いた文章生成プログラムが思った通りの動作をしない

解決済

回答 1

投稿 編集

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

taka104n0

score 2

前提・実現したいこと

Kerasのサンプルコード(リンク内容)を参考にしながら漢詩を単語単位で自動生成するプログラムを作っているのですが、それを実行してもサンプルコードを実行したときと同じような動作をしません。

どのようにすればサンプルコードと同様の動作をするようになるでしょうか?詳しく教えていただきたいです。

ちなみに、ソースコード上で読み込んでいる、“quantangshi_data.txt”には以下のように合計10万字程度の漢詩のデータが入っています

暧暧去尘昏灞岸飞飞轻盖指河梁云峰衣结千重叶雪岫花开几树妆深悲黄鹤孤舟远独叹青山别路长聊将分袂沾巾泪还用持添离席觞神皋福地...

発生している問題・エラーメッセージ

実行すると以下のように表示されます。(あまりにも長いので途中で省略しています)

Using TensorFlow backend.
データ単語数: 15000
データセット総数: 14997
ベクトルに変換...
モデルの作成...
Epoch 1/3
2019-01-06 15:51:36.297132: I tensorflow/core/platform/cpu_feature_guard.cc:141] Your CPU supports instructions that this TensorFlow binary was not compiled to use: AVX2
2019-01-06 15:51:37.137953: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1432] Found device 0 with properties:
name: GeForce GTX 960M major: 5 minor: 0 memoryClockRate(GHz): 1.176
pciBusID: 0000:01:00.0
totalMemory: 2.00GiB freeMemory: 1.64GiB
2019-01-06 15:51:37.143904: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1511] Adding visible gpu devices: 0
2019-01-06 15:51:38.316119: I tensorflow/core/common_runtime/gpu/gpu_device.cc:982] Device interconnect StreamExecutor with strength 1 edge matrix:
2019-01-06 15:51:38.319944: I tensorflow/core/common_runtime/gpu/gpu_device.cc:988]      0
2019-01-06 15:51:38.321841: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1001] 0:   N
2019-01-06 15:51:38.323895: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1115] Created TensorFlow device (/job:localhost/replica:0/task:0/device:GPU:0 with 1394 MB memory) -> physical GPU (device: 0, name: GeForce GTX 960M, pci bus id: 0000:01:00.0, compute capability: 5.0)
  128/14997 [..............................] - ETA: 8:27 - loss: 9.6157
----- 生成時までに完了したEpoch数: 0
----- diversity: 0.2
----- 最初の句または単語:"照雪下玉关虏箭"
照雪下玉关虏箭白帝浪淘暖风徐籍中谁人会电跃天上桥北莫谩烟波侧空房薄暮
----- diversity: 0.5
----- 最初の句または単語:"照雪下玉关虏箭"
照雪下玉关虏箭白纻霜气今如此景福两不见和烟娇波发薄昔为绣被掩袖童稚
  256/14997 [..............................] - ETA: 4:36 - loss: 9.6155
----- 生成時までに完了したEpoch数: 1
----- diversity: 0.2
----- 最初の句または単語:"不少钱能骑骏马"
不少钱能骑骏马衔石遗星辰腰间子卿回朱轮衔红巾迁客襄王潮水白虬行人将开
----- diversity: 0.5
----- 最初の句または単語:"不少钱能骑骏马"
不少钱能骑骏马一身忆昔作天地此时箫竽衫袖一自角弓古人怨胡天燕雁协奏
C:\Users\ユーザー名\AppData\Local\conda\conda\envs\tensorflow_gpu\lib\site-packages\keras\callbacks.py:122: UserWarning: Method on_batch_end() is slow compared to the batch update (0.272442). Check your callbacks.
  % delta_t_median)
  384/14997 [..............................] - ETA: 3:15 - loss: 9.6158
----- 生成時までに完了したEpoch数: 2
----- diversity: 0.2
----- 最初の句または単語:"青蛾尚未衰莫道"
青蛾尚未衰莫道忆蛾眉十二年坐北堂学画眉不意少知音无所忧多下泪女儿六月寒似中万涂侵
----- diversity: 0.5
----- 最初の句または単語:"青蛾尚未衰莫道"
青蛾尚未衰莫道王母制北胡挝鼓须臾留腾兮在上为人子饮一杯生红纬柳叶月明刘白
C:\Users\ユーザー名\AppData\Local\conda\conda\envs\tensorflow_gpu\lib\site-packages\keras\callbacks.py:122: UserWarning: Method on_batch_end() is slow compared to the batch update (0.223871). Check your callbacks.
  % delta_t_median)
  512/14997 [>.............................] - ETA: 2:35 - loss: 9.6152
----- 生成時までに完了したEpoch数: 3
----- diversity: 0.2
----- 最初の句または単語:"钟鼓馔玉不足贵"
钟鼓馔玉不足贵游人漾春色白日服药走红鸣珂心里是时银汉低圣德远幼妹梅香
----- diversity: 0.5
----- 最初の句または単語:"钟鼓馔玉不足贵"
钟鼓馔玉不足贵春光少在人间颜色秋壁花骢独能久共笑滩急决汉红英长日冲风
C:\Users\ユーザー名\AppData\Local\conda\conda\envs\tensorflow_gpu\lib\site-packages\keras\callbacks.py:122: UserWarning: Method on_batch_end() is slow compared to the batch update (0.224871). Check your callbacks.
  % delta_t_median)

///(同様のものが何度も繰り返される)///

----- 生成時までに完了したEpoch数: 117
----- diversity: 0.2
----- 最初の句または単語:"牧马胡雏小日暮"
牧马胡雏小日暮千里千里当时杨柳当时年年将军年年少年年年年年长安
----- diversity: 0.5
----- 最初の句または単語:"牧马胡雏小日暮"
牧马胡雏小日暮千里千里芙蓉柳带杨柳生前千里凤凰少妇盛银罂谁数天子
C:\Users\ユーザー名\AppData\Local\conda\conda\envs\tensorflow_gpu\lib\site-packages\keras\callbacks.py:122: UserWarning: Method on_batch_end() is slow compared to the batch update (0.236926). Check your callbacks.
  % delta_t_median)
14997/14997 [==============================] - 41s 3ms/step - loss: 8.7363

該当のソースコード(Anaconda上で実行)

Epoch数についてですが、動作の確認のために3に設定しています。

# coding: utf-8
from keras.callbacks import LambdaCallback
from keras.models import Sequential
from keras.layers import Dense, LSTM
from keras.optimizers import RMSprop
import numpy as np
import random
import sys
import io
import gc
import os


x_exists = os.path.exists('./x')
y_exists = os.path.exists('./y')
if x_exists == True and y_exists == True:
    os.remove('./x')
    os.remove('./y')


# データの読み込み
Path = './quantangshi_data.txt'
with io.open(Path, 'r', encoding='utf-8') as f:
    text = f.read()
    chars = 35000
    rawtext = text[0:chars]


# データを2文字、2文字、3文字に分割
text = []
start = 0
end = 0
count = 1
while end <= len(rawtext):
    if count % 3 != 0:
        end += 2
        text.append(rawtext[start:end])
        start += 2
        count += 1
    else:
        end += 3
        text.append(rawtext[start:end])
        start += 3
        count += 1
text.pop()
print('データ単語数:', len(text))


del rawtext, Path
gc.collect()


words = text
word_indices = dict((w, i) for i, w in enumerate(words))    # 単語辞書を作成
indices_word = dict((i, w) for i, w in enumerate(words))    # 逆引き辞書を作成


# データセットの作成
maxlen = 3
step = 1
sentences = []
next_words = []
for i in range(0, len(text) - maxlen, step):
    sentences.append(text[i: i + maxlen])
    next_words.append(text[i + maxlen])
print('データセット総数:', len(sentences))


# ワンホット表現に変換
print('ベクトルに変換...')
mode = 'w+'
x = np.memmap('x', dtype=np.bool, mode=mode, shape=(len(sentences), maxlen, len(words)))
y = np.memmap('y', dtype=np.bool, mode=mode, shape=(len(sentences), len(words)))
for i, sentence in enumerate(sentences):
    for t, word in enumerate(sentence):
        x[i, t, word_indices[word]] = 1
    y[i, word_indices[next_words[i]]] = 1


# モデルの作成
print('モデルの作成...')
model = Sequential()
model.add(LSTM(128, input_shape=(maxlen, len(words))))
model.add(Dense(len(words), activation='softmax'))

optimizier = RMSprop(lr=0.01)
model.compile(loss='categorical_crossentropy', optimizer=optimizier)


# 各単語の出現確率の配列から、出力する単語を選んでインデックスを返す関数
def sample(preds, temperature=1.0):
    preds = np.asarray(preds).astype('float64')
    preds = np.log(preds) / temperature
    exp_preds = np.exp(preds)
    preds = exp_preds / np.sum(exp_preds)
    probas = np.random.multinomial(1, preds, 1)
    return np.argmax(probas)


# 各epochの終了時に生成された文章を表示する関数
def on_epoch_end(epoch, _):
    print()
    print('----- 生成時までに完了したEpoch数: %d' % epoch)

    start_index = random.randint(0, len(text) - maxlen - 1)
    for diversity in [0.2, 0.5]:
        print('----- diversity:', diversity)

        generated = ''
        sentence = text[start_index: start_index + maxlen]
        generated += ''.join(sentence)
        print('----- 最初の句または単語:"' + ''.join(sentence) + '"')
        sys.stdout.write(generated)

        for i in range(12):
            x_pred = np.zeros((1, maxlen, len(words)))
            for t, word in enumerate(sentence):
                x_pred[0, t, word_indices[word]] = 1.

            preds = model.predict(x_pred, verbose=0)[0]
            next_index = sample(preds, diversity)
            next_word = indices_word[next_index]

            generated += next_word
            sentence = sentence[1:]
            sentence.append(next_word)

            sys.stdout.write(next_word)
            sys.stdout.flush()
        print()


print_callback = LambdaCallback(on_batch_end=on_epoch_end)


# モデルのフィッティング
model.fit(x, y,
          batch_size=128,
          epochs=3,
          callbacks=[print_callback])
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 1

check解決した方法

0

ソースコードの136行目を以下のように変更することで想定通りの動作をしました。
どうやら打ち間違えていたようです。

print_callback = LambdaCallback(on_epoch_end=on_epoch_end)

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

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

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

  • Python

    12789questions

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

  • Python 3.x

    10678questions

    Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

  • 機械学習

    1015questions

    機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

  • Keras

    543questions