質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

87.36%

【python】missing 1 required positional argument の修正方法

解決済

回答 3

投稿

  • 評価
  • クリップ 0
  • VIEW 11K+

score 17

ニューラルネットワークのコードについて、Aのコードに過学習防止のためBのような変更を加えたところ、Cのようなエラーが生じました。

#コードA(最適化アルゴリズム:確率的勾配降下法)
import numpy as np
import matplotlib.pyplot as plt
from sklearn import datasets

iris_data = datasets.load_iris()
input_data = iris_data.data
correct = iris_data.target
n_data = len(correct)

ave_input = np.average(input_data, axis=0)
std_input = np.std(input_data, axis=0)
input_data = (input_data - ave_input) / std_input

correct_data = np.zeros((n_data, 3))
for i in range(n_data):
    correct_data[i, correct[i]] = 1.0

index = np.arange(n_data)
index_train = index[index%2 == 0]
index_test = index[index%2 != 0]

input_train = input_data[index_train, :]
correct_train = correct_data[index_train, :]
input_test = input_data[index_test, :]
correct_test = correct_data[index_test, :]

n_train = input_train.shape[0]
n_test = input_test.shape[0]

n_in = 4
n_mid = 25
n_out = 3

wb_width = 0.1
eta = 0.01
epoch = 75
batch_size = 8
interval = 100

class BaseLayer:
    def __init__(self, n_upper, n):
        self.w = wb_width * np.random.randn(n_upper, n)
        self.b = wb_width  * np.random.randn(n)

    def update(self, eta):
        self.w -= eta * self.grad_w
        self.b -= eta * self.grad_b

class MiddleLayer(BaseLayer):
    def forward(self, x):
        self.x = x
        self.u = np.dot(x, self.w) + self.b
        self.y = np.where(self.u <= 0, 0, self.u)

    def backward(self, grad_y):
        delta = grad_y * np.where(self.u <= 0, 0, 1)

        self.grad_w = np.dot(self.x.T, delta)
        self.grad_b = np.sum(delta, axis=0)

        self.grad_x = np.dot(delta, self.w.T)

class OutputLayer(BaseLayer):
    def forward(self, x):
        self.x = x
        u = np.dot(x, self.w) + self.b

        self.y = np.exp(u)/np.sum(np.exp(u), axis=1, keepdims=True)

    def backward(self, t):
        delta = self.y - t

        self.grad_w = np.dot(self.x.T, delta)
        self.grad_b = np.sum(delta, axis=0)

        self.grad_x = np.dot(delta, self.w.T)

middle_layer_1 = MiddleLayer(n_in, n_mid)
middle_layer_2 = MiddleLayer(n_mid, n_mid)
output_layer = OutputLayer(n_mid, n_out)

def forward_propagation(x):
    middle_layer_1.forward(x)
    middle_layer_2.forward(middle_layer_1.y)
    output_layer.forward(middle_layer_2.y)

def backpropagation(t):
    output_layer.backward(t)
    middle_layer_2.backward(output_layer.grad_x)
    middle_layer_1.backward(middle_layer_2.grad_x)

def uppdate_wb():
    middle_layer_1.update(eta)
    middle_layer_2.update(eta)
    output_layer.update(eta)

def get_error(t, batch_size):
    return -np.sum(t * np.log(output_layer.y + 1e-7)) / batch_size

train_error_x = []
train_error_y = []
test_error_x = []
test_error_y = []

n_batch = n_train // batch_size
for i in range(epoch):

    forward_propagation(input_train)
    error_train = get_error(correct_train, n_train)
    forward_propagation(input_test)
    error_test = get_error(correct_test, n_test)

    test_error_x.append(i)
    test_error_y.append(error_test)
    train_error_x.append(i)
    train_error_y.append(error_train)

    if i%interval == 0:
        print("Epoch:" + str(i) + "/" + str(epoch),
             "Error_train:" + str(error_train),
             "Error_test:" + str(error_test))

    index_random = np.arange(n_train)
    np.random.shuffle(index_random)
    for j in range(n_batch):

        mb_index = index_random[j*batch_size : (j+1)*batch_size]
        x = input_train[mb_index, :]
        t = correct_train[mb_index, :]

        forward_propagation(x)
        backpropagation(t)

        uppdate_wb()

