前提・実現したいこと
機械学習初心者です.
持っているデータを学習用データとテスト用データに分けて学習モデルの作成を試みています.
機械学習は分類問題の例が多いため,分類問題のページをを参考にしながら回帰問題に取り組んでいます.参考にさせて頂いたサイトはこちらです.
https://qiita.com/Nezura/items/87985d24c3559c504759
1,leran関数から出力される,y_trainの数値が小さい
2,予測値と正解値を用いて正解率を変更したいのですが以下のエラーがででしまいます.
発生している問題・エラーメッセージ
Traceback (most recent call last): File "C:/Users/edpl-np2/PycharmProjects/test1/DNN.py", line 130, in <module> train_rate, train_err = accuracy_rate(y_train, t_train), squared_error(y_train, t_train) File "C:/Users/edpl-np2/PycharmProjects/test1/DNN.py", line 97, in accuracy_rate if (error >= 1) and (error <= 1): ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
該当のソースコード
python
1import numpy as np 2 3# affine変換 入力層と中間層(1)の間 4def affine(z, w, b): 5 return np.dot(z, w) + b 6 7# affine変換勾配 8def affine_back(du, z, w, b): 9 dz = np.dot(du, w.T) 10 dw = np.dot(z.T, du) 11 db = np.dot(np.ones(z.shape[0]).T, du) 12 return dz, dw, db 13 14# 活性化関数(シグモイド) 中間層 15def sigmoid(u): 16 return 1 / (1 + np.exp(-u)) 17 18# 活性化関数(シグモイド)勾配 中間層の勾配 19def sigmoid_back(u): 20 return (1 - sigmoid(u)) * sigmoid(u) 21# 活性化関数(恒等関数) 出力層 22def identity(u): 23 return u 24 25# 二乗和誤差:回帰問題でもちいる 26def squared_error(y, t): 27 return 0.5 * np.sum((y - t) ** 2) / y.shape[0] 28 29# 誤差(二乗和誤差)+活性化関数(恒等関数)勾配 30def identity_mean_squared_error_back(y, t): 31 return (y - t) / y.shape[0] 32 33# 学習部分 34def learn(x, t, w1, b1, w2, b2, w3, b3, lr): 35 # 順伝播 (入力データから、予測データを求めるまで) 36 u1 = affine(x, w1, b1) 37 z1 = sigmoid(u1) 38 u2 = affine(z1, w2, b2) 39 z2 = sigmoid(u2) 40 u3 = affine(z2, w3, b3) 41 y = identity(u3) 42 # 逆伝播 (勾配の計算を求め、重みの更新を行う部分) 43 dy = identity_mean_squared_error_back(y,t) 44 dz2, dw3, db3 = affine_back(dy, z2, w3, b3) 45 du2 = sigmoid_back(u2) 46 dz1, dw2, db2 = affine_back(du2, z1, w2, b2) 47 du1 = sigmoid_back(u1) 48 dx, dw1, db1 = affine_back(du1, x, w1, b1) 49 # 重み、バイアスの更新 50 w1 = w1 - lr * dw1 51 b1 = b1 - lr * db1 52 w2 = w2 - lr * dw2 53 b2 = b2 - lr * db2 54 w3 = w3 - lr * dw3 55 b3 = b3 - lr * db3 56 57 return w1, b1, w2, b2, w3, b3 58 59 60def predict(x, w1, b1, w2, b2, w3, b3): 61 # 順伝播 62 u1 = affine(x, w1, b1) 63 z1 = sigmoid(u1) 64 u2 = affine(z1, w2, b2) 65 z2 = sigmoid(u2) 66 u3 = affine(z2, w3, b3) 67 y = identity(u3) 68 return y 69 70# 実行プログラム 71 72# 地震データ読み込み 73import pandas as pd 74from sklearn.model_selection import train_test_split 75 76df = pd.read_csv('earthquake.csv') 77 78# データの作成 説明変数・目的変数分ける 79df_x = df.drop("regulatory period", axis=1) 80df_t = df["regulatory period"] 81 82#正解データを一次元配列から二次元配列に変換 83df_t_s=df_t.values 84df_t_a=np.reshape(df_t_s, [111, 1]) 85# 説明変数・目的変数をそれぞれ訓練データ・テストデータに分割 86x_train, x_test, t_train, t_test = train_test_split(df_x, df_t_a, test_size=0.3) 87 88#正解率 89def accuracy_rate(y, t): 90 error = y - t 91 if (error >= 1) and (error <= 1): 92 allow_error = y 93 return np.sum(allow_error) / y.shape[0] 94 95# ノード数設定 96d0 = x_train.shape[1] 97d1 = 100 # 1層目のノード数 98d2 = 50 # 2層目のノード数 99d3 = 1 100 101# 重みの初期化(-0.1~0.1の乱数) 102np.random.seed(8) 103w1 = np.random.rand(d0, d1) * 0.2 - 0.1 104w2 = np.random.rand(d1, d2) * 0.2 - 0.1 105w3 = np.random.rand(d2, d3) * 0.2 - 0.1 106 107# バイアスの初期化(0) 108b1 = np.zeros(d1) 109b2 = np.zeros(d2) 110b3 = np.zeros(d3) 111 112# 学習率 113lr = 0.5 114# バッチサイズ 115batch_size = 3 116# 学習回数 117epoch =100 118 119# 予測(学習データ) 120y_train = predict(x_train, w1, b1, w2, b2, w3, b3) 121# 予測(テストデータ) 122y_test = predict(x_test, w1, b1, w2, b2, w3, b3) 123# 正解率、誤差表示 124train_rate, train_err = accuracy_rate(y_train, t_train), squared_error(y_train, t_train) 125test_rate, test_err = accuracy_rate(y_test, t_test), squared_error(y_test, t_test) 126print("{0:3d} train_rate={1:6.2f}% test_rate={2:6.2f}% train_err={3:8.5f} test_err={4:8.5f}".format((0), train_rate*100, test_rate*100, train_err, test_err)) 127 128 129for i in range(epoch): 130 # 学習 131 for j in range(0, x_train.shape[0], batch_size): 132 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) 133 # 予測(学習データ) 134 y_train = predict(x_train, w1, b1, w2, b2, w3, b3) 135 # 予測(テストデータ) 136 y_test = predict(x_test, w1, b1, w2, b2, w3, b3) 137 # 正解率、誤差表示 138 train_rate = accuracy_rate(y_train, t_train) 139 test_rate = accuracy_rate(y_test, t_test) 140 print("{0:3d} train_rate={1:6.2f}% test_rate={2:6.2f}% train_err={3:8.5f} test_err={4:8.5f}".format((i + 1),train_rate * 100,test_rate * 100,train_err,test_err)) 141print(batch_size, epoch) 142 143 144
def accuracy_rate(y, t): error = y - t if (error >= 1) and (error <= 1): allow_error = y return np.sum(allow_error) / y.shape[0] 予測値が正解データとプラスマイナス1の値であれば正解数を増やし,正解率を出力するというコードを書こうとしました
試したこと
1,leran関数から出力される,y_trainの数値が小さい
に関しては手計算で確かめてみたのですが,関数自体は間違っていなそうでした.
色々調べてみたのですが,慣れ親しんでいない自分にはお手上げ状態でした...少しの情報でもいいのでどうかご教授願います.質問に関して不明な点があれば返信よろしくお願いします.
補足情報(FW/ツールのバージョンなど)
Windows 7 Professional
python 3.6.7
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/12/20 03:59