Skip to content

ClasCat® AI Research

クラスキャット – 生成 AI, AI エージェント, MCP

Menu
  • ホーム
    • ClassCat® AI Research ホーム
    • クラスキャット・ホーム
  • OpenAI API
    • OpenAI Python ライブラリ 1.x : 概要
    • OpenAI ブログ
      • GPT の紹介
      • GPT ストアの紹介
      • ChatGPT Team の紹介
    • OpenAI platform 1.x
      • Get Started : イントロダクション
      • Get Started : クイックスタート (Python)
      • Get Started : クイックスタート (Node.js)
      • Get Started : モデル
      • 機能 : 埋め込み
      • 機能 : 埋め込み (ユースケース)
      • ChatGPT : アクション – イントロダクション
      • ChatGPT : アクション – Getting started
      • ChatGPT : アクション – アクション認証
    • OpenAI ヘルプ : ChatGPT
      • ChatGPTとは何ですか?
      • ChatGPT は真実を語っていますか?
      • GPT の作成
      • GPT FAQ
      • GPT vs アシスタント
      • GPT ビルダー
    • OpenAI ヘルプ : ChatGPT > メモリ
      • FAQ
    • OpenAI ヘルプ : GPT ストア
      • 貴方の GPT をフィーチャーする
    • OpenAI Python ライブラリ 0.27 : 概要
    • OpenAI platform
      • Get Started : イントロダクション
      • Get Started : クイックスタート
      • Get Started : モデル
      • ガイド : GPT モデル
      • ガイド : 画像生成 (DALL·E)
      • ガイド : GPT-3.5 Turbo 対応 微調整
      • ガイド : 微調整 1.イントロダクション
      • ガイド : 微調整 2. データセットの準備 / ケーススタディ
      • ガイド : 埋め込み
      • ガイド : 音声テキスト変換
      • ガイド : モデレーション
      • ChatGPT プラグイン : イントロダクション
    • OpenAI Cookbook
      • 概要
      • API 使用方法 : レート制限の操作
      • API 使用方法 : tiktoken でトークンを数える方法
      • GPT : ChatGPT モデルへの入力をフォーマットする方法
      • GPT : 補完をストリームする方法
      • GPT : 大規模言語モデルを扱う方法
      • 埋め込み : 埋め込みの取得
      • GPT-3 の微調整 : 分類サンプルの微調整
      • DALL-E : DALL·E で 画像を生成して編集する方法
      • DALL·E と Segment Anything で動的マスクを作成する方法
      • Whisper プロンプティング・ガイド
  • Gemini API
    • Tutorials : クイックスタート with Python (1) テキスト-to-テキスト生成
    • (2) マルチモーダル入力 / 日本語チャット
    • (3) 埋め込みの使用
    • (4) 高度なユースケース
    • クイックスタート with Node.js
    • クイックスタート with Dart or Flutter (1) 日本語動作確認
    • Gemma
      • 概要 (README)
      • Tutorials : サンプリング
      • Tutorials : KerasNLP による Getting Started
  • Keras 3
    • 新しいマルチバックエンド Keras
    • Keras 3 について
    • Getting Started : エンジニアのための Keras 入門
    • Google Colab 上のインストールと Stable Diffusion デモ
    • コンピュータビジョン – ゼロからの画像分類
    • コンピュータビジョン – 単純な MNIST convnet
    • コンピュータビジョン – EfficientNet を使用した微調整による画像分類
    • コンピュータビジョン – Vision Transformer による画像分類
    • コンピュータビジョン – 最新の MLPモデルによる画像分類
    • コンピュータビジョン – コンパクトな畳込み Transformer
    • Keras Core
      • Keras Core 0.1
        • 新しいマルチバックエンド Keras (README)
        • Keras for TensorFlow, JAX, & PyTorch
        • 開発者ガイド : Getting started with Keras Core
        • 開発者ガイド : 関数型 API
        • 開発者ガイド : シーケンシャル・モデル
        • 開発者ガイド : サブクラス化で新しい層とモデルを作成する
        • 開発者ガイド : 独自のコールバックを書く
      • Keras Core 0.1.1 & 0.1.2 : リリースノート
      • 開発者ガイド
      • Code examples
      • Keras Stable Diffusion
        • 概要
        • 基本的な使い方 (テキスト-to-画像 / 画像-to-画像変換)
        • 混合精度のパフォーマンス
        • インペインティングの簡易アプリケーション
        • (参考) KerasCV – Stable Diffusion を使用した高性能画像生成
  • TensorFlow
    • TF 2 : 初級チュートリアル
    • TF 2 : 上級チュートリアル
    • TF 2 : ガイド
    • TF 1 : チュートリアル
    • TF 1 : ガイド
  • その他
    • 🦜️🔗 LangChain ドキュメント / ユースケース
    • Stable Diffusion WebUI
      • Google Colab で Stable Diffusion WebUI 入門
      • HuggingFace モデル / VAE の導入
      • LoRA の利用
    • Diffusion Models / 拡散モデル
  • クラスキャット
    • 会社案内
    • お問合せ
    • Facebook
    • ClassCat® Blog
