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

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

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

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

解決済

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

dahachin
dahachin

総合スコア17

Python

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

3回答

0評価

0クリップ

1012閲覧

投稿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

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

良い質問の評価を上げる

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

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

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

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

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

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

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

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

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

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

まだ回答がついていません

会員登録して回答してみよう

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

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

Python

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