前提・実現したいこと
ディープラーニングを用いて、道路の復旧期間日数の予測モデルを構築しています。
説明変数6種類(道路の崩壊程度、道路盛土の高さ、崩壊車線数など)、目的変数1種類(復旧までの日数)としてニュラールネットワークを構築しています。
そのなかで、以下の行列の内積計算エラーメッセージが発生しました。
発生している問題・エラーメッセージ
python
1ValueError Traceback (most recent call last) 2<ipython-input-42-64c8b1648510> in <module> 3 1 for i in range(epoch): 4----> 2 for j in range(0, x_train.shape[0], batch_size): w1, b1, w2, b2, w3, b3 = learn(x_train[j:j + batch_size], t_train[j:j + batch_size], w1, b1, w2, b2, w3, b3, lr) 5 3 # 学習 shape[00]は行の大きさを調べている.ここでは, ,77.よって 0~77の範囲でバッチサイズ文のステップ幅で数列を作成 6 7<ipython-input-33-1c9a75ec0d92> in learn(x, t, w1, b1, w2, b2, w3, b3, lr) 8 10 # 逆伝播 (勾配の計算を求め、重みの更新を行う部分 ) 9 11 dy = identity_mean_squared_error_back(y, t) 10---> 12 dz2, dw3, db3 = affine_back(dy, z2, w3, b3) 11 13 du2 = sigmoid_back(u2) 12 14 dz1, dw2, db2 = affine_back(du2, z1, w2, b2) 13 14<ipython-input-30-e9009ace5ac4> in affine_back(du, z, w, b) 15 9 # affine変換勾配 16 10 def affine_back(du, z, w, b): 17---> 11 dz = np.dot(du, w.T) 18 12 dw = np.dot(z.T, du) 19 13 db = np.dot(np.ones(z.shape[0]).T, du) 20 21ValueError: shapes (32,2) and (1,30) not aligned: 2 (dim 1) != 1 (dim 0) 22
該当のソースコード
python
1import numpy as np 2import pandas as pd 3from sklearn.model_selection import train_test_split 4import matplotlib.pyplot as plt 5import matplotlib.pyplot as plt 6 7# affine変換してる 8def affine(z, w, b): 9return np.dot(z, w) + b 10 11# affine変換勾配 12def affine_back(du, z, w, b): 13dz = np.dot(du, w.T) 14dw = np.dot(z.T, du) 15db = np.dot(np.ones(z.shape[0]).T, du) 16return dz, dw, db 17def sigmoid(u): 18return 1 / (1 + np.exp( u)) 19 20#活性化関数 シグモイド の 勾配,中間層の勾配 21def sigmoid_back(u): 22return (1 sigmoid(u)) * sigmoid(u) 23def identity(u): 24return u 25 26 27#二乗和誤差:回帰問題 28def squared_error(y, t): 29return 0.5 * np.sum((y t) ** 2) / y.shape[0] 30 31 32#誤差 二乗和誤差)+活性化関数 恒等関数 の勾配 33def identity_mean_s 34quared_error_back(y, t): 35return (y t) / y.shape[0] 36 37#学習部分 38def learn(x, t, w1, b1, w2, b2, w3, b3, lr): 39#順伝播 入力データから、予測データを求めるまで 40u1 = affine(x, w1, b1) 41z1 = sigmoid(u1) 42u2 = affine(z1, w2, b2) 43z2 = sigmoid(u2) 44u3 = affine(z2, w3, b3) 45y = identity(u3) 46 47#逆伝播 勾配の計算を求め、重みの更新を行う部分 48dy = identity_mean_squared_error_back(y, t) 49dz2, dw3, db3 = affine_back(dy, z2, w3, b3) 50du2 = sigmoid_back(u2) 51dz1, dw2, db2 = affine_back(du2, z1, w2, b2) 52du 1 = sigmoid_back(u1) 53dx, dw1, db1 = affine_back(du1, x, w1, b1) 54 55#重み、バイアスの更新 56w1 = w1 lr * dw1 57b1 = b1 lr * db1 58w2 = w2 lr * dw2 59b2 = b2 lr * db2 60w3 = w3 lr * dw3 61b3 = b3 lr * db3 62return w1, b1, w2, b2, w3, b3 63 64def predict(x, w1, b1, w2, b2, w3, b3): 65#順伝播 66u1 = affine(x, w1, b1) 67z1 = sigmoid(u1) 68u2 = affine(z1, w2, b2) 69z2 = sigmoid(u2) 70u3 = affine(z2, w3, b3) 71y = identity(u3) 72return y 73 74#実行プログラム 75#地震データ読み込み 76df = pd.read_csv('earthquake_B_traffic.csv') 77 78# データの作成データの作成 説明変数・目的変数分ける説明変数・目的変数分ける 79df_x = df.drop("regulatory period", axis=1) 80p= df.drop("damage range", axis=1) 81q= p.drop( "embankment height", axis=1) 82r= q.drop("landform", axis=1) 83s= r.drop("banking structure", axis=1) 84t= s.drop("damage form", axis=1) 85u= t.drop("traffic", axis=1) 86 87# 説明変数・目的変数をそれぞれ訓練データ・テストデータに分割説明変数・目的変数をそれぞれ訓練データ・テストデータに分割 88x_train, x_test, t_train, t_test = train_test_split(df_x, t, test_size=0.3) 89 90#ノード数設定 91d0 = x_train.shape[1] 92d1 = 30 # 1層目のノード 数 93d2 = 30 # 2層目のノード数 94d3 = 1 #出力層 95 96#重みの初期化 0.1 0.1 の乱数 97np.random.seed(8) 98w1 = np.random.rand(d0, d1)*0.001 99w2 = np.random.rand(d1, d2)*0.001 100w3 = np.random.rand(d2, d3)*0.001 101#重みを1 ~0.001 に設定する部分 102 103 104#バイアスの初期化 ( 105b1 = np.zeros(d1) 106b2 = np.zeros(d2) 107b3 = np.z 108eros(d3) 109 110#学習率 111lr = 0.5 112 113#バッチサイズ 114batch_size = 32 115 116#学習回数 117epoch =1000 118 119#グラフを 描写リスト 120x = [0, epoch] 121y = [0.100] 122 123for i in range(epoch): 124for j in range(0, x_train.shape[0], batch_size): w1, b1, w2, b2, w3, b3 = learn(x_train[j:j + batch_size], t_train[j:j + batch_size], w1, b1, w2, b2, w3, b3, 125# 学習 shape[ 00 は行の大きさを調べている.ここでは, 77 .よって 0~77 の範囲でバッチサイズ文のステップ幅で数列を作成 126
試したこと
説明変数の数を6種類から5種類に減らした結果、エラーの発生はなくプログラムが動きました。
ディープラーニングを用いた文字認識のモデルのこーどを参考にしています。
補足情報(FW/ツールのバージョンなど)
(32,2)
→32:バッチサイズ
→2: ?
(1,30)
→1:出力層のサイズ
→30:2層目のノード数
ということはわかっています。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。