Menu

TensorFlow 2.0 Beta : Tutorials : テキストとシークエンス :- 映画レビューでテキスト分類

Posted on 07/01/2019 by Sales Information

TensorFlow 2.0 Beta : Beginner Tutorials : テキストとシークエンス :- 映画レビューでテキスト分類 (翻訳/解説)

翻訳 : (株)クラスキャット セールスインフォメーション
作成日時 : 07/01/2019

* 本ページは、TensorFlow の本家サイトの TF 2.0 Beta – Beginner Tutorials – Text and sequences の以下のページを翻訳した上で
適宜、補足説明したものです:

  • Text classification with movie reviews

* サンプルコードの動作確認はしておりますが、必要な場合には適宜、追加改変しています。
* ご自由にリンクを張って頂いてかまいませんが、sales-info@classcat.com までご一報いただけると嬉しいです。

 

テキストとシークエンス :- 映画レビューでテキスト分類

このノートブックは (映画) レビューのテキストを使用して映画レビューを肯定的か否定的として分類します。これは二値 — あるいは 2 クラス — 分類の例で、重要で広く利用可能な種類の機械学習問題です。

私達は IMDB データセット を使用します、これは Internet Movie Database からの 50,000 映画レビューのテキストを含みます。これらは訓練のための 25,000 レビューとテストのための 25,000 レビューに分割されます。訓練とテストセットは均等です、つまりそれらがポジティブとネガティブ・レビューの同じ数を含むことを意味します。

この notebook は tf.keras を使用します、TensorFlow でモデルを構築して訓練するための高位 API です。tf.keras を使用したより進んだテキスト分類チュートリアルについては、MLCC テキスト分類ガイド を見てください。

from __future__ import absolute_import, division, print_function, unicode_literals

!pip install -q tensorflow==2.0.0-beta1
import tensorflow as tf
from tensorflow import keras

import numpy as np

print(tf.__version__)
2.0.0-beta1

 

IMDB データセットをダウンロードする

IMDB データセットは TensorFlow でパッケージ化されています。それは既にレビュー (単語のシークエンス) が整数のシークエンスに変換されるように前処理されていて、そこでは各整数は辞書の特定の単語を表しています。

次のコードは IMDB データセットを貴方のマシンにダウンロードします (あるいは既にそれをダウンロードしているのであればキャッシュされたコピーを使用します) :

imdb = keras.datasets.imdb

(train_data, train_labels), (test_data, test_labels) = imdb.load_data(num_words=10000)
Downloading data from https://storage.googleapis.com/tensorflow/tf-keras-datasets/imdb.npz
17465344/17464789 [==============================] - 0s 0us/step

引数 num_words=10000 は訓練データにおいて最も頻度高く出現する top 10,000 の単語を保持します。データのサイズを管理可能に保つために稀な単語は捨てられます。

 

データを調査する

データのフォーマットを理解するために少し時間をつかいましょう。データセットは前処理されています : 各サンプルは映画レビューの単語を表わす数字の配列です。各ラベルは 0 か 1 の整数値で、そこでは 0 は否定的なレビューで、1 は肯定的なレビューです。

