import os import altair as alt import nnabla as nn import nnabla.functions as F import nnabla.monitor as M import nnabla.solvers as S import numpy as np from nnabla.ext_utils import get_extension_context from ivory.utils.path import cache_dir from ivory.utils.repository import import_module from ivory.utils.nnabla.monitor import read_monitor # `import_module`はGitレポジトリからモジュールをインポートする。 I = import_module("nnabla-examples/mnist-collection/dcgan") I.__file__ # これで、 mnist-collection/dcgan.pyの内部にアクセスできるようになった。 今回の例ではハイ # パーパラメータが設定されているのでそれに倣う。 source = inspect.getsource(I) print(source[source.index("if __name__"):]) max_iter = 20000 learning_rate = 0.0002 batch_size = 64 weight_decay = 0.0001 # コンテキストを設定する。 context = get_extension_context("cudnn", device_id=0, type_config="float")
# # 6.5 RNNLMのさらなる改善 # 高速化のためにGPUを使います。 from ivory.common.context import np np.context = 'gpu' # PTBデータセットを読み出します。 from ivory.common.dataset import TimeDataset # isort:skip from ivory.utils.repository import import_module # isort:skip ptb = import_module("scratch2/dataset/ptb") corpus, _, _ = ptb.load_data("train") corpus_val, _, _ = ptb.load_data("val") corpus_test, _, _ = ptb.load_data("test") vocab_size = int(max(corpus) + 1) x, t = corpus[:-1], corpus[1:] data = TimeDataset((x, t), time_size=35, batch_size=20) data.epochs = 1 data # ハイパーパラメータの設定を行います。 wordvec_size = 650 hidden_size = 650 lr = 20.0 max_epoch = 40 max_grad = 0.25 dropout = 0.5 # モデルを作成します。 from ivory.core.trainer import sequential # isort:skip
t # 例えば、上の例は、バッチデータ0の正解ラベルが{{t[0]}}で、バッチデータ1の正解ラベル # が{{t[1]}}であることを示します。 # 交差エントロピー誤差はターゲットの位置にあるデータを取り出すことに相当するので、以下の # ように実装できます。 y_ = y[np.arange(N), t] y_ # あとは対数の和を取りますが、無限小に発散することを防ぐために微小な値を付加します。また # 、バッチ数によらない結果を得るために、バッチ数で除算します。 -np.sum(np.log(y_ + 1e-7)) / N # 「ゼロから作るDeep Learning」の実装と比較します。 from ivory.utils.repository import import_module # isort:skip layers = import_module("scratch2/common.layers") s = layers.SoftmaxWithLoss() s.forward(x, t) # 以上が、順伝搬になり、上のスカラー値が損失関数の値になります。 # 逆伝搬は、ソフトマックス関数と交差エントロピー誤差を合わせたレイヤの勾配が次式で与えら # れることを天下り的に認めたうえで、数値微分によって正しいことを確認します。 # $$ \partial L/x_k = y_k - \delta_{tk} $$ dx = y.copy() dx[np.arange(N), t] -= 1 dx / N # 「ゼロから作るDeep Learning」の実装と比較します。
# # NNabla by Examples # # (https://nnabla.readthedocs.io/en/latest/python/tutorial/by_examples.html) import matplotlib.pyplot as plt import nnabla as nn import nnabla.functions as F import nnabla.parametric_functions as PF import nnabla.solvers as S import numpy as np from nnabla.ext_utils import get_extension_context from nnabla.monitor import tile_images from ivory.utils.path import cache_file from ivory.utils.repository import import_module tiny_digits = import_module("nnabla/tutorial/tiny_digits") np.random.seed(0) imshow_opt = dict(cmap="gray", interpolation="nearest") # ## Logistic Regression # ### Preparing a Toy Dataset digits = tiny_digits.load_digits(n_class=10) tiny_digits.plot_stats(digits) # - data = tiny_digits.data_iterator_tiny_digits(digits, batch_size=64, shuffle=True) # - img, label = data.next() plt.imshow(tile_images(img), **imshow_opt)
# # 7.3 seq2seqの実装 # 足し算データセットを読み出します。 from ivory.utils.repository import import_module # isort:skip sequence = import_module("scratch2/dataset/sequence") x_train, t_train = sequence.load_data("addition.txt")[0] char_to_id, id_to_char = sequence.get_vocab() # モデルの形状を設定します。 vocab_size = len(char_to_id) wordvec_size = 16 hideen_size = 128 # 「ゼロから作るDeep Learning ❷」のモデルを読み込みます。 sequence = import_module("scratch2/ch07/seq2seq") seq2seq = sequence.Seq2seq(vocab_size, wordvec_size, hideen_size) for p in seq2seq.params: print(p.shape) # モデルを作成します。 from ivory.core.model import branch, Model # isort:skip net_encoder = [ ("input", vocab_size), ("embedding", wordvec_size), ("lstm", hideen_size, "select"), ] net_decoder = [ ("input", vocab_size),
import nnabla.functions as F import nnabla.solvers as S import numpy as np import pandas as pd from nnabla.ext_utils import get_extension_context from nnabla.monitor import Monitor, MonitorSeries, MonitorTimeElapsed from numpy.random import RandomState # Ivoryパッケージから便利な関数をインポート。 from ivory.utils.path import cache_dir, cache_file from ivory.utils.repository import import_module from ivory.utils.utils import set_args from ivory.utils.nnabla.monitor import read_monitor # `import_module`はGitレポジトリからモジュールをインポートする。 cl = import_module("nnabla-examples/mnist-collection/classification") cl_bnn = import_module("nnabla-examples/mnist-collection/classification_bnn") print(cl.__file__) print(cl_bnn.__file__) # これで、 mnist-collection/classification[_bnn].pyの内部にアクセスできるようになった。 # `set_args`関数は、`sys.argv`を書き換えて、あたかもコンソールから実行しているかのように # 装うためにある。コンテキストをcudnnに設定し、保存ディレクトリを指定する。 save_path = cache_file(cl.name, "tmp.monitor") set_args(f"--context cudnn -m {save_path} -o {save_path}") args = cl.get_args() # 変数`args`を見てみる。 print("Type:", type(args))
from collections import namedtuple import altair as alt import nnabla as nn import nnabla.functions as F import nnabla.monitor as M import nnabla.solvers as S import numpy as np import pandas as pd from nnabla.ext_utils import get_extension_context from ivory.utils.path import cache_dir from ivory.utils.repository import import_module # モジュールのインポートとコンテキストの設定。 I = import_module("nnabla-examples/mnist-collection/siamese") context = get_extension_context("cudnn", device_id=0, type_config="float") nn.set_default_context(context) nn.context.get_current_context() # 訓練用とテスト用にCNNを作成する。 net = namedtuple("net", ("image0", "image1", "label", "pred", "loss", "data")) def create_net(test, batch_size=128, margin=1.0): # Margin for contrastive loss. image0 = nn.Variable([batch_size, 1, 28, 28]) image1 = nn.Variable([batch_size, 1, 28, 28]) label = nn.Variable([batch_size]) pred = I.mnist_lenet_siamese(image0, image1, test=test) loss = F.mean(I.contrastive_loss(pred, label, margin)) data = I.siamese_data_iterator(batch_size, test, rng=np.random.RandomState(313))
# # 1.4 ニューラルネットワークで問題を解く # [「ゼロから作るDeep Learning ❷」](https://www.oreilly.co.jp/books/9784873118369/) # 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) # カスタムのデータセットを作成します。 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[:])