Пример #1
0
data_train, data_test = load_dataset(flatten=False)
print(data_train)
print(data_train.shape)

# 「ゼロから作るDeep Learning」の`SimpleConvNet`を作成します。学習のために、Trainerインス
# タンスを用意します。
from ivory.core.trainer import sequential  # isort:skip

net = [
    ("input", 1, 28, 28),
    ("convolution", 30, 5, 5, "relu"),
    ("pooling", 2, 2, "flatten"),
    ("affine", 100, "relu"),
    ("affine", 10, "softmax_cross_entropy"),
]
trainer = sequential(net, optimizer="adam", metrics=["accuracy"])

# 学習を行います。
data_train.epochs = 20
data_train.batch_size = 100
data_train.shuffle()
data_test.shuffle()

# エポックごとの評価にスライス表記で取得したデータを使います。スライス表記にはバッチ数分
# を含むので、バッチサイズが100の訓練データに対しては、`data_train[:10]`で1000個分のデー
# タが取得できます。

epoch_data = {"train": data_train[:10], "test": data_test[:1000]}
len(epoch_data["train"][0]), len(epoch_data["test"][0])

# -
data = load_dataset(train_only=True)
data.length = 500
data.shuffle()
data.split((8, 2))
data.batch_size = 100
data.epochs = 50
epoch_data = {"train": data[0, :], "val": data[1, :]}

net = [
    ("input", 784),
    (6, "affine", 100, "relu"),
    ("affine", 10, "softmax_cross_entropy"),
]

trainer = sequential(net, metrics=["accuracy"])
trainer = trainer.fit(data, epoch_data=epoch_data)
trainer

# ハイパーパラメータのランダム探索を行うジェネレータを定義します。以下ではハイパーパラメ
# ータの探索範囲を「ゼロから作るDeep Learning」から少し変更しています。
import numpy as np  # isort:skip


def random_search():
    while True:
        weight_decay = 10**np.random.uniform(-10, -2)
        learning_rate = 10**np.random.uniform(-4, -1)
        trainer.optimizer.learning_rate = learning_rate
        trainer.init(weight_decay=weight_decay)
        df = trainer.to_frame()
Пример #3
0
# ## 重み共有

# Ivoryライブラリでは重みを共有したときの勾配の加算は自動で行われます。
import numpy as np  # isort:skip
from ivory.core.trainer import sequential  # isort:skip

N, L, M = 3, 2, 3
net = [("input", L), ("affine", L), ("affine", L, "softmax_cross_entropy")]
trainer = sequential(net)
model = trainer.model
m1, m2, s = model.layers
w = np.random.randn(L, L)
m1.W.variable.data = w  # type:ignore
m2.W.variable.data = w.copy()  # type:ignore
# データを作成します。
x = np.random.randn(N, L)
t = np.random.randint(0, L, N)
model.set_data(x, t)
model.forward()
model.backward()
print(m1.W.g)  # type:ignore
print(model.numerical_gradient(m1.W.variable))  # type:ignore

print(m2.W.g)  # type:ignore
print(model.numerical_gradient(m2.W.variable))  # type:ignore
# 勾配を加算してみます。
print(m1.W.g + m2.W.g)  # type:ignore

# 重みを共有し、トレーナーをビルドします。
m2.W.share_variable(m1.W)  # type:ignore
trainer.build()
Пример #4
0
lr = 20.0
max_epoch = 40
max_grad = 0.25
dropout = 0.5

# モデルを作成します。
from ivory.core.trainer import sequential  # isort:skip

net = [
    ("input", vocab_size),
    ("embedding", wordvec_size, "dropout"),
    ("lstm", hidden_size, "dropout"),
    ("lstm", hidden_size, "dropout"),
    ("affine", vocab_size, "softmax_cross_entropy"),
]
trainer = sequential(net, optimizer="sgd", metrics=["loss"])
trainer.optimizer.learning_rate = lr
trainer.max_grad = max_grad
model = trainer.model
for layer in model.layers:
    print(layer)
# 重みの初期値とドロップアウト率を設定します。
from ivory.common.context import np  # isort:skip

model.init(std="xavier", dropout_ratio=dropout)
for p in model.weights:
    if p.name != "b":
        std1 = f"{float(p.d.std()):.03f}"
        std2 = f"{float(np.sqrt(1/p.d.shape[0])):.03f}"
        print(p.layer.name, p.name, std1, std2, type(p.d), p.d.dtype)
Пример #5
0
from ivory.datasets.mnist import load_dataset  # isort:skip

data = load_dataset(train_only=True)
data.length = 1000  # データセットの大きさを制限します。
data.batch_size = 100
data.epochs = 20
data.random = True
data

# `Trainer`クラスはレイヤ表現を引数にとる`ivory.common.trainer`モジュール
# の`sequential`関数で作成できます。
from ivory.core.trainer import sequential  # isort:skip

net = [("input", 784), ("affine", 50, "relu"),
       ("affine", 10, "softmax_cross_entropy")]
trainer = sequential(net)
print(trainer.model)
print(trainer.optimizer)

# `Trainer`インスタンスのレイヤパラメータを初期化するには、`init`メソッドを呼び出します
# 。オプショナルの`std`キーワード引数を指定すると、標準偏差を設定できます。
from ivory.common.context import np  # isort:skip

W = trainer.model.weight_variables[0]
print(W.data.std(), np.sqrt(2 / W.shape[0]))  # type:ignore
trainer.init(std=100)
print(W.data.std())  # type:ignore
trainer.init(std="he")
print(W.data.std())  # type:ignore

# レイヤの状態変数は、名前を引数に渡すことで値を設定できます。キーワードを指定しなければ
Пример #6
0
def trainer(std, batch_norm):  # type:ignore
    net = create_net(batch_norm)
    return sequential(net, metrics=["accuracy"]).init(std=std)
Пример #7
0
from ivory.common.util import (convert_one_hot, create_contexts_target,
                               preprocess)

text = "You say goodbye and I say hello."
corpus, word_to_id, id_to_word = preprocess(text)
contexts, target = create_contexts_target(corpus, window_size=1)
vocab_size = len(word_to_id)
contexts = convert_one_hot(contexts, vocab_size)
data = Dataset((contexts, target))
data.batch_size = 3
data.epochs = 1000
data.shuffle()
data

# Ivoryライブラリでは重みを共有して複数入力をとるMatMulMeanレイヤを実装しています。これ
# を使って、CBOWモデルを組み立てます。
from ivory.core.trainer import sequential  # isort:skip

net = [("input", 2, 7), ("matmulmean", 5),
       ("matmul", 7, "softmax_cross_entropy")]
trainer = sequential(net, optimizer="adam").init(std=0.01)
trainer.model.layers
# 訓練を実行します。
df = trainer.fit(data, epoch_data=data[:]).to_frame()
df.tail()
# 可視化します。
import altair as alt  # type:ignore

alt.Chart(df).mark_line().encode(x='epoch', y='loss').properties(width=200,
                                                                 height=160)
Пример #8
0
# カスタムのデータセットを作成します。
from ivory.common.dataset import Dataset  # isort:skip

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

# Trainerインスタンスを作成します。
from ivory.core.trainer import sequential  # isort:skip

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

# 損失の履歴をプロットします。
import altair as alt  # isort:skip

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)

# 分類結果を可視化します。{{ import matplotlib.pyplot as plt }}
import matplotlib.pyplot as plt  # isort:skip