トップページ -> コンピュータ実習 -> Keras の体験,応用例 -> IMDB データセットを扱ってみる(Google Colab と TensorFlow, Keras を使用)
[サイトマップへ], [サイト内検索へ],

IMDB データセットを扱ってみる(Google Colab と TensorFlow, Keras を使用)

サイト構成 連絡先,業績など コンピュータ実習 データの扱い コンピュータ設定 教材(公開) サポートページ

TensorFlow

TensorFlow は,機械学習のアプリケーションを簡単に作成するのに役立つソフトウエア. Keras は,TensorFlow を用いてのディープラーニング(深層学習)でのモデルの構築と,その訓練(構築)を簡単に行えるようにするソフトウエア

このページは,https://www.tensorflow.org/tutorials/keras/basic_text_classification の手順を, 示すものである.

用語集

ニューラルネットワークのデモサイト: http://playground.tensorflow.org

Google Colab はオンラインの Python 開発環境. 使用するには Google アカウントが必要

  1. Google Colab のWebページを開く

    https://colab.research.google.com

  2. ファイル」で、「PYTHON 3 の新しいノートブックの新規作成」を選ぶ

  3. Google アカウントでログインする

  4. 「!pip install -q tf_nightly」の実行

    ※ IMDB データセットは,最新の TensorFlow 内のものを使用. このことは, https://www.tensorflow.org/tutorials/keras/basic_text_classification の記載による.

    !pip install -q tf_nightly
    

  5. パッケージのインポートなど
    from __future__ import absolute_import, division, print_function, unicode_literals
    
    # TensorFlow と tf.keras のインポート
    import tensorflow as tf
    from tensorflow import keras
    
    # ヘルパーライブラリのインポート
    import numpy as np
    import matplotlib.pyplot as plt
    
    print(tf.__version__)
    

  6. Python の配列(アレイ)と画像データセット

    (1) IMDB データセットを準備するプログラム

    変数 X_train: 25000件のデータ,批評文

    変数 y_train: 25000件のデータ,スコア

    変数 X_test: 25000件のデータ,批評文

    変数 y_test: 25000件のデータ,スコア

    imdb = keras.datasets.imdb
    (X_train, y_train), (X_test, y_test) = imdb.load_data(num_words=10000)
    

    (2) データの確認のための前準備

    # 単語を整数にマッピングする辞書
    word_index = imdb.get_word_index()
    
    # インデックスの最初の方は予約済み
    word_index = {k:(v+3) for k,v in word_index.items()}
    word_index[""] = 0
    word_index[""] = 1
    word_index[""] = 2  # unknown
    word_index[""] = 3
    
    reverse_word_index = dict([(value, key) for (key, value) in word_index.items()])
    
    def decode_review(text):
        return ' '.join([reverse_word_index.get(i, '?') for i in text])
    

    (3) データの確認

    批評文

    decode_review(X_train[0])
    

    スコア

    print(y_train[0])
    

  7. ニューラルネットワークを使うために,データを調整

    パッデングによる. 詳細は https://www.tensorflow.org/tutorials/keras/basic_text_classification に説明がある.

    X_train = keras.preprocessing.sequence.pad_sequences(X_train, value=word_index[""], padding='post', maxlen=256)
    X_test = keras.preprocessing.sequence.pad_sequences(X_test, value=word_index[""], padding='post', maxlen=256)
    

  8. ニューラルネットワークを作るプログラム(ニューラルネットワークの層の設定とコンパイル)
    # 入力の形式は映画レビューで使われている語彙数(10,000語)
    vocab_size = 10000
    
    m = keras.Sequential()
    m.add(keras.layers.Embedding(vocab_size, 16))
    m.add(keras.layers.GlobalAveragePooling1D())
    m.add(keras.layers.Dense(16, activation=tf.nn.relu))
    m.add(keras.layers.Dense(1, activation=tf.nn.sigmoid))
    m.compile(optimizer=tf.keras.optimizers.Adam(), loss='binary_crossentropy', metrics=['accuracy'])
    

  9. ニューラルネットワークの確認表示
    print(m.summary())
    

  10. ニューラルネットワークの訓練(学習)を行うプログラム

    X_train, y_train を,訓練(学習)用データ (training set) と,検証用データ (validation set) に分ける

    x_val = X_train[:10000]
    partial_x_train = X_train[10000:]
    y_val = y_train[:10000]
    partial_y_train = y_train[10000:]
    history = m.fit(partial_x_train,
                        partial_y_train,
                        epochs=40,
                        batch_size=512,
                        validation_data=(x_val, y_val),
                        verbose=1)
    

  11. テスト用データセットで評価する
    print( m.evaluate(X_test, y_test) )
    

  12. 訓練時とテスト時の,損失の違い
    import matplotlib.pyplot as plt
    
    acc = history.history['acc']
    val_acc = history.history['val_acc']
    loss = history.history['loss']
    val_loss = history.history['val_loss']
    
    epochs = range(1, len(acc) + 1)
    
    # "bo" は青いドット
    plt.plot(epochs, loss, 'bo', label='Training loss')
    # ”b" は青い実線
    plt.plot(epochs, val_loss, 'b', label='Validation loss')
    plt.title('Training and validation loss')
    plt.xlabel('Epochs')
    plt.ylabel('Loss')
    plt.legend()
    
    plt.show()
    

  13. 訓練時とテスト時の,精度の違い
    plt.clf()   # 図のクリア
    acc_values = history_dict['acc']
    val_acc_values = history_dict['val_acc']
    
    plt.plot(epochs, acc, 'bo', label='Training acc')
    plt.plot(epochs, val_acc, 'b', label='Validation acc')
    plt.title('Training and validation accuracy')
    plt.xlabel('Epochs')
    plt.ylabel('Accuracy')
    plt.legend()
    
    plt.show()
    

訓練時とテスト時で,大きく損失や精度が違っており,過学習が起きていることが確認できる