言語処理100本ノック 2020 (Rev2)の「第8章: ニューラルネット」の74本目「正解率の計測」記録です。前回ノックに追加して、学習データと評価データに対する正解率を求めます。keras
使えば超楽勝です。
記事「まとめ: 言語処理100本ノックで学べることと成果」に言語処理100本ノック 2015についてはまとめていますが、追加で差分の言語処理100本ノック 2020 (Rev2)についても更新します。
参考リンク
リンク | 備考 |
---|---|
74_正解率の計測.ipynb | 回答プログラムのGitHubリンク |
言語処理100本ノック 2020 第8章: ニューラルネット | (PyTorchだけど)解き方の参考 |
【言語処理100本ノック 2020】第8章: ニューラルネット | (PyTorchだけど)解き方の参考 |
まとめ: 言語処理100本ノックで学べることと成果 | 言語処理100本ノックまとめ記事 |
【Keras入門(4)】Kerasの評価関数(Metrics)」 | kerasの評価関数使い方 |
環境
後々GPUを使わないと厳しいので、Goolge Colaboratory使いました。Pythonやそのパッケージでより新しいバージョンありますが、新機能使っていないので、プリインストールされているものをそのまま使っています。
種類 | バージョン | 内容 |
---|---|---|
Python | 3.7.12 | Google Colaboratoryのバージョン |
2.0.3 | Google Driveのマウントに使用 | |
tensorflow | 2.6.0 | ディープラーニングの主要処理 |
第8章: ニューラルネット
学習内容
深層学習フレームワークの使い方を学び,ニューラルネットワークに基づくカテゴリ分類を実装します.
ノック内容
第6章で取り組んだニュース記事のカテゴリ分類を題材として,ニューラルネットワークでカテゴリ分類モデルを実装する.なお,この章ではPyTorch, TensorFlow, Chainerなどの機械学習プラットフォームを活用せよ.
74. 正解率の計測
問題73で求めた行列を用いて学習データおよび評価データの事例を分類したとき,その正解率をそれぞれ求めよ.
回答
回答結果
学習データに対する正解率が0.8460。4値分類なので、悪くはないですね。
167/167 [==============================] - 2s 8ms/step - loss: 0.4576 - acc: 0.8460
[0.4576301872730255, 0.8460314273834229]
評価データに対する正解率が0.8488。
21/21 [==============================] - 0s 5ms/step - loss: 0.4579 - acc: 0.8488
[0.4579184055328369, 0.848802387714386]
回答プログラム 74_正解率の計測.ipynb
GitHubには確認用コードも含めていますが、ここには必要なものだけ載せています。
import tensorflow as tf
from google.colab import drive
drive.mount('/content/drive')
def _parse_function(example_proto):
# 特徴の記述
feature_description = {
'title': tf.io.FixedLenFeature([], tf.string),
'category': tf.io.FixedLenFeature([], tf.string)}
# 上記の記述を使って入力の tf.Example を処理
features = tf.io.parse_single_example(example_proto, feature_description)
X = tf.io.decode_raw(features['title'], tf.float32)
y = tf.io.decode_raw(features['category'], tf.int32)
return X, y
BASE_PATH = '/content/drive/MyDrive/ColabNotebooks/ML/NLP100_2020/08.NeuralNetworks/'
def get_dataset(file_name):
ds_raw = tf.data.TFRecordDataset(BASE_PATH+file_name+'.tfrecord')
return ds_raw.map(_parse_function).shuffle(1000).batch(64)
train_ds = get_dataset('train')
test_ds = get_dataset('test')
model = tf.keras.Sequential(
[tf.keras.layers.Dense(
4,
activation='softmax',
use_bias=False,
input_dim=300,
kernel_initializer='random_uniform') ])
model.compile(loss='categorical_crossentropy', optimizer='sgd', metrics=['acc'])
model.summary()
model.fit(train_ds, epochs=100)
model.evaluate(train_ds)
model.evaluate(test_ds)
回答解説
正解率出力
compile
関数のパラメータmetrics
に正解率を示すacc
を渡します。以前、自分で書いた記事「【Keras入門(4)】Kerasの評価関数(Metrics)」を読み返しました。
model.compile(loss='categorical_crossentropy', optimizer='sgd', metrics=['acc'])
評価
evaluate
関数を使って訓練データおよび評価データに対して正解率を求めます。
model.evaluate(train_ds)
model.evaluate(test_ds)