plt.plot(train_error_x, train_error_y, label="Train")
plt.plot(test_error_x, test_error_y, label="Test")
plt.legend()

plt.xlabel("Epochs")
plt.ylabel("Error")

plt.show()        

forward_propagation(input_train)
count_train = np.sum(np.argmax(output_layer.y,
                              axis=1) == np.argmax(correct_train, axis=1))

forward_propagation(input_test)
count_test = np.sum(np.argmax(output_layer.y, 
                             axis = 1) == np.argmax(correct_test, axis=1))

print("Accuracy Train:", str(count_train/n_train*100) + "%", 
     "Accuracy Test:", str(count_test/n_test*100) + "%")    
#コードB(最適化アルゴリズム:AdaGrad, ドロップアウト追加)

#MiddleLayerクラスまではコードAと同様

class Dropout:
    def __init__(self, dropout_ratio):
        self.dropout_ratio = dropout_ratio

    def forward(self, x, is_train):
        if is_train:
            rand = np.random.rand(*x.shape)
            self.dropout = np.where(rand > self.dropouut_ratio, 1, 0)
            self.y = x * self.dropout

        else:
            self.y = (1-self.dropout_ratio)*x

    def bachward(self, grad_y):
        self.grad_x = grad_y * self.dropout

class OutputLayer(BaseLayer):
    def forward(self, x):
        self.x = x
        u = np.dot(x, self.w) + self.b

        self.y = np.exp(u)/np.sum(np.exp(u), axis=1, keepdims=True)

    def backward(self, t):
        delta = self.y - t

        self.grad_w = np.dot(self.x.T, delta)
        self.grad_b = np.sum(delta, axis=0)

        self.grad_x = np.dot(delta, self.w.T)

middle_layer_1 = MiddleLayer(n_in, n_mid)
dropout_1 = Dropout(0.5)
middle_layer_2 = MiddleLayer(n_mid, n_mid)
dropout_2 = Dropout(0.5)
output_layer = OutputLayer(n_mid, n_out)

def forward_propagation(x, is_train):
    middle_layer_1.forward(x)
    dropout_1.forward(middle_layer_1.y, is_train)
    middle_layer_2.forward(dropout_1.y)
    dropout_2.forward(middle_layer_2.y, is_train)
    output_layer.forward(dropout_2.y)

def backpropagation(t):
    output_layer.backward(t)
    dropout_2.backward(output_layer.grad_x)
    middle_layer_2.backward(dropout_2.grad_x)
    dropout_1.backward(middle_layer_2.grad_x)
    middle_layer_1.backward(dropout_1.grad_x)

def uppdate_wb():
    middle_layer_1.update(eta)
    middle_layer_2.update(eta)
    output_layer.update(eta)

def get_error(t, batch_size):
    return -np.sum(t * np.log(output_layer.y + 1e-7)) / batch_size

train_error_x = []
train_error_y = []
test_error_x = []
test_error_y = []

n_batch = n_train // batch_size
for i in range(epoch):

    forward_propagation(input_train)
    error_train = get_error(correct_train, n_train)
    forward_propagation(input_test)
    error_test = get_error(correct_test, n_test)

    test_error_x.append(i)
    test_error_y.append(error_test)
    train_error_x.append(i)
    train_error_y.append(error_train)

    if i%interval == 0:
        print("Epoch:" + str(i) + "/" + str(epoch),
             "Error_train:" + str(error_train),
             "Error_test:" + str(error_test))

    index_random = np.arange(n_train)
    np.random.shuffle(index_random)
    for j in range(n_batch):

        mb_index = index_random[j*batch_size : (j+1)*batch_size]
        x = input_train[mb_index, :]
        t = correct_train[mb_index, :]

        forward_propagation(x)
        backpropagation(t)

        uppdate_wb()

plt.plot(train_error_x, train_error_y, label="Train")
plt.plot(test_error_x, test_error_y, label="Test")
plt.legend()

plt.xlabel("Epochs")
plt.ylabel("Error")

plt.show()        

forward_propagation(input_train)
count_train = np.sum(np.argmax(output_layer.y,
                              axis=1) == np.argmax(correct_train, axis=1))

