teratail header banner
teratail header banner
質問するログイン新規登録

質問編集履歴

2

タイトルの変更

2019/11/23 07:51

投稿

hidekun-
hidekun-

スコア4

title CHANGED
@@ -1,1 +1,1 @@
1
- shapes (32,2) and (1,30) not aligned: 2 (dim 1) != 1 (dim 0)の内積計算エラーを解決したい
1
+ ニューラルネットワークに内の内積計算エラーを解決したい
body CHANGED
File without changes

1

該当コード、エラー内容を分かりやすくした

2019/11/23 07:51

投稿

hidekun-
hidekun-

スコア4

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