print("Training entries: {}, labels: {}".format(len(train_data), len(train_labels)))
Training entries: 25000, labels: 25000

レビューのテキストは整数に変換され、そこでは各整数は辞書の特定の単語を表します。最初のレビューがどのように見えるかがここにあります :

print(train_data[0])
[1, 14, 22, 16, 43, 530, 973, 1622, 1385, 65, 458, 4468, 66, 3941, 4, 173, 36, 256, 5, 25, 100, 43, 838, 112, 50, 670, 2, 9, 35, 480, 284, 5, 150, 4, 172, 112, 167, 2, 336, 385, 39, 4, 172, 4536, 1111, 17, 546, 38, 13, 447, 4, 192, 50, 16, 6, 147, 2025, 19, 14, 22, 4, 1920, 4613, 469, 4, 22, 71, 87, 12, 16, 43, 530, 38, 76, 15, 13, 1247, 4, 22, 17, 515, 17, 12, 16, 626, 18, 2, 5, 62, 386, 12, 8, 316, 8, 106, 5, 4, 2223, 5244, 16, 480, 66, 3785, 33, 4, 130, 12, 16, 38, 619, 5, 25, 124, 51, 36, 135, 48, 25, 1415, 33, 6, 22, 12, 215, 28, 77, 52, 5, 14, 407, 16, 82, 2, 8, 4, 107, 117, 5952, 15, 256, 4, 2, 7, 3766, 5, 723, 36, 71, 43, 530, 476, 26, 400, 317, 46, 7, 4, 2, 1029, 13, 104, 88, 4, 381, 15, 297, 98, 32, 2071, 56, 26, 141, 6, 194, 7486, 18, 4, 226, 22, 21, 134, 476, 26, 480, 5, 144, 30, 5535, 18, 51, 36, 28, 224, 92, 25, 104, 4, 226, 65, 16, 38, 1334, 88, 12, 16, 283, 5, 16, 4472, 113, 103, 32, 15, 16, 5345, 19, 178, 32]

映画レビューは異なる長さかもしれません。下のコードは最初と 2 番目のレビューの単語の数を示します。ニューラルネットワークへの入力は同じ長さでなければなりませんので、これを後で解決する必要があります。

len(train_data[0]), len(train_data[1])
(218, 189)

 

整数を単語に変換し戻す

整数をどのようにテキストに変換し戻すかを知ることは有用かもしれません。ここで、整数から文字列へのマッピングを含む辞書オブジェクトに問い合わせるためのヘルパー関数を作成します :

# A dictionary mapping words to an integer index
word_index = imdb.get_word_index()

# The first indices are reserved
word_index = {k:(v+3) for k,v in word_index.items()}
word_index["<PAD>"] = 0
word_index["<START>"] = 1
word_index["<UNK>"] = 2  # unknown
word_index["<UNUSED>"] = 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])
Downloading data from https://storage.googleapis.com/tensorflow/tf-keras-datasets/imdb_word_index.json
1646592/1641221 [==============================] - 0s 0us/step

今では最初のレビューのテキストを表示するために decode_review 関数を使用することができます :

decode_review(train_data[0])
"<START> this film was just brilliant casting location scenery story direction everyone's really suited the part they played and you could just imagine being there robert <UNK> is an amazing actor and now the same being director <UNK> father came from the same scottish island as myself so i loved the fact there was a real connection with this film the witty remarks throughout the film were great it was just brilliant so much that i bought the film as soon as it was released for <UNK> and would recommend it to everyone to watch and the fly fishing was amazing really cried at the end it was so sad and you know what they say if you cry at a film it must have been good and this definitely was also <UNK> to the two little boy's that played the <UNK> of norman and paul they were just brilliant children are often left out of the <> list i think because the stars that play them all grown up are such a big profile for the whole film but these children are amazing and should be praised for what they have done don't you think the whole story was so lovely because it was true and was someone's life after all that was shared with us all"

 

