質問編集履歴
8
誤字。修正
title
CHANGED
File without changes
|
body
CHANGED
@@ -9,6 +9,9 @@
|
|
9
9
|
TensorFlowでmodelを保存して復元する
|
10
10
|
[http://testpy.hatenablog.com/entry/2017/02/02/000000](http://testpy.hatenablog.com/entry/2017/02/02/000000)
|
11
11
|
|
12
|
+
TensorFlowのPythonコードの初歩を噛み砕いてみる
|
13
|
+
[http://qiita.com/To_Murakami/items/5984a4891597b17fc40e](http://qiita.com/To_Murakami/items/5984a4891597b17fc40e)
|
14
|
+
|
12
15
|
実行環境はwindows10+Anaconda+python3.5+tensorflow1.0~になります
|
13
16
|
|
14
17
|
現状の理解・躓いていると思っている箇所
|
@@ -24,7 +27,8 @@
|
|
24
27
|
4.meta.ckptを復元して、重みをもとに予想を行う関数(interface)にいれる
|
25
28
|
5,sess.runを行い予想値をプリントする。
|
26
29
|
|
27
|
-
**ただ、実践データは学習データと異なり正解のデータがないのでcsvファイルの列も一つ少ないので、モデルの組み方が異なると、interface関数を
|
30
|
+
**ただ、実践データは学習データと異なり正解のデータがないのでcsvファイルの列も一つ少ないので、モデルの組み方が異なると、最初に学習の時に使ったinterface()関数をそのまま使えないのでwith tf.Session() as sess2:ないで新たに関数を定義したらmodel.ckptの値が反映できないのではないかとそのあたりで躓いています。
|
31
|
+
現状の実践データ正解データも込みで行っていますがエラーが発生しておりなかなかうまくいきません。よろしくお願いいたします
|
28
32
|
**
|
29
33
|
````
|
30
34
|
|
7
修正コード
title
CHANGED
File without changes
|
body
CHANGED
@@ -24,14 +24,46 @@
|
|
24
24
|
4.meta.ckptを復元して、重みをもとに予想を行う関数(interface)にいれる
|
25
25
|
5,sess.runを行い予想値をプリントする。
|
26
26
|
|
27
|
+
**ただ、実践データは学習データと異なり正解のデータがないのでcsvファイルの列も一つ少ないので、モデルの組み方が異なると、interface関数を変更する必要がでて、model.ckptの値が反映できないのではないかと、その互換性で躓いています。
|
28
|
+
**
|
29
|
+
````
|
27
30
|
|
31
|
+
with tf.Session() as sess2:
|
32
|
+
# 変数の読み込み
|
33
|
+
#新しいデータ
|
34
|
+
raw_input2 = numpy.loadtxt(open("one_record.csv"), delimiter=",")
|
35
|
+
[tensor, score] = numpy.hsplit(raw_input2, [1])
|
36
|
+
#モデルつくり
|
37
|
+
feed_dict_test2 ={
|
38
|
+
tensor_placeholder: tensor,
|
39
|
+
score_placeholder: score,
|
40
|
+
loss_label_placeholder: "loss_test"
|
41
|
+
}
|
42
|
+
#復元して、損失関数で定まった、重みをもとに予想を行う関数にいれる
|
43
|
+
saver = tf.train.Saver()
|
44
|
+
cwd = os.getcwd()
|
45
|
+
saver.restore(sess2,cwd + "/model.ckpt")
|
46
|
+
best_match2 = sess2.run(inference, feed_dict=feed_dict_test2)
|
47
|
+
print(best_match2)
|
48
|
+
print("fin")
|
49
|
+
sess2.close()
|
50
|
+
````
|
28
51
|
|
29
52
|
|
53
|
+
エラーコード
|
54
|
+
````
|
55
|
+
Traceback (most recent call last):
|
56
|
+
File "tensor_session.py", line 103, in <module>
|
57
|
+
best_match2 = sess2.run(inference, feed_dict=feed_dict_test2)
|
58
|
+
File "C:\Users\takkun\Anaconda3\envs\tensorenv\lib\site-packages\tensorflow\python\client\session.py", line 767, in run
|
59
|
+
run_metadata_ptr)
|
60
|
+
File "C:\Users\takkun\Anaconda3\envs\tensorenv\lib\site-packages\tensorflow\python\client\session.py", line 944, in _run
|
61
|
+
% (np_val.shape, subfeed_t.name, str(subfeed_t.get_shape())))
|
62
|
+
ValueError: Cannot feed value of shape (1,) for Tensor 'tensor_placeholder:0', which has shape '(?, 1)'
|
63
|
+
````
|
30
64
|
|
31
65
|
|
32
66
|
|
33
|
-
|
34
|
-
|
35
67
|
> 二重誤差の最小値が重要ではなくて、重みとバイアスが重要であることがよくわかりました。model.ckpt.metaファイルにそれぞれのリンクの重みの値が書かれていなかったので、二重誤差の値から復元できると勘違いしていました。
|
36
68
|
|
37
69
|
↓結局、model.ckpt.metaはブラックボックスのままなのですが(制御コードとか埋め込まれており)リンクによると MetaGraphDef protocol buffer.がmodel.ckpt.metaファイルをもとにプロセスを復元するから、重みの値はその中で復元されるから、直接は書いてないよという理解をしました。
|
@@ -51,6 +83,7 @@
|
|
51
83
|
|
52
84
|
pythonに不慣れなところもあるのですが、困っているのでぜひ答えていただけたら幸いです。
|
53
85
|
|
86
|
+
|
54
87
|
````
|
55
88
|
|
56
89
|
import tensorflow as tf
|
@@ -158,16 +191,4 @@
|
|
158
191
|
print(best_match2)
|
159
192
|
print("fin")
|
160
193
|
sess2.close()
|
161
|
-
````
|
162
|
-
|
163
|
-
エラーコード
|
164
|
-
````
|
165
|
-
Traceback (most recent call last):
|
166
|
-
File "tensor_session.py", line 103, in <module>
|
167
|
-
best_match2 = sess2.run(inference, feed_dict=feed_dict_test2)
|
168
|
-
File "C:\Users\takkun\Anaconda3\envs\tensorenv\lib\site-packages\tensorflow\python\client\session.py", line 767, in run
|
169
|
-
run_metadata_ptr)
|
170
|
-
File "C:\Users\takkun\Anaconda3\envs\tensorenv\lib\site-packages\tensorflow\python\client\session.py", line 944, in _run
|
171
|
-
% (np_val.shape, subfeed_t.name, str(subfeed_t.get_shape())))
|
172
|
-
ValueError: Cannot feed value of shape (1,) for Tensor 'tensor_placeholder:0', which has shape '(?, 1)'
|
173
194
|
````
|
6
修正2
title
CHANGED
File without changes
|
body
CHANGED
@@ -14,22 +14,40 @@
|
|
14
14
|
現状の理解・躓いていると思っている箇所
|
15
15
|
*修正7/1 17:02
|
16
16
|
|
17
|
-
> 二重誤差の最小値が重要ではなくて、重みとバイアスが重要であることがよくわかりました。model.ckpt.metaファイルに特別重みがの値が書かれていなかったので、二重誤差の値が重要だと勘違いしていました。制御コードが埋め込まれている
|
18
17
|
|
18
|
+
色々な点を修正させていただき新たな疑問として
|
19
19
|
|
20
|
+
復元したモデルを再利用する流れについては
|
21
|
+
1.変数の読み込み(csvファイル)
|
22
|
+
2.使えるデータ形式に変化()
|
23
|
+
3.学習したときに使ったinterface(score_placeholder)で使える形にモデルを作る
|
24
|
+
4.meta.ckptを復元して、重みをもとに予想を行う関数(interface)にいれる
|
25
|
+
5,sess.runを行い予想値をプリントする。
|
26
|
+
|
27
|
+
|
28
|
+
|
29
|
+
|
30
|
+
|
31
|
+
|
32
|
+
|
33
|
+
|
34
|
+
|
35
|
+
> 二重誤差の最小値が重要ではなくて、重みとバイアスが重要であることがよくわかりました。model.ckpt.metaファイルにそれぞれのリンクの重みの値が書かれていなかったので、二重誤差の値から復元できると勘違いしていました。
|
36
|
+
|
20
|
-
↓によると MetaGraphDef protocol buffer.がmodel.ckpt.metaファイルをもとにプロセスを復元するから、重みの値はその中で復元されるから、直接は書いてないよという理解をしました。
|
37
|
+
↓結局、model.ckpt.metaはブラックボックスのままなのですが(制御コードとか埋め込まれており)リンクによると MetaGraphDef protocol buffer.がmodel.ckpt.metaファイルをもとにプロセスを復元するから、重みの値はその中で復元されるから、直接は書いてないよという理解をしました。
|
21
38
|
What is the TensorFlow checkpoint meta file?
|
22
39
|
[https://stackoverflow.com/questions/36195454/what-is-the-tensorflow-checkpoint-meta-file/36203288#36203288](https://stackoverflow.com/questions/36195454/what-is-the-tensorflow-checkpoint-meta-file/36203288#36203288)
|
23
40
|
|
24
41
|
|
25
|
-
ニューラルネットワークの流れというか保持・復元のしていること
|
42
|
+
ニューラルネットワークの流れというか保持・復元のしていること(修正)
|
26
|
-
1,出力層の出力が教師データに近づいてるのかを表す尺度として損失関数を重みやバイアス
|
43
|
+
1,出力層の出力値が教師データに近づいてるのかを表す尺度として損失関数を重みやバイアスで指定した回数(10000回)偏微分を行い。2乗誤差 Eをを小さくしようとする。
|
27
44
|
2,その時の重み、ベクトル量を保持する。
|
28
|
-
3,新たな入力(実践データ)に対して、保持された重みとバイアス用いて
|
45
|
+
3,新たな入力(実践データ)に対して、保持された重みとバイアス用いて実践データを**inference(score_placeholder)**に入れることで適当な値が予想できると思っています。
|
29
46
|
|
30
47
|
|
31
48
|
*誤差逆伝播法の理解に誤りがありました、入力ノードから次の層へのリンク一つ一つにランダムで割り当てられた重みがつき、それらの和がシグモイド関数orReLU関数に入力されて次の層のノードに入力され、行きついた値と教師データの値との間の誤差をみて、重みを変化させるフィードバックを与えるという理解をしています。
|
32
49
|
このままだとプログラムの誤差が最小の値を保持していても、復元した際のノード毎に与える重みはどこに保存されているかがわからず困っています。
|
50
|
+
→直接の値はかかれていないMetaGraphDef protocol bufferの中で復元される認識です(お手上げです)
|
33
51
|
|
34
52
|
pythonに不慣れなところもあるのですが、困っているのでぜひ答えていただけたら幸いです。
|
35
53
|
|
5
修正
title
CHANGED
File without changes
|
body
CHANGED
@@ -4,20 +4,28 @@
|
|
4
4
|
一度学習したものの損失関数の値を保持・復元して、新たな入力に対して予測を行いたいです。お知恵を拝借したいです。よろしくお願い致します。
|
5
5
|
|
6
6
|
ニューラルネットワークでプロ野球選手の給与を査定してみる
|
7
|
-
http://qiita.com/sergeant-wizard/items/9bb45c0850aebca2bc07
|
7
|
+
[http://qiita.com/sergeant-wizard/items/9bb45c0850aebca2bc07](http://qiita.com/sergeant-wizard/items/9bb45c0850aebca2bc07)
|
8
8
|
|
9
9
|
TensorFlowでmodelを保存して復元する
|
10
|
-
http://testpy.hatenablog.com/entry/2017/02/02/000000
|
10
|
+
[http://testpy.hatenablog.com/entry/2017/02/02/000000](http://testpy.hatenablog.com/entry/2017/02/02/000000)
|
11
11
|
|
12
12
|
実行環境はwindows10+Anaconda+python3.5+tensorflow1.0~になります
|
13
13
|
|
14
14
|
現状の理解・躓いていると思っている箇所
|
15
15
|
*修正7/1 17:02
|
16
16
|
|
17
|
+
> 二重誤差の最小値が重要ではなくて、重みとバイアスが重要であることがよくわかりました。model.ckpt.metaファイルに特別重みがの値が書かれていなかったので、二重誤差の値が重要だと勘違いしていました。制御コードが埋め込まれている
|
18
|
+
|
19
|
+
|
20
|
+
↓によると MetaGraphDef protocol buffer.がmodel.ckpt.metaファイルをもとにプロセスを復元するから、重みの値はその中で復元されるから、直接は書いてないよという理解をしました。
|
21
|
+
What is the TensorFlow checkpoint meta file?
|
22
|
+
[https://stackoverflow.com/questions/36195454/what-is-the-tensorflow-checkpoint-meta-file/36203288#36203288](https://stackoverflow.com/questions/36195454/what-is-the-tensorflow-checkpoint-meta-file/36203288#36203288)
|
23
|
+
|
24
|
+
|
17
25
|
ニューラルネットワークの流れというか保持・復元のしていること
|
18
|
-
1,出力層の出力が教師データに近づいてるのかを表す尺度として2乗誤差 E
|
26
|
+
1,出力層の出力が教師データに近づいてるのかを表す尺度として損失関数を重みやバイアスの変数で微分(偏微分)し2乗誤差 Eをを小さくする指定した今回は10000回)
|
19
27
|
2,その時の重み、ベクトル量を保持する。
|
20
|
-
3,新たな入力(践データ)に対して、
|
28
|
+
3,新たな入力(実践データ)に対して、保持された重みとバイアス用いて入力と重みとバイアスの値からどう推定するか定めた関数に入れることで(今回は**inference(score_placeholder)**)適当な値が予想できると思っています。
|
21
29
|
|
22
30
|
|
23
31
|
*誤差逆伝播法の理解に誤りがありました、入力ノードから次の層へのリンク一つ一つにランダムで割り当てられた重みがつき、それらの和がシグモイド関数orReLU関数に入力されて次の層のノードに入力され、行きついた値と教師データの値との間の誤差をみて、重みを変化させるフィードバックを与えるという理解をしています。
|
4
理解の修正
title
CHANGED
File without changes
|
body
CHANGED
@@ -12,13 +12,15 @@
|
|
12
12
|
実行環境はwindows10+Anaconda+python3.5+tensorflow1.0~になります
|
13
13
|
|
14
14
|
現状の理解・躓いていると思っている箇所
|
15
|
+
*修正7/1 17:02
|
15
16
|
|
16
17
|
ニューラルネットワークの流れというか保持・復元のしていること
|
17
|
-
1,出力層の出力が教師
|
18
|
+
1,出力層の出力が教師データに近づいてるのかを表す尺度として2乗誤差 Eがもっとも小さい値を求める(指定した今回は10000回)
|
18
|
-
2,その時の重
|
19
|
+
2,その時の重み、ベクトル量を保持する。
|
19
|
-
3,新たな入力に対して、定められた重さと二乗誤差を用いてoutput()を通ることで適当な値が予想できると思っています。
|
20
|
+
3,新たな入力(践データ)に対して、定められた重さと二乗誤差を用いてoutput()を通ることで適当な値が予想できると思っています。
|
20
21
|
|
22
|
+
|
21
|
-
*誤差逆伝播法の理解に誤りがありました、入力ノードの一つ一つにランダムで割り当てられた重
|
23
|
+
*誤差逆伝播法の理解に誤りがありました、入力ノードから次の層へのリンク一つ一つにランダムで割り当てられた重みがつき、それらの和がシグモイド関数orReLU関数に入力されて次の層のノードに入力され、行きついた値と教師データの値との間の誤差をみて、重みを変化させるフィードバックを与えるという理解をしています。
|
22
24
|
このままだとプログラムの誤差が最小の値を保持していても、復元した際のノード毎に与える重みはどこに保存されているかがわからず困っています。
|
23
25
|
|
24
26
|
pythonに不慣れなところもあるのですが、困っているのでぜひ答えていただけたら幸いです。
|
@@ -130,4 +132,16 @@
|
|
130
132
|
print(best_match2)
|
131
133
|
print("fin")
|
132
134
|
sess2.close()
|
135
|
+
````
|
136
|
+
|
137
|
+
エラーコード
|
138
|
+
````
|
139
|
+
Traceback (most recent call last):
|
140
|
+
File "tensor_session.py", line 103, in <module>
|
141
|
+
best_match2 = sess2.run(inference, feed_dict=feed_dict_test2)
|
142
|
+
File "C:\Users\takkun\Anaconda3\envs\tensorenv\lib\site-packages\tensorflow\python\client\session.py", line 767, in run
|
143
|
+
run_metadata_ptr)
|
144
|
+
File "C:\Users\takkun\Anaconda3\envs\tensorenv\lib\site-packages\tensorflow\python\client\session.py", line 944, in _run
|
145
|
+
% (np_val.shape, subfeed_t.name, str(subfeed_t.get_shape())))
|
146
|
+
ValueError: Cannot feed value of shape (1,) for Tensor 'tensor_placeholder:0', which has shape '(?, 1)'
|
133
147
|
````
|
3
モデルの再利用部分のコードの修正をさせていただきました。
title
CHANGED
File without changes
|
body
CHANGED
@@ -106,32 +106,28 @@
|
|
106
106
|
summary_writer.add_summary(summary_str, step)
|
107
107
|
|
108
108
|
saver=tf.train.Saver()
|
109
|
-
saver.save(sess,cwd+'model.ckpt'
|
109
|
+
saver.save(sess,cwd+'/model.ckpt')
|
110
|
-
|
110
|
+
print(cwd)
|
111
111
|
print('Saved a model.')
|
112
112
|
sess.close()
|
113
113
|
|
114
|
-
|
115
|
-
|
116
|
-
#ここからが復元するコードです。
|
117
114
|
with tf.Session() as sess2:
|
118
115
|
# 変数の読み込み
|
119
|
-
|
116
|
+
#新しいデータ
|
120
|
-
raw_input2 = numpy.loadtxt(open("
|
117
|
+
raw_input2 = numpy.loadtxt(open("one_record.csv"), delimiter=",")
|
121
118
|
[tensor, score] = numpy.hsplit(raw_input2, [1])
|
122
|
-
|
119
|
+
#モデルつくり
|
123
|
-
feed_dict_test2={
|
120
|
+
feed_dict_test2 ={
|
124
121
|
tensor_placeholder: tensor,
|
125
122
|
score_placeholder: score,
|
126
123
|
loss_label_placeholder: "loss_test"
|
127
124
|
}
|
128
|
-
|
125
|
+
#復元して、損失関数で定まった、重みをもとに予想を行う関数にいれる
|
129
126
|
saver = tf.train.Saver()
|
130
127
|
cwd = os.getcwd()
|
131
128
|
saver.restore(sess2,cwd + "/model.ckpt")
|
132
|
-
best_match2 = sess2.run(
|
129
|
+
best_match2 = sess2.run(inference, feed_dict=feed_dict_test2)
|
133
|
-
prediction = tf.argmax(new_data,None)
|
134
130
|
print(best_match2)
|
135
131
|
print("fin")
|
136
|
-
|
132
|
+
sess2.close()
|
137
133
|
````
|
2
誤差逆伝播法の理解を追記
title
CHANGED
File without changes
|
body
CHANGED
@@ -18,6 +18,9 @@
|
|
18
18
|
2,その時の重さは 2乗誤差 Eから復元できる?
|
19
19
|
3,新たな入力に対して、定められた重さと二乗誤差を用いてoutput()を通ることで適当な値が予想できると思っています。
|
20
20
|
|
21
|
+
*誤差逆伝播法の理解に誤りがありました、入力ノードの一つ一つにランダムで割り当てられた重さがつき、それらの和がジグモイドorRuLA関数に入力されて次の層のノードに入力され、行きついた値と教師データの値との間の誤差をみて、重みを変化させるフィードバックを与えるという理解をしています。
|
22
|
+
このままだとプログラムの誤差が最小の値を保持していても、復元した際のノード毎に与える重みはどこに保存されているかがわからず困っています。
|
23
|
+
|
21
24
|
pythonに不慣れなところもあるのですが、困っているのでぜひ答えていただけたら幸いです。
|
22
25
|
|
23
26
|
````
|
1
現状の理解について追記
title
CHANGED
File without changes
|
body
CHANGED
@@ -11,9 +11,15 @@
|
|
11
11
|
|
12
12
|
実行環境はwindows10+Anaconda+python3.5+tensorflow1.0~になります
|
13
13
|
|
14
|
-
|
14
|
+
現状の理解・躓いていると思っている箇所
|
15
15
|
|
16
|
+
ニューラルネットワークの流れというか保持・復元のしていること
|
17
|
+
1,出力層の出力が教師信号に近づいてるのかを表す尺度として2乗誤差 Eがもっとも小さい値を保持する。
|
18
|
+
2,その時の重さは 2乗誤差 Eから復元できる?
|
19
|
+
3,新たな入力に対して、定められた重さと二乗誤差を用いてoutput()を通ることで適当な値が予想できると思っています。
|
16
20
|
|
21
|
+
pythonに不慣れなところもあるのですが、困っているのでぜひ答えていただけたら幸いです。
|
22
|
+
|
17
23
|
````
|
18
24
|
|
19
25
|
import tensorflow as tf
|
@@ -108,7 +114,7 @@
|
|
108
114
|
with tf.Session() as sess2:
|
109
115
|
# 変数の読み込み
|
110
116
|
#新しいデータ
|
111
|
-
raw_input2 = numpy.loadtxt(open("
|
117
|
+
raw_input2 = numpy.loadtxt(open("new_data.csv"), delimiter=",")
|
112
118
|
[tensor, score] = numpy.hsplit(raw_input2, [1])
|
113
119
|
#モデルつくり
|
114
120
|
feed_dict_test2={
|