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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

1回答

929閲覧

ニューラルネットワークの予測値の出力

Bonziri

総合スコア16

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2019/06/27 09:47

編集2019/07/09 02:15

NNの予測値を出力する方法がわかりません

tensorflowを用いてNNを構築し学習させることはできたのですが,学習させていないデータに対する予測値を出力する方法がわかりません.
記述コードの最後にあるy_predictedにNNから出力される予測値をいれたいのですが,どうすればいいのかわかりません.
また,sess.run(train_step, feed_dict = {X: batch_x, t: batch_t})のtrain_stepの部分がlossやaccに変わっているのを見かけるのですが,よくわかっていません.これはできればでいいので教えてください.
よろしくお願いします。

記述コード

##ミニバッチ学習 num_epoch = 10000 num_data = train_x.shape[0] batch_size = 10 batch_t=[0]*batch_size for epoch in range(num_epoch): sff_idx = np.random.permutation(num_data) ##転置でデータの向きを合わせる for idx in range(0, num_data, batch_size): batch_x = train_x[sff_idx[idx: idx + batch_size]] for i in range(0,batch_size,1): batch_t[i] = train_t[sff_idx[i]] batch_x = batch_x.T sess.run(train_step, feed_dict = {X: batch_x, t: batch_t}) if epoch % 100 == 0: y_predicted = sess.run(???, feed_dict = {X: test_x.T, t: ???}) rms = sqrt(mean_squared_error(test_t, y_predicted)) print('epoch:{} \n \ RMSE:{}'.format(epoch, rms))

補足情報

jupyter notebook 使用

入力層:60,隠れ層:60,出力層:1
入力データは(60,120)で60次元のデータを120個用意しており,内100個を学習データ,残り20個をテストデータにしています
(120,60)にすると,np.random.permutationするときに列がシャッフルされてしまうため,(60,120)の形でシャッフルしたあとに転置しています.
出力データでは(120,1)で1次元データを120個用意し,内100個を学習データ,残り20個をテストデータにしています

RMSE(平均2乗誤差)をテストデータ20個に対して出そうとする際に,テストデータに対するNNの予測値が必要になっています.

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

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

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

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

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

guest

回答1

0

ベストアンサー

まず、sess.runの基本的使い方は以下のようになります。

sess.run(計算対象変数,feed_dict=計算に必要な変数(辞書型))

ご質問が予測値ということなので、NN中のfが計算対象変数になります。また、このfの計算にはXのみ使用しているようなので、feed_dictには{X:test_x.T}でうまくいくはずです。

投稿2019/06/27 20:34

R.Shigemori

総合スコア3376

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

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

Bonziri

2019/06/28 01:31

回答ありがとうございます ご指摘通り,以下のようにやってみたところ, y_predicted = sess.run(f, feed_dict = {X: test_x.T}) で,エラーなくプログラムを回すことができました しかし,なぜか y_predictedが [[1.][1.]...]と,[1.]が20個出力されてしまい,意味をなしていません そもそも1.とは1.00000....という意味なのでしょうか すいませんが,お願いします
R.Shigemori

2019/06/28 04:15

コードは拝見しましたが、2クラス分類のコードの書き方と多クラス分類のコードの書き方が混ざっているため、期待した結果にならないと思います。 2クラス分類として書くのであれば、softmaxはsigmoidにするとともに、損失関数はゼロに対するエントロピー誤差を考慮する必要があります。 多クラス分類として書くのであれば、ラベルを複数にする必要があります
Bonziri

2019/07/01 08:40 編集

返事が遅くなり申し訳ございません。 ある入力に対する評価値を出力するものをつくっているのですが,この場合多クラス分類に当たるのでしょうか?また,この場合でもsigmoid関数を使うべきだということは,調べてわかったのですが,出力層をsigmoidに変えただけでは結果はかわりませんでした. サイトを参考に書いたものを自分の作りたいものに書き直しているので,よくわからないコードになっているかもしれません. よろしくお願いします。
R.Shigemori

2019/07/01 23:30

評価値の特性によってアプローチ方法が異なります。 採点ルールが決まっている点数のようなもの(例:試験の得点)は、1点と5点は4点の差として比較できる(つまり数値計算できる)ので、数値予測として扱ったほうがうまくいきます。一方、好き・嫌いを1~5の5段階で評価したものは、1と5の間に4の差があるとはいいがたいので、多クラス分類としてアプローチしたほうがうまくいきます。 本件を多クラス分類(例:7段階評価をクラスに見立てる)と仮定すると、 t = tf.placeholder(dtype = tf.float32, shape = [None, R]) のR=1は、多クラスになっていません。クラス数に合わせた2以上の正数を設定する必要があります。また、tに相当するデータも、One-Hot表現を用いて変換する必要があります。 ただ、コードを追っていくと二乗誤差の平均を用いてモデルの評価をしているので、数値データとして扱いたいようにも見えます。この場合は、数値予測モデルとしてコードを書き換える必要があります。 主だったものは以下のとおりです。 f = tf.nn.softmax(f2) は、不要です。(softmaxは値を確率値に変換しているものなので、数値予測の場合は不要) 関数lossの内容をクロスエントロピーから二乗誤差や絶対値誤差などの数値予測系のものに置き換える。 関数accuracyは不要。(他クラスの予測精度を評価する関数のため)
Bonziri

2019/07/05 11:07

丁寧な説明ありがとうございます 正しく出力することができました. 以下は疑問点なのですが, 好き・嫌いを1~5の5段階で評価したものは、1と5の間に4の差があるとはいいがたいので、多クラス分類としてアプローチしたほうがうまくいく とのことですが,この場合,数値予測とそれほど違いが出るものなのでしょうか? 多クラス分類ではユニット数が多くなるため,学習に回数がかかってしまうと懸念しています. そこまで違いがなければ,学習データが少ないので,数値予測でやろうとしています.
R.Shigemori

2019/07/05 13:05

何を正しいとするかによると思います。クラス分類の場合、結果は必ず正数になるので、正確と不正解が明確です。一方、数値予測は端数が出たり、場合によってはマイナス値が出ます。それでも、評価値(r2スコア・二乗誤差など)が良いケースがあるので、判断に悩むところです。 最終的には構築したモデルで何をするかで判断するべきかと思います
Bonziri

2019/07/09 02:13

度々返信が遅れてしまい申し訳ありません. なるほど,やはり明確に決まっているというものではないのですね... 丁寧な説明で非常にわかりやすかったです. ありがとうございました.
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問