データを準備する

レビュー — 整数の配列 — はニューラルネットワークに供給される前に tensor に変換されなければなりません。この変換は 2 つの方法で成されます :

  • 配列を単語の出現を示す 0 と 1 のベクトルに変換します、one-hot エンコーディングに類似しています。例えば、シークエンス [3, 5] は、(1 である) インデックス 3 と 5 を除いて総てゼロの 10,000 次元ベクトルになるでしょう。それから、これをネットワークの最初の層 — Dense 層 — にします、これは浮動小数点ベクトルデータを処理できます。けれども、このアプローチはメモリ集約的で、num_words * num_reviews サイズ行列を必要とします。
  • 代わりに、配列をそれらが総て同じ長さを持つようにパッドすることもできます、それから shape num_examples * max_length の整数 tensor を作成します。この shape をネットワークの最初の層として扱う埋め込み層を使用できます。

このチュートリアルでは、2 番目のアプローチを使用します。

映画レビューは同じ長さでなければならないので、長さを標準化するために pad_sequences 関数を使用します :

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

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

さてサンプルの長さを見てみましょう :

len(train_data[0]), len(train_data[1])
(256, 256)

そして (今はパッドされた) 最初のレビューを調査します :

print(train_data[0])
[   1   14   22   16   43  530  973 1622 1385   65  458 4468   66 3941
    4  173   36  256    5   25  100   43  838  112   50  670    2    9
   35  480  284    5  150    4  172  112  167    2  336  385   39    4
  172 4536 1111   17  546   38   13  447    4  192   50   16    6  147
 2025   19   14   22    4 1920 4613  469    4   22   71   87   12   16
   43  530   38   76   15   13 1247    4   22   17  515   17   12   16
  626   18    2    5   62  386   12    8  316    8  106    5    4 2223
 5244   16  480   66 3785   33    4  130   12   16   38  619    5   25
  124   51   36  135   48   25 1415   33    6   22   12  215   28   77
   52    5   14  407   16   82    2    8    4  107  117 5952   15  256
    4    2    7 3766    5  723   36   71   43  530  476   26  400  317
   46    7    4    2 1029   13  104   88    4  381   15  297   98   32
 2071   56   26  141    6  194 7486   18    4  226   22   21  134  476
   26  480    5  144   30 5535   18   51   36   28  224   92   25  104
    4  226   65   16   38 1334   88   12   16  283    5   16 4472  113
  103   32   15   16 5345   19  178   32    0    0    0    0    0    0
    0    0    0    0    0    0    0    0    0    0    0    0    0    0
    0    0    0    0    0    0    0    0    0    0    0    0    0    0
    0    0    0    0]

 

モデルを構築する

ニューラルネットワークは層をスタックすることにより作成されます — これは 2 つの主要なアーキテクチャ的な決定を必要とします :

  • モデルで幾つの層を使用するか?
  • 各層のために幾つの隠れユニットを使用するか?

このサンプルでは、入力データは単語インデックスの配列から成ります。予測するラベルは 0 か 1 です。この問題に対するモデルを構築しましょう :

# input shape is the vocabulary count used for the movie reviews (10,000 words)
vocab_size = 10000

model = keras.Sequential()
model.add(keras.layers.Embedding(vocab_size, 16))
model.add(keras.layers.GlobalAveragePooling1D())
model.add(keras.layers.Dense(16, activation='relu'))
model.add(keras.layers.Dense(1, activation='sigmoid'))

