誤差逆伝播法(3) 乱数の種(1)
Published:
By nobCategory: Posts
乱数の種
MultiLayerPerceptron
クラスを作成したのだが、乱数の種(シード)を変えるとどうなるか試してみる。
4x3画素、モノクロ2階調の画像を識別してみる
import matplotlib.pyplot as plt
import numpy as np
# 自作クラス
from mlp import (
ActivationLayer,
FullyConnectedLayer,
InputLayer,
MeanSquaredError,
MultiLayerPerceptron,
Sigmoid,
)
from numpy.random import MT19937, Generator, SeedSequence
np.set_printoptions(precision=3)
x = np.array(
[
[1, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1],
[0, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1],
[1, 1, 0, 1, 0, 1, 1, 0, 1, 1, 1, 1],
[1, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 0],
[1, 1, 1, 1, 0, 1, 1, 0, 1, 0, 1, 1],
[0, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1],
[0, 0, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1],
[0, 0, 0, 1, 1, 0, 1, 0, 1, 1, 1, 1],
[0, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 0],
[0, 0, 0, 1, 1, 1, 1, 0, 1, 0, 1, 1],
[1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 0, 0],
[0, 1, 1, 1, 0, 1, 1, 1, 1, 0, 0, 0],
[1, 1, 0, 1, 0, 1, 1, 1, 1, 0, 0, 0],
[1, 1, 1, 1, 0, 1, 1, 1, 0, 0, 0, 0],
[1, 1, 1, 1, 0, 1, 0, 1, 1, 0, 0, 0],
[1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1],
[1, 1, 1, 1, 0, 0, 1, 0, 1, 1, 1, 1],
[1, 1, 1, 1, 0, 1, 1, 0, 0, 1, 1, 1],
[1, 1, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1],
[1, 1, 1, 1, 0, 1, 0, 0, 1, 1, 1, 1],
[1, 1, 1, 0, 0, 1, 1, 0, 1, 1, 1, 1],
[0, 0, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1],
[0, 1, 1, 1, 0, 0, 1, 0, 1, 1, 1, 1],
[0, 1, 1, 1, 0, 1, 1, 0, 0, 1, 1, 1],
[0, 1, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1],
[0, 1, 1, 1, 0, 1, 0, 0, 1, 1, 1, 1],
[0, 1, 1, 0, 0, 1, 1, 0, 1, 1, 1, 1],
[1, 1, 0, 1, 0, 0, 1, 0, 1, 1, 1, 1],
[1, 1, 0, 1, 0, 1, 1, 0, 0, 1, 1, 1],
[1, 1, 0, 1, 0, 1, 1, 0, 1, 1, 0, 1],
[1, 1, 0, 1, 0, 1, 0, 0, 1, 1, 1, 1],
[1, 1, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1],
[0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0],
[1, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0],
[0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0],
[0, 1, 0, 0, 1, 0, 0, 1, 0, 1, 1, 0],
[0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 1],
[1, 1, 0, 0, 1, 0, 0, 1, 0, 1, 1, 0],
[1, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 1],
[1, 1, 0, 0, 1, 0, 0, 1, 0, 1, 1, 1],
[0, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1, 0],
[0, 1, 0, 0, 1, 0, 0, 1, 1, 0, 1, 0],
[1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1, 0],
[1, 1, 0, 0, 1, 0, 0, 1, 1, 0, 1, 0],
[0, 1, 0, 0, 1, 1, 0, 1, 0, 1, 1, 0],
[0, 1, 0, 0, 1, 0, 0, 1, 1, 1, 1, 0],
[0, 1, 0, 0, 1, 0, 0, 1, 0, 1, 1, 1],
[1, 1, 0, 0, 1, 1, 0, 1, 1, 0, 1, 1],
[1, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0],
[0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1],
[1, 1, 0, 1, 1, 0, 0, 1, 0, 0, 1, 0],
[1, 1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 0],
[1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0],
[1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0],
[0, 1, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0],
[1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0],
[1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1],
[0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 1, 0],
[0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 1, 0],
[0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 1, 0],
[0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0],
[0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0],
[0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 1, 0],
[0, 1, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0],
]
)
y = np.array(
[
[1, 0],
[1, 0],
[1, 0],
[1, 0],
[1, 0],
[1, 0],
[1, 0],
[1, 0],
[1, 0],
[1, 0],
[1, 0],
[1, 0],
[1, 0],
[1, 0],
[1, 0],
[1, 0],
[1, 0],
[1, 0],
[1, 0],
[1, 0],
[1, 0],
[1, 0],
[1, 0],
[1, 0],
[1, 0],
[1, 0],
[1, 0],
[1, 0],
[1, 0],
[1, 0],
[1, 0],
[1, 0],
[0, 1],
[0, 1],
[0, 1],
[0, 1],
[0, 1],
[0, 1],
[0, 1],
[0, 1],
[0, 1],
[0, 1],
[0, 1],
[0, 1],
[0, 1],
[0, 1],
[0, 1],
[0, 1],
[0, 1],
[0, 1],
[0, 1],
[0, 1],
[0, 1],
[0, 1],
[0, 1],
[0, 1],
[0, 1],
[0, 1],
[0, 1],
[0, 1],
[0, 1],
[0, 1],
[0, 1],
[0, 1],
]
)
def model(activation, rng):
mlp = MultiLayerPerceptron(
[
InputLayer(12),
FullyConnectedLayer(12, 3, rng),
ActivationLayer(Sigmoid()),
FullyConnectedLayer(3, 2, rng),
ActivationLayer(Sigmoid()),
],
MeanSquaredError(),
epochs=50,
learning_rate=0.1,
)
return mlp
fig = plt.figure(figsize=(15, 160))
seeds = 200
cols = 4
rows = seeds // cols
for seed in range(seeds):
mlp_sigm_mt1 = model(Sigmoid(), Generator(MT19937(seed)))
mlp_sigm_mt1.fit(x, y)
mlp_sigm_pcg1 = model(Sigmoid(), np.random.default_rng(seed))
mlp_sigm_pcg1.fit(x, y)
ax = fig.add_subplot(rows, cols, seed + 1)
ax.set_title("4x3 2-tone {}".format(seed))
ax.set_xlabel("epoch")
ax.set_ylabel("cost")
ax.plot(
mlp_sigm_mt1.history,
marker="o",
markersize=1,
alpha=0.4,
label=r"$\sigma, \; MT19937$",
)
ax.plot(
mlp_sigm_pcg1.history,
marker="o",
markersize=1,
alpha=0.4,
label=r"$\sigma, \; PCG64$",
)
ax.legend()
ax.grid()
ax.minorticks_on()
ax.set_ylim(-1, ax.get_ylim()[1])
plt.tight_layout()
plt.show()
訓練データの出典
- 涌井良幸, 涌井貞美 著. ディープラーニングがわかる数学入門, 技術評論社, 2017.4. 978-4-7741-8814-0.