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

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

新規登録して質問してみよう
ただいま回答率
85.48%
深層学習

深層学習は、多数のレイヤのニューラルネットワークによる機械学習手法。人工知能研究の一つでディープラーニングとも呼ばれています。コンピューター自体がデータの潜在的な特徴を汲み取り、効率的で的確な判断を実現することができます。

機械学習

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

Python

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

Q&A

解決済

1回答

470閲覧

機械学習 深層学習 正解率 回帰問題

hfha

総合スコア16

深層学習

深層学習は、多数のレイヤのニューラルネットワークによる機械学習手法。人工知能研究の一つでディープラーニングとも呼ばれています。コンピューター自体がデータの潜在的な特徴を汲み取り、効率的で的確な判断を実現することができます。

機械学習

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

Python

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

0グッド

0クリップ

投稿2018/12/19 05:46

前提・実現したいこと

機械学習初心者です.
持っているデータを学習用データとテスト用データに分けて学習モデルの作成を試みています.
機械学習は分類問題の例が多いため,分類問題のページをを参考にしながら回帰問題に取り組んでいます.参考にさせて頂いたサイトはこちらです.
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

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

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

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

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

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

guest

回答1

0

ベストアンサー

https://teratail.com/questions/163741

これと同じような問題のような気がします
このリンクを参照してみてください

投稿2018/12/19 10:05

ko.tu

総合スコア178

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

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

hfha

2018/12/20 03:59

ありがとうございます. all()について調べてみたところ, https://note.nkmk.me/python-all-any-usage/  の記事に,条件式かつ数をカウントできるsum()を見つける事ができ,以下のように変更できました. #正解率 def accuracy_rate(y, t): error = y - t allow_error=sum((i >= -1) and (i <= 1) for i in error) return allow_error / y.shape[0] 質問2に関して解決することができました.助かりました.ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問