model.summary()
Model: "sequential"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
embedding (Embedding)        (None, None, 16)          160000    
_________________________________________________________________
global_average_pooling1d (Gl (None, 16)                0         
_________________________________________________________________
dense (Dense)                (None, 16)                272       
_________________________________________________________________
dense_1 (Dense)              (None, 1)                 17        
=================================================================
Total params: 160,289
Trainable params: 160,289
Non-trainable params: 0
_________________________________________________________________

分類器を構築するために層はシーケンシャルにスタックされます :

  1. 最初の層は Embedding 層です。この層は整数エンコードされた語彙を取って各単語インデックスのための埋め込みベクトルを検索します。これらのベクトルはモデルが訓練されるときに学習されます。ベクトルは出力配列に次元を追加します。結果としての次元は (batch, sequence, embedding) です。
  2. 次に、GlobalAveragePooling1D 層は各サンプルについて sequence 次元に渡り平均することにより固定長出力ベクトルを返します。これは可能な最も単純な方法でモデルが可変長の入力を扱うことを可能にします。
  3. この固定長出力ベクトルは 16 隠れユニットを持つ完全結合 (Dense) 層を通してパイプされます。
  4. 最後の層は単一の出力ノードに密に接続されています。sigmoid 活性化関数を使用し、この値は 0 と 1 の間の浮動小数点で、確率、または確信レベルを表します。

 

隠れユニット

上のモデルは入力と出力の間に、2 つの中間層あるいは「隠れ」層を持ちます。出力 (ユニット、ノード、またはニューロン) の数は層のための具象空間の次元です。換言すれば、内部表現を学習するときにネットワークが許容される自由度の総量です。

モデルがより多くの隠れユニット (より高い次元の表現空間) and/or より多くの層を持てば、ネットワークはより複雑な表現を学習できます。けれども、それはネットワークをより計算的に高価にして望まないパターンを学習することに繋がるかもしれません — このパターンは訓練データ上の性能を改善しますがテストデータ上ではそうではないものです。これは overfitting と呼ばれ、後でそれを調査します。

 

損失関数と optimizer

モデルは訓練のために損失関数と optimizer を必要とします。これは二値分類問題でモデルは確率を出力します (sigmoid 活性を持つシングルユニット層) ので、binary_crossentropy 損失関数を使用します。

これは損失関数のための唯一の選択ではありません、例えば、mean_squared_error を選択できるでしょう。しかし、一般的に、binary_crossentropy は確率を扱うためにはより良いです — それは確率分布間、あるいは私達のケースでは、正解の分布と予測の間の「距離」を測ります。

後で、回帰問題 (例えば、家の価格を予測する) を調べているときに、mean squared error と呼ばれるもう一つの損失関数をどのように使用するかを見ます。

さて、optimizer と損失関数を使用するためにモデルを configure します :

model.compile(optimizer='adam',
              loss='binary_crossentropy',
              metrics=['accuracy'])

 

検証セットを作成する

訓練時、モデルの精度をそれが前に見ていないデータ上でチェックすることを望みます。元の訓練データから 10,000 サンプルを分離することによって検証セットを作成します。(テストセットを何故今使わないのでしょう?目標は訓練データのみを用いてモデルを開発して調整することですから、テストデータは精度を評価するためだけに一度だけ使用します。)

x_val = train_data[:10000]
partial_x_train = train_data[10000:]

y_val = train_labels[:10000]
partial_y_train = train_labels[10000:]

 

モデルを訓練する

モデルを 512 サンプルのミニバッチで 40 エポック訓練します。これは x_train と y_train tensor の総てのサンプルに渡る 40 iteration (反復) です。訓練の間、検証セットからの 10,000 サンプル上でモデルの損失と精度を監視します :

history = model.fit(partial_x_train,
                    partial_y_train,
                    epochs=40,
                    batch_size=512,
                    validation_data=(x_val, y_val),
                    verbose=1)
WARNING: Logging before flag parsing goes to stderr.
W0628 04:24:41.652144 139848380724992 deprecation.py:323] From /tmpfs/src/tf_docs_env/lib/python3.5/site-packages/tensorflow/python/ops/math_grad.py:1250: add_dispatch_support..wrapper (from tensorflow.python.ops.array_ops) is deprecated and will be removed in a future version.
Instructions for updating:
Use tf.where in 2.0, which has the same broadcast rule as np.where

