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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

3回答

8697閲覧

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

dahachin

総合スコア17

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2019/08/13 08:33

ニューラルネットワークのコードについて、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

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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

can110

2019/08/13 08:46

エラーメッセージに従うならis_train変数を定義し、適切な値をセットすれば解決します。 が、具体的に何が分からないのかを記載すると回答得られやすいです。
siruku6

2019/08/13 09:20 編集

>上記に引数”is_train”が不足していると考え追加すると、以下のエラーとなります。 この作業をした結果、どんなソースコードになったのかも掲載した方が、回答を得やすくなると思います。 (全行を記載するのではなく、修正した箇所のみ記載すれば十分だと思います。) NameError: name 'is_train' is not defined (これを見る限り、一度も宣言されてない変数を呼び出そうとしているように見えますね)
dahachin

2019/08/13 09:17

@can110さん ご回答ありがとうございます! 不明点としては、「どの関数に引数”is_train”を入れればいいのか」というものがあります。
dahachin

2019/08/13 09: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 07:32

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

2020/12/05 15:25

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

回答3

0

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

投稿2020/12/05 15:35

wenchao

総合スコア2

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

dahachin

2021/01/30 05:04

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

0

ベストアンサー

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

ご質問のエラー

bash

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

については

python

1forward_propagation(input_train, is_train=True)

python

1forward_propagation(input_test, is_train=False)

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

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

python

1#コードB(最適化アルゴリズム:AdaGrad, ドロップアウト追加) 2 3# ... 中略 4 5n_batch = n_train // batch_size 6for i in range(epoch): 7 8 # train, backpropagationあり 9 forward_propagation(input_train, is_train=True) 10 error_train = get_error(correct_train, n_train) 11 12 # valid, backpropagationなし 13 forward_propagation(input_test, is_train=False) 14 error_test = get_error(correct_test, n_test) 15 16 for j in range(n_batch): 17 18 mb_index = index_random[j*batch_size : (j+1)*batch_size] 19 x = input_train[mb_index, :] 20 t = correct_train[mb_index, :] 21 22 forward_propagation(x, is_train=Train) 23 backpropagation(t) 24 25 uppdate_wb() 26 27 28# ... 中略 29 30# 結果の計算, backpropagationなし 31forward_propagation(input_train, is_train=False) 32count_train = np.sum(np.argmax(output_layer.y, 33 axis=1) == np.argmax(correct_train, axis=1)) 34 35# 結果の計算, backpropagationなし 36forward_propagation(input_test, is_train=False) 37count_test = np.sum(np.argmax(output_layer.y, 38 axis = 1) == np.argmax(correct_test, axis=1)) 39 40print("Accuracy Train:", str(count_train/n_train*100) + "%", 41 "Accuracy Test:", str(count_test/n_test*100) + "%")

投稿2019/08/16 13:01

m3yrin

総合スコア132

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

python

1138 forward_propagation(input_train) 2... 3TypeError: forward_propagation() missing 1 required positional argument: 'is_train'

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

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

python

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

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

投稿2019/08/13 09:25

siruku6

総合スコア1382

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問