forward_propagation(input_test)
count_test = np.sum(np.argmax(output_layer.y, 
                             axis = 1) == np.argmax(correct_test, axis=1))

print("Accuracy Train:", str(count_train/n_train*100) + "%", 
     "Accuracy Test:", str(count_test/n_test*100) + "%")    
#コードB実行時に生じたエラー
TypeError  Traceback (most recent call last)
<ipython-input-28-64a229cb9012> in <module>
    136 for i in range(epoch):
    137 
--> 138     forward_propagation(input_train)
    139     error_train = get_error(correct_train, n_train)
    140     forward_propagation(input_test)

TypeError: forward_propagation() missing 1 required positional argument: 'is_train'


調べた結果

forward_propagation()

上記に引数”is_train”が不足していると考え追加すると、以下のエラーとなります。

NameError: name 'is_train' is not defined

こちらの修正方法について教えていただきたいです。
よろしくお願い致します。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • dahachin

    2019/08/13 18:20

    @siruku6さん
    ご回答ありがとうございます、文字数の都合上全てのコードは載せられなかったため端折りました。
    ”この作業をした結果、どんなソースコードになったのか”
    結果のコードとしては以下になります。(forward_propagationに引数”is_train”を追加した状態です)

    "n_batch = n_train // batch_size
    for i in range(epoch):
    forward_propagation(input_train, is_train)"

    キャンセル

  • siruku6

    2019/08/14 16:32

    エラーは出なくなりましたか??

    キャンセル

  • wenchao

    2020/12/06 00:25

    誤りになった : name 'is_train' is not defined

    キャンセル

回答 3

checkベストアンサー

0

お疲れ様です。
コードを実行して確認できていませんが、気づいた点について回答します。

ご質問のエラー

TypeError: forward_propagation() missing 1 required positional argument: 'is_train'


については

forward_propagation(input_train, is_train=True)  


forward_propagation(input_test, is_train=False)


として値を渡すことで、回避できるかと思います。

ニューラルネットワークでのDropoutでは、学習の際には一定の割合でユニットの出力を0にしますが、学習を伴わない推論ではそのまま出力しますので、以下のようになるかと思います。

#コードB(最適化アルゴリズム:AdaGrad, ドロップアウト追加)

# ... 中略

n_batch = n_train // batch_size
for i in range(epoch):

    # train, backpropagationあり
    forward_propagation(input_train, is_train=True)
    error_train = get_error(correct_train, n_train)

    # valid, backpropagationなし
    forward_propagation(input_test, is_train=False)
    error_test = get_error(correct_test, n_test)

    for j in range(n_batch):

        mb_index = index_random[j*batch_size : (j+1)*batch_size]
        x = input_train[mb_index, :]
        t = correct_train[mb_index, :]

        forward_propagation(x, is_train=Train)
        backpropagation(t)

        uppdate_wb()


# ... 中略       

# 結果の計算, backpropagationなし
forward_propagation(input_train, is_train=False)
count_train = np.sum(np.argmax(output_layer.y,
                              axis=1) == np.argmax(correct_train, axis=1))

# 結果の計算, backpropagationなし
forward_propagation(input_test, is_train=False)
count_test = np.sum(np.argmax(output_layer.y, 
                             axis = 1) == np.argmax(correct_test, axis=1))

print("Accuracy Train:", str(count_train/n_train*100) + "%", 
     "Accuracy Test:", str(count_test/n_test*100) + "%")    

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

138     forward_propagation(input_train)
...
TypeError: forward_propagation() missing 1 required positional argument: 'is_train'


とあるので138行目のforward_propagationに、引数がもう一つ必要だということがわかります。

実際にコードBを見てみると、こうなっていますので、ここの引数が足りてないと考えて間違いなさそうです。

# is_trainという引数が第2引数に設定されている
def forward_propagation(x, is_train):
    middle_layer_1.forward(x)
    # 以下略

とはいえ、この引数にどんなデータを渡せばいいのかはこのコードを書いた人にしかわからないと思いますので、そこをどうするのかはまた別途考えた方がいいでしょう....

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

お疲れ様です。dahachinさん,同じ問題に遭遇しましたが、この問題は解決しましたか?

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2021/01/30 14:04

    お返事遅れました。
    諸々試しましたが、解決しませんでした

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 87.36%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る