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

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

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

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

Python 3.x

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

機械学習

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

Python

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

Q&A

1回答

2268閲覧

TensorFlow(CPU)でループ毎に異なる予測値になってしまう

Wind

総合スコア442

深層学習

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

Python 3.x

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

機械学習

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

Python

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

0グッド

0クリップ

投稿2019/05/29 08:56

編集2019/08/28 17:22

#わからないこと
TensorFlow(CPU版)で同じデータを渡して学習し予測しても、ループ毎に異なる予測値になってしまいます。

プログラム実行時は毎回同じ値にはなりますが、プログラム内部で関数をループさせると毎回異なる値になります。(初期化が足りないのでしょうか?)
当然ですがデータのシャッフルは行わず、常に同一データを入れています。

#知りたいこと
ループで同じデータを入れた時に毎回同じ予測値を得るには、他に固定すべき乱数シードがあるのでしょうか?
もしくはCPUでも全く同じ値にはならないのでしょうか?

(TensorFlowのニューラルネットワークを使用して学習して予測した時に、常に同じ予測値になるサンプルが書かれたURLを教えて頂けるだけでも助かります。)

#ソースコード(再現動作可能)
※7/20 kerasで学習が再現できない人へを参考に追記してみました。
※5/30 [sklearnボストンのデータセット]
(https://newtechnologylifestyle.net/%E3%83%9C%E3%82%B9%E3%83%88%E3%83%B3%E5%B8%82%E3%81%AE%E4%BD%8F%E5%AE%85%E4%BE%A1%E6%A0%BC%E3%82%92%E8%AA%BF%E3%81%B9%E3%81%A6%E3%81%BF%E3%82%8B/)を使用して、コピペで動作が再現出来る物に差し替えました。
犯罪発生数を目的変数にして他の説明変数で学習し、予測する形になっています。
実行すると、予測値が毎回異なってしまいます。

Python

1import os 2import pandas as pd 3import numpy as np 4#from sklearn.preprocessing import MinMaxScaler 5from sklearn.preprocessing import StandardScaler 6import tensorflow as tf 7import random 8 9# サンプルデータセット(ボストン) 10from sklearn.datasets import load_boston 11boston = load_boston() 12 13 14#y_bos = pd.DataFrame( boston.target) # 価格は使用しない 15pd_bos = pd.DataFrame(boston.data, columns=boston.feature_names) 16 17bos_test = pd_bos.iloc[0:100, :] # 行 0~100をテストデータにする 18bos_train = pd_bos.iloc[100:500, :] # 行 101~500を訓練データにする 19 20data_columns = bos_train.columns.values[1:] # 説明変数の名前を取得(犯罪数CRIMは目的変数とするので除外) 21#print('説明変数:%s' % data_columns) # 説明変数を表示 22 23 24# DL関数(学習データ, テストデータ) 25# 返り値:予測値, 犯罪数 26def tf_cross(val_train, val_test): 27 # ニューロンの数を設定 28 n_neurons_1 = 256 29 n_neurons_2 = 128 30 31 os.environ['PYTHONHASHSEED'] = '0' 32 random.seed(0) # Pythonの乱数シードを固定 33 np.random.seed(0) # Numpyの乱数シードを固定 34 tf.set_random_seed(0) # TensorFlowの乱数シードを固定 35 36 session_conf = tf.ConfigProto( 37 intra_op_parallelism_threads=1, 38 inter_op_parallelism_threads=1 39 ) 40 # セッションの開始 41 tf_sess = tf.InteractiveSession(config=session_conf) 42 43# random.seed(0) # Pythonの乱数シードを固定 44# np.random.seed(0) # Numpyの乱数シードを固定 45# tf.set_random_seed(0) # TensorFlowの乱数シードを固定 46 47 #値を標準化 48 scaler = StandardScaler() 49 scaler.fit(val_train) 50 val_train_std = scaler.transform(val_train) 51 val_test_std = scaler.transform(val_test) 52 53 y_train_std = val_train_std[:, 0] # 訓練データの目的変数を取得(先頭列) 54 X_train_std = val_train_std[:, 1:] # 訓練データの説明変数を取得(2列目以降) 55 y_test_std = val_test_std[:, 0] # テストデータの目的変数 56 X_test_std = val_test_std[:, 1:] # テストデータの説明変数 57 58 # テストデータの目的変数を標準化から通常の値へ戻す 59 y_test = y_test_std.reshape(len(y_test_std), 1) 60 y_test_inv = np.concatenate((y_test, X_test_std), axis=1) 61 y_test_inv = scaler.inverse_transform(y_test_inv) 62 y_test_inv = y_test_inv[:, 0] 63 64 65 # 訓練データの特徴量の"数"を取得 66 n_stocks = X_train_std.shape[1] # shape[1]は列数 67 68 69 # プレースホルダーの作成 70 X = tf.placeholder(dtype=tf.float32, shape=[None, n_stocks]) 71 Y = tf.placeholder(dtype=tf.float32, shape=[None]) 72 73 74 # 初期化 75 sigma = 1 76 weight_initializer = tf.variance_scaling_initializer(mode="fan_avg", distribution="uniform", scale=sigma) 77 bias_initializer = tf.zeros_initializer() 78 79 # Hidden weights 80 W_hidden_1 = tf.Variable(weight_initializer([n_stocks, n_neurons_1])) 81 bias_hidden_1 = tf.Variable(bias_initializer([n_neurons_1])) 82 W_hidden_2 = tf.Variable(weight_initializer([n_neurons_1, n_neurons_2])) 83 bias_hidden_2 = tf.Variable(bias_initializer([n_neurons_2])) 84 85 86 # 出力の重み 87 W_out = tf.Variable(weight_initializer([n_neurons_2, 1])) # 2層 88 bias_out = tf.Variable(bias_initializer([1])) 89 90 # 隠れ層の設定(ReLU=活性化関数)(収束がすばやいが、極端な出力値が生成される可能性がある) 91# hidden_1 = tf.nn.relu(tf.add(tf.matmul(X, W_hidden_1), bias_hidden_1)) 92# hidden_2 = tf.nn.relu(tf.add(tf.matmul(hidden_1, W_hidden_2), bias_hidden_2)) 93 94 # 隠れ層の設定:活性化関数をシグモイド(極端な出力値が少ないが、収束が遅い) 95 hidden_1 = tf.nn.sigmoid(tf.add(tf.matmul(X, W_hidden_1), bias_hidden_1)) 96 hidden_2 = tf.nn.sigmoid(tf.add(tf.matmul(hidden_1, W_hidden_2), bias_hidden_2)) 97 98 # 出力層の設定 99 out = tf.transpose(tf.add(tf.matmul(hidden_2, W_out), bias_out)) 100 101 # コスト関数 102 mse = tf.reduce_mean(tf.squared_difference(out, Y)) 103 # 最適化関数 104 opt = tf.train.AdamOptimizer().minimize(mse) 105 # 全ての変数を初期化 106 tf_sess.run(tf.global_variables_initializer()) 107 108 # ニューラルネットワークの設定 109 batch_size = 128 110 111 # 訓練開始 n回の反復処理 112 epochs = 100 113 for e in range(epochs): 114 tf_sess.run(opt, feed_dict={X: X_train_std, Y: y_train_std}) # 標準化されたデータで訓練 115 116 # テストデータで予測 117 pred_test = tf_sess.run(out, feed_dict = {X: X_test_std}) 118 119 pred_test = np.concatenate((pred_test.T, X_test_std), axis=1) 120 pred_inv = scaler.inverse_transform(pred_test) # 標準化から戻す 121 pred_inv = pred_inv[:, 0] # 1行目だけ取り出す(予測値) 122 tf_sess.close() # セッションを閉じる 123 124 return pred_inv, y_test_inv # 予測値と犯罪数を返す 125 126 127# ループ 128for dat in data_columns: # カラム数-1でループ 129 ans = tf_cross(bos_train, bos_test) # ***同じデータを毎回渡しているだけなのに、毎回同じ結果にならない*** 130 pred_inv = ans[0] # 予測値 131 y_test_inv = ans[1] # 犯罪発生数 132 133 np.set_printoptions(suppress=True, formatter={'float': '{: 0.3f}'.format}) #printで指数表示を禁止する、小数点第三位まで表示 134 print('犯罪発生数:' , y_test_inv) 135 print('予測値:' , pred_inv) 136

##参考URL
参考URL
kerasで学習が再現できない人へ

#環境
エディタ:VSCode
Python :3.6.4 64-bit(base:conda)
TensorFlow:1.13.1

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

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

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

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

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

guest

回答1

0

まず、警告はCPUの最適化オプション関連で今回とは関係しないです。

https://qiita.com/yuyakato/items/9a5d80e6c7c41e9a9d22

乱数の固定は上のリンクがわかりやすいです。

シード固定とセッション開始の順番を変えてみてはいかがでしょう。

投稿2019/05/29 12:05

編集2019/05/29 12:05
mkgrei

総合スコア8560

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

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

Wind

2019/05/29 12:24

返信ありがとうございます。 TensorFlowはシード固定の順番も大事なのですね、試してみます。
Wind

2019/05/30 00:34

シード固定の順番を変えてみましたが、ダメでした。 セッションの実行前に持って行ってもダメでしたね・・・。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問