Train on 15000 samples, validate on 10000 samples
Epoch 1/40
15000/15000 [==============================] - 1s 72us/sample - loss: 0.6923 - accuracy: 0.5162 - val_loss: 0.6910 - val_accuracy: 0.5289
Epoch 2/40
15000/15000 [==============================] - 1s 50us/sample - loss: 0.6879 - accuracy: 0.5706 - val_loss: 0.6849 - val_accuracy: 0.5642
Epoch 3/40
15000/15000 [==============================] - 1s 49us/sample - loss: 0.6778 - accuracy: 0.6386 - val_loss: 0.6721 - val_accuracy: 0.6729
Epoch 4/40
15000/15000 [==============================] - 1s 49us/sample - loss: 0.6591 - accuracy: 0.6863 - val_loss: 0.6503 - val_accuracy: 0.7282
Epoch 5/40
15000/15000 [==============================] - 1s 50us/sample - loss: 0.6304 - accuracy: 0.7521 - val_loss: 0.6191 - val_accuracy: 0.7656
Epoch 6/40
15000/15000 [==============================] - 1s 50us/sample - loss: 0.5897 - accuracy: 0.8036 - val_loss: 0.5782 - val_accuracy: 0.7876
Epoch 7/40
15000/15000 [==============================] - 1s 50us/sample - loss: 0.5414 - accuracy: 0.8253 - val_loss: 0.5318 - val_accuracy: 0.8198
Epoch 8/40
15000/15000 [==============================] - 1s 50us/sample - loss: 0.4918 - accuracy: 0.8471 - val_loss: 0.4883 - val_accuracy: 0.8327
Epoch 9/40
15000/15000 [==============================] - 1s 50us/sample - loss: 0.4452 - accuracy: 0.8619 - val_loss: 0.4489 - val_accuracy: 0.8435
Epoch 10/40
15000/15000 [==============================] - 1s 49us/sample - loss: 0.4037 - accuracy: 0.8742 - val_loss: 0.4163 - val_accuracy: 0.8519
Epoch 11/40
15000/15000 [==============================] - 1s 49us/sample - loss: 0.3685 - accuracy: 0.8827 - val_loss: 0.3894 - val_accuracy: 0.8598
Epoch 12/40
15000/15000 [==============================] - 1s 50us/sample - loss: 0.3391 - accuracy: 0.8911 - val_loss: 0.3689 - val_accuracy: 0.8631
Epoch 13/40
15000/15000 [==============================] - 1s 49us/sample - loss: 0.3150 - accuracy: 0.8971 - val_loss: 0.3510 - val_accuracy: 0.8699
Epoch 14/40
15000/15000 [==============================] - 1s 50us/sample - loss: 0.2937 - accuracy: 0.9024 - val_loss: 0.3380 - val_accuracy: 0.8729
Epoch 15/40
15000/15000 [==============================] - 1s 50us/sample - loss: 0.2760 - accuracy: 0.9074 - val_loss: 0.3270 - val_accuracy: 0.8744
Epoch 16/40
15000/15000 [==============================] - 1s 50us/sample - loss: 0.2603 - accuracy: 0.9125 - val_loss: 0.3184 - val_accuracy: 0.8755
Epoch 17/40
15000/15000 [==============================] - 1s 52us/sample - loss: 0.2459 - accuracy: 0.9171 - val_loss: 0.3111 - val_accuracy: 0.8786
Epoch 18/40
15000/15000 [==============================] - 1s 50us/sample - loss: 0.2331 - accuracy: 0.9219 - val_loss: 0.3048 - val_accuracy: 0.8807
Epoch 19/40
15000/15000 [==============================] - 1s 50us/sample - loss: 0.2217 - accuracy: 0.9238 - val_loss: 0.2998 - val_accuracy: 0.8809
Epoch 20/40
15000/15000 [==============================] - 1s 50us/sample - loss: 0.2114 - accuracy: 0.9277 - val_loss: 0.2964 - val_accuracy: 0.8820
Epoch 21/40
15000/15000 [==============================] - 1s 51us/sample - loss: 0.2009 - accuracy: 0.9331 - val_loss: 0.2935 - val_accuracy: 0.8829
Epoch 22/40
15000/15000 [==============================] - 1s 51us/sample - loss: 0.1922 - accuracy: 0.9361 - val_loss: 0.2905 - val_accuracy: 0.8844
Epoch 23/40
15000/15000 [==============================] - 1s 50us/sample - loss: 0.1834 - accuracy: 0.9408 - val_loss: 0.2895 - val_accuracy: 0.8835
Epoch 24/40
15000/15000 [==============================] - 1s 50us/sample - loss: 0.1758 - accuracy: 0.9441 - val_loss: 0.2885 - val_accuracy: 0.8840
Epoch 25/40
15000/15000 [==============================] - 1s 50us/sample - loss: 0.1681 - accuracy: 0.9469 - val_loss: 0.2866 - val_accuracy: 0.8855
Epoch 26/40
15000/15000 [==============================] - 1s 49us/sample - loss: 0.1611 - accuracy: 0.9498 - val_loss: 0.2875 - val_accuracy: 0.8854
Epoch 27/40
15000/15000 [==============================] - 1s 49us/sample - loss: 0.1546 - accuracy: 0.9519 - val_loss: 0.2868 - val_accuracy: 0.8853
Epoch 28/40
15000/15000 [==============================] - 1s 49us/sample - loss: 0.1483 - accuracy: 0.9549 - val_loss: 0.2879 - val_accuracy: 0.8849
Epoch 29/40
15000/15000 [==============================] - 1s 49us/sample - loss: 0.1428 - accuracy: 0.9575 - val_loss: 0.2888 - val_accuracy: 0.8845
Epoch 30/40
15000/15000 [==============================] - 1s 49us/sample - loss: 0.1371 - accuracy: 0.9593 - val_loss: 0.2887 - val_accuracy: 0.8871
Epoch 31/40
15000/15000 [==============================] - 1s 51us/sample - loss: 0.1312 - accuracy: 0.9619 - val_loss: 0.2896 - val_accuracy: 0.8862
Epoch 32/40
15000/15000 [==============================] - 1s 51us/sample - loss: 0.1261 - accuracy: 0.9649 - val_loss: 0.2912 - val_accuracy: 0.8862
Epoch 33/40
15000/15000 [==============================] - 1s 50us/sample - loss: 0.1211 - accuracy: 0.9659 - val_loss: 0.2935 - val_accuracy: 0.8851
Epoch 34/40
15000/15000 [==============================] - 1s 48us/sample - loss: 0.1166 - accuracy: 0.9670 - val_loss: 0.2960 - val_accuracy: 0.8847
Epoch 35/40
15000/15000 [==============================] - 1s 49us/sample - loss: 0.1124 - accuracy: 0.9683 - val_loss: 0.2980 - val_accuracy: 0.8855
Epoch 36/40
15000/15000 [==============================] - 1s 49us/sample - loss: 0.1079 - accuracy: 0.9699 - val_loss: 0.2998 - val_accuracy: 0.8840
Epoch 37/40
15000/15000 [==============================] - 1s 49us/sample - loss: 0.1036 - accuracy: 0.9721 - val_loss: 0.3027 - val_accuracy: 0.8838
Epoch 38/40
15000/15000 [==============================] - 1s 48us/sample - loss: 0.0996 - accuracy: 0.9734 - val_loss: 0.3062 - val_accuracy: 0.8832
Epoch 39/40
15000/15000 [==============================] - 1s 48us/sample - loss: 0.0965 - accuracy: 0.9743 - val_loss: 0.3101 - val_accuracy: 0.8823
Epoch 40/40
15000/15000 [==============================] - 1s 49us/sample - loss: 0.0922 - accuracy: 0.9762 - val_loss: 0.3129 - val_accuracy: 0.8825

 

