前回の記事でRNNのモデルを用いて加算と減算を学習しましたが,最低限必要なデータ数はどれぐらいなのか検討してみました.
教師データは24896個ありましたので,全部使用(1
),1/2を使用(2
),1/5を使用(5
),1/10を使用(10
),1/20を使用(20
),1/50を使用(50
),1/100を使用(100
)した場合に学習がどれぐらいできるか確認しました.
データの準備
以下のソースコードで,ratio
を1から100まで指定しました.
import math import random import numpy as np import tensorflow as tf from matplotlib import pyplot as plt from sklearn.model_selection import train_test_split d = { # 0: padding "1": 1, "2": 2, "3": 3, "4": 4, "5": 5, "6": 6, "7": 7, "8": 8, "9": 9, "0": 10, "+": 11, "-": 12, } vocab_num = len(d.keys()) + 1 def str2v(text: str) -> list: return [d[u] for u in text] rd = {v: k for k, v in d.items()} def v2str(input: list[int]) -> str: return "".join(rd.get(u, "") for u in input) ratio = 100 # data ymax = 256 data = [] for j in range(0, 128): data.append((str2v(f"{j}"), j)) for i in range(j, 128): data.append((str2v(f"{i}+{j}"), i + j)) data.append((str2v(f"{j}+{i}"), i + j)) data.append((str2v(f"{i}-{j}"), i - j)) original_data_length = len(data) data = random.sample(data, math.floor(original_data_length / ratio))
残りは前回の記事と同じです.
結果
データが多い程よく学習できることが分かりました.validatation_lossとデータ数を両対数グラフにプロットしたところ,直線に近似できました.
Embedding LayerのWeightsはこのようになりました.1/20までならば特徴が捉えられている印象でしたが,1/50以下だと不十分な印象でした.
1
1/2
1/5
1/10
1/20
1/50
1/100