

オライリーのゼロから作るDeepLearningという本で現在機械学習の勉強をしております．  
この本の5.7.4「逆誤差伝播法を使った学習」にて2層のニューラルネットワークの実装が掲載されており，ソースコードが載っていたのでjupyter
notebookにて実装を行いました．以下，ソースコードを示します．

[code]

    # coding: utf-8
    import sys, os
    sys.path.append(os.pardir)
    
    import numpy as np
    from dataset.mnist import load_mnist
    from two_layer_net import TwoLayerNet
    
    # データの読み込み
    (x_train, t_train), (x_test, t_test) = load_mnist(normalize=True, one_hot_label=True)
    
    network = TwoLayerNet(input_size=784, hidden_size=50, output_size=10)
    
    iters_num = 10000
    train_size = x_train.shape[0]
    batch_size = 100
    learning_rate = 0.1
    
    train_loss_list = []
    train_acc_list = []
    test_acc_list = []
    
    iter_per_epoch = max(train_size / batch_size, 1)
    
    for i in range(iters_num):
        batch_mask = np.random.choice(train_size, batch_size)
        x_batch = x_train[batch_mask]
        t_batch = t_train[batch_mask]
    
        # 勾配
        #grad = network.numerical_gradient(x_batch, t_batch)
        grad = network.gradient(x_batch, t_batch)
    
        # 更新
        for key in ('W1', 'b1', 'W2', 'b2'):
            network.params[key] -= learning_rate * grad[key]
    
        loss = network.loss(x_batch, t_batch)
        train_loss_list.append(loss)
    
        if i % iter_per_epoch == 0:
            train_acc = network.accuracy(x_train, t_train)
            test_acc = network.accuracy(x_test, t_test)
            train_acc_list.append(train_acc)
            test_acc_list.append(test_acc)
            print(train_acc, test_acc)
    
[/code]

問題なく学習ができたため今度はレイヤを3層に拡張しようと考え，上記コードの7行目に表記されているtwo_layer_netの中身を2層から3層に拡張し，名前をthree_layer_netと名前を変えて保存しました．下にtwo_layer_netとthree_layer_netのコードの一部を示します．

two_layer_net

[code]

    # coding: utf-8
    import sys, os
    sys.path.append(os.pardir)  # 親ディレクトリのファイルをインポートするための設定
    import numpy as np
    from common.layers import *
    from common.gradient import numerical_gradient
    from collections import OrderedDict
    
    
    class TwoLayerNet:
    
        def __init__(self, input_size, hidden_size, output_size, weight_init_std = 0.01):
            # 重みの初期化
            self.params = {}
            self.params['W1'] = weight_init_std * np.random.randn(input_size, hidden_size)
            self.params['b1'] = np.zeros(hidden_size)
            self.params['W2'] = weight_init_std * np.random.randn(hidden_size, hidden_size) 
            self.params['b2'] = np.zeros(hidden_size)
    
[/code]

three_layer_net ※classの名前がTwoLayerからThreeLayerに変わり変数も増やしています．

[code]

    # coding: utf-8
    import sys, os
    sys.path.append(os.pardir)  # 親ディレクトリのファイルをインポートするための設定
    import numpy as np
    from common.layers import *
    from common.gradient import numerical_gradient
    from collections import OrderedDict
    
    
    class ThreeLayerNet:
    
        def __init__(self, input_size, hidden_size, output_size, weight_init_std = 0.01):
            # 重みの初期化
            self.params = {}
            self.params['W1'] = weight_init_std * np.random.randn(input_size, hidden_size)
            self.params['b1'] = np.zeros(hidden_size)
            self.params['W2'] = weight_init_std * np.random.randn(hidden_size, hidden_size) 
            self.params['b2'] = np.zeros(hidden_size)
            self.params['W3'] = weight_init_std * np.random.randn(hidden_size, output_size) 
            self.params['b3'] = np.zeros(output_size)
    
[/code]

three_layer_net作成後，先ほどニューラルネットワークを実装したコードの7行目を書き換えて

[code]

    from two_layer_net import TwoLayerNet
    
[/code]

から

[code]

    from three_layer_net import ThreeLayerNet
    
[/code]

として，実行すると  
ImportError: cannot import name 'ThreeLayerNet' from 'three_layer_net'
(C:\Users\…\deep-learning-from-scratch-master\ch05\three_layer_net.py)  
と作成したクラスが読み込めないと言われました．ファイルのディレクトリを確認したのですが間違えが見つからなったため試しに

[code]

    from three_layer_net import TwoLayerNet
    
[/code]

と書き換えると無事プログラムが動きました．3層のニューラルネットワークが動いたので問題がないと言えばないのですが，なぜimport
ThreeLayerNetが読み込めずimport TwoLayerが読み込めるのか腑に落ちません．  
こちらの現象の関してご教授いただければ幸いです．よろしくお願いいたします．


CC BY-SA 4.0
2019-12-03T14:33:48.117
61071
2019-12-03T14:33:48.117
36664
question
python3 深層学習
ゼロから作るDeepLearning 5章のニューラルネットワークを2層から3層に書き換えると層のモデルが読み込めなくなります