モデルを評価する

そしてモデルどのように遂行するか見ましょう。2 つの値が返されます。損失 (エラーを表わす数字です、より低ければより良いです)、そして精度です。

results = model.evaluate(test_data, test_labels)

print(results)
25000/25000 [==============================] - 1s 35us/sample - loss: 0.3338 - accuracy: 0.8712
[0.3338048003101349, 0.87124]

このかなり素朴なアプローチは約 87 % の精度を得ます。より進んだアプローチでは、モデルは 95 % に近づくはずです。

 

時間とともに精度と損失のグラフを作成する

model.fit() は History オブジェクトを返します、これは訓練の間に発生した総てを持つ辞書を含みます :

history_dict = history.history
history_dict.keys()
dict_keys(['val_loss', 'accuracy', 'val_accuracy', 'loss'])

4 つのエントリがあります: 訓練と検証の間に各々監視されたメトリックのために一つ (ずつ) です。比較のために訓練と検証精度に加えて、訓練と検証損失をプロットするためにこれらを使用することができます :

import matplotlib.pyplot as plt

acc = history_dict['accuracy']
val_acc = history_dict['val_accuracy']
loss = history_dict['loss']
val_loss = history_dict['val_loss']

epochs = range(1, len(acc) + 1)

# "bo" is for "blue dot"
plt.plot(epochs, loss, 'bo', label='Training loss')
# b is for "solid blue line"
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()
<Figure size 640x480 with 1 Axes>
plt.clf()   # clear figure

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()

