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()
# ## 重み共有 # 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()
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)
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 # レイヤの状態変数は、名前を引数に渡すことで値を設定できます。キーワードを指定しなければ
def trainer(std, batch_norm): # type:ignore net = create_net(batch_norm) return sequential(net, metrics=["accuracy"]).init(std=std)
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)
# カスタムのデータセットを作成します。 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