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

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

新規登録して質問してみよう
ただいま回答率
85.35%
機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

Python

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

Q&A

0回答

1871閲覧

python_正則化のコーディング

usajin

総合スコア0

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

Python

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

0グッド

1クリップ

投稿2021/07/29 07:10

前提・実現したいこと

初めて投稿させていただきます。
AIの資格取得のため、講義を受けているのですが、
出題されたコーディング問題の解き方が分からず困っております。
解説もいただいているのですが、pythonプログラミングは初心者なので、
よくわからず投稿させていただきました。
以下解説内容

「【問①-1】:lp_norm関数の引数には、「それぞれの全結合層の重みw」を渡します。 for文のfcを用いて、FullyConnectedLayerクラスのインスタンス変数self.wにアクセスするような処理が必要です。 【問①-2】:L2正則化の逆伝播は定義の微分、つまりλ*wとなります。」

うまく質問できていなかったらすみません。

発生している問題・エラーメッセージ

エラーメッセージ

該当のソースコード

# mnistデータセットのロード if os.path.exists('mnist_784'): with open('mnist_784','rb') as f: mnist = pickle.load(f) else: mnist = datasets.fetch_openml('mnist_784') with open('mnist_784', 'wb') as f: pickle.dump(mnist, f) X, T = mnist.data, mnist.target X_train, X_test, T_train, T_test = train_test_split(X, T, test_size=0.2) T_train = np.eye(10)[T_train.astype("int")] T_test = np.eye(10)[T_test.astype("int")] class FullyConnectedLayer(): def __init__(self, input_shape, output_shape): self.w = np.random.randn(input_shape, output_shape) * 0.01 self.b = np.zeros(output_shape, dtype=np.float) self.x = None self.dw = None self.db = None def __call__(self, x): self.x = x out = np.dot(self.x, self.w) + self.b return out def backward(self, dout): dx = np.dot(dout, self.w.T) batch_size = dx.shape[0] self.dw = np.dot(self.x.T, dout) self.db = np.sum(dout, axis=0) return dx class SoftmaxCrossEntropyLoss(): def __init__(self): self.y = None self.t = None self.loss = None def __call__(self, t, y): self.y = softmax(y) self.t = t.copy() self.loss = cross_entropy_error(self.t, self.y) return self.loss def backward(self): batch_size = self.t.shape[0] dy = self.y - self.t dy /= batch_size return dy def softmax(x): x = x.T _x = x - np.max(x, axis=0) _x = np.exp(_x) / np.sum(np.exp(_x), axis=0) return _x.T def cross_entropy_error(t, y): delta = 1e-8 error = -np.mean(t * np.log(y + delta)) return error class ReLU(): def __init__(self): self.mask = None def __call__(self, x): self.mask = (x <= 0) out = x.copy() out[self.mask] = 0 return out def backward(self, dout): dout[self.mask] = 0 dx = dout return dx class Dropout(): def __init__(self, dropout_ratio=0.5): self.dropout_ratio = dropout_ratio self.mask = None def __call__(self, x, train_flg=True): if train_flg: randommatrix = np.random.rand(*x.shape) self.mask = randommatrix > self.dropout_ratio return x * self.mask else: return x * (1.0 - self.dropout_ratio) def backward(self, dout): return dout * self.mask def lp_norm(x, p=2): return np.sum(np.abs(x) ** p) ** (1 / p) #ここからが問題 #問①. dropoutクラスとlp_norm関数を使用し、ドロップアウトとL2ノルム正則化(重み減衰)を含めた以下のネットワークを完成させなさい。 #損失関数に ????2‖????‖22 を正則化項として加えるとする. class MLP_classifier(): def __init__(self, weight_decay_lambda=0): ''' 構造 x -> fc(783, 256) -> relu -> dropout -> fc(256, 256) -> relu -> dropout -> fc(256, 10) -> out ''' # 層の定義 self.fc1 = FullyConnectedLayer(784, 256) self.relu1 = ReLU() self.dropout1 = Dropout() self.fc2 = FullyConnectedLayer(256, 256) self.relu2 = ReLU() self.dropout2 = Dropout() self.fc3 = FullyConnectedLayer(256, 10) self.out = None # 損失関数の定義 self.criterion = SoftmaxCrossEntropyLoss() self.weight_decay_lambda = weight_decay_lambda def forward(self, x, train_flg=True): ''' 順伝播 ''' x = self.relu1(self.fc1(x)) x = self.dropout1(x, train_flg) x = self.relu2(self.fc2(x)) x = self.dropout2(x, train_flg) self.out = self.fc3(x) # 勾配計算の都合上softmaxはこの順伝播関数内では行わない # 予測するときはさらにsoftmaxを通す必要がある return self.out def loss(self, x, t): loss = self.criterion(t, self.forward(x)) for fc in [self.fc1, self.fc2, self.fc3]: loss += #### 問①-1 #### return loss def backward(self): ''' 逆伝播 ''' # 勾配を逆伝播 d = self.criterion.backward() d = self.fc3.backward(d) d = self.dropout2.backward(d) d = self.relu2.backward(d) d = self.fc2.backward(d) d = self.dropout1.backward(d) d = self.relu1.backward(d) d = self.fc1.backward(d) for fc in [self.fc1, self.fc2, self.fc3]: fc.dw += #### 問①-2 #### def optimize_GradientDecent(self, lr): ''' 勾配降下法による全層のパラメータの更新 ''' for fc in [self.fc1, self.fc2, self.fc3]: fc.w -= lr * fc.dw fc.b -= lr * fc.db

試したこと

下記のようなコードを試したのですが、うまくいきませんでした。

#### 問①-1 #### loss += 0.5 * self.weight_decay_lambda * np.sum(lp_norm(FullyConnectedLayer[self.w]) ** 2) #### 問①-2 #### fc.dw += self.weight_decay_lambda * FullyConnectedLayer["fc"]

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

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

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

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

アカウントをお持ちの方は

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問