このプロットでは、点線は訓練損失と精度を表し、そして実線は検証損失と精度です。

訓練損失は各エポックとともに減少して訓練精度は各エポックとともに増加することに気がつくでしょう。これは勾配降下最適化を使用するときに期待されるものです — それは総ての反復で望まれる量を最小化するはずです。

これは検証損失と精度については当てはまりません — それらは約 20 エポック後に最大になるようです。これは overfitting の例です : モデルは、それが前に決して見ていないデータ上よりも訓練データ上でより上手く遂行します。このポイント後、モデルは過剰に最適化されてテストデータに一般化されない訓練データに固有の表現を学習します。

この特定のケースのためには、単純に 20 程度のエポック後に訓練を停止することで overfitting を回避できるでしょう。後で、これを callback で自動的にどのように行なうかを見るでしょう。

 

以上



クラスキャット

最近の投稿

  • LangGraph on Colab : エージェント型 RAG
  • LangGraph : 例題 : エージェント型 RAG
  • LangGraph Platform : Get started : クイックスタート
  • LangGraph Platform : 概要
  • LangGraph : Prebuilt エージェント : ユーザインターフェイス

タグ

AutoGen (13) ClassCat Press Release (20) ClassCat TF/ONNX Hub (11) DGL 0.5 (14) Eager Execution (7) Edward (17) FLUX.1 (16) Gemini (20) HuggingFace Transformers 4.5 (10) HuggingFace Transformers 4.6 (7) HuggingFace Transformers 4.29 (9) Keras 2 Examples (98) Keras 2 Guide (16) Keras 3 (10) Keras Release Note (17) Kubeflow 1.0 (10) LangChain (45) LangGraph (22) MediaPipe 0.8 (11) Model Context Protocol (16) NNI 1.5 (16) OpenAI Agents SDK (8) OpenAI Cookbook (13) OpenAI platform (10) OpenAI platform 1.x (10) OpenAI ヘルプ (8) TensorFlow 2.0 Advanced Tutorials (33) TensorFlow 2.0 Advanced Tutorials (Alpha) (15) TensorFlow 2.0 Advanced Tutorials (Beta) (16) TensorFlow 2.0 Guide (10) TensorFlow 2.0 Guide (Alpha) (16) TensorFlow 2.0 Guide (Beta) (9) TensorFlow 2.0 Release Note (12) TensorFlow 2.0 Tutorials (20) TensorFlow 2.0 Tutorials (Alpha) (14) TensorFlow 2.0 Tutorials (Beta) (12) TensorFlow 2.4 Guide (24) TensorFlow Deploy (8) TensorFlow Get Started (7) TensorFlow Graphics (7) TensorFlow Probability (9) TensorFlow Programmer's Guide (22) TensorFlow Release Note (18) TensorFlow Tutorials (33) TF-Agents 0.4 (11)
2019年7月
月 火 水 木 金 土 日
1234567
891011121314
15161718192021
22232425262728
293031  
« 6月   8月 »
© 2025 ClasCat® AI Research | Powered by Minimalist Blog WordPress Theme