1.4 ニューラルネットワークで問題を解く

「ゼロから作るDeep Learning ❷」 1章4節のスパイラルデータの学習を再現します。

from ivory.utils.repository import import_module

spiral = import_module("scratch2/dataset/spiral")
x, t = spiral.load_data()
t = t.argmax(axis=1)
print(x.shape)
print(t.shape)

[1] 2019-06-12 17:40:34 (203ms) python3 (203ms)

(300, 2)
(300,)

カスタムのデータセットを作成します。

from ivory.common.dataset import Dataset

data = Dataset((x, t), name="spiral")
data.shuffle()
data.epochs = 300
data.batch_size = 30
data

[2] 2019-06-12 17:40:34 (31.2ms) python3 (234ms)

spiral(batch_size=30, epochs=300, len=10, column=0, size=(300,))

Trainerインスタンスを作成します。

from ivory.core.trainer import sequential

net = [("input", 2), ("affine", 10, "sigmoid"), ("affine", 3, "softmax_cross_entropy")]

trainer = sequential(net, metrics=["loss"])
trainer.optimizer.learning_rate = 1
trainer = trainer.fit(data, epoch_data=data[:])
df = trainer.to_frame()
df.tail()

[3] 2019-06-12 17:40:34 (500ms) python3 (734ms)

epoch loss
296 296 0.099457
297 297 0.099133
298 298 0.098812
299 299 0.098493
300 300 0.098176

損失の履歴をプロットします。

import altair as alt

df_mean = df.rolling(10, min_periods=0).mean()
alt.Chart(df_mean).mark_line().encode(x="epoch", y="loss").properties(
    width=200, height=160
)

[4] 2019-06-12 17:40:35 (46.8ms) python3 (781ms)

分類結果を可視化します。

import matplotlib.pyplot as plt
import numpy as np
import pandas as pd

x, y = np.meshgrid(np.arange(-1, 1, 0.01), np.arange(-1, 1, 0.01))
X = np.c_[x.ravel(), y.ravel()]
z = trainer.predict(X).reshape(x.shape)
plt.contourf(x, y, z)
plt.axis("off")

x, t = data[:]
df = pd.DataFrame(x, columns=["x", "y"])
df["t"] = t
markers = ["o", "x", "^"]
for (key, sub), marker in zip(df.groupby("t"), markers):
    plt.scatter(sub.x, sub.y, s=40, marker=marker)
plt.show()

[6] 2019-06-12 17:40:35 (141ms) python3 (1.05s)

image/png