teratail header banner
teratail header banner
質問するログイン新規登録

質問編集履歴

8

誤字。修正

2017/07/01 09:14

投稿

zakio49
zakio49

スコア29

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関数を変更する必要がて、model.ckptの値が反映できないのではないかとその互換性で躓いています。
30
+ **ただ、実践データは学習データと異なり正解のデータがないのでcsvファイルの列も一つ少ないので、モデルの組み方が異なると、最初に学習の時に使ったinterface()関数をそのまま使えないのwith tf.Session() as sess2:ないで新たに関数を定義したらmodel.ckptの値が反映できないのではないかとそのあたりで躓いています。
31
+ 現状の実践データ正解データも込みで行っていますがエラーが発生しておりなかなかうまくいきません。よろしくお願いいたします
28
32
  **
29
33
  ````
30
34
 

7

修正コード

2017/07/01 09:14

投稿

zakio49
zakio49

スコア29

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

2017/07/01 09:10

投稿

zakio49
zakio49

スコア29

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,出力層の出力が教師データに近づいてるのかを表す尺度として損失関数を重みやバイアスの変数微分(偏微分)し2乗誤差 Eをを小さくする指定した今回は10000回)
43
+ 1,出力層の出力が教師データに近づいてるのかを表す尺度として損失関数を重みやバイアスで指定した回数10000回)偏微分を行い。2乗誤差 Eをを小さくしようとする
27
44
  2,その時の重み、ベクトル量を保持する。
28
- 3,新たな入力(実践データ)に対して、保持された重みとバイアス用いて入力と重みとバイアスの値からどう推定するか定めた関数に入れることで(今回は**inference(score_placeholder)**適当な値が予想できると思っています。
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

修正

2017/07/01 08:52

投稿

zakio49
zakio49

スコア29

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がもっとも小さい値を求め指定した今回は10000回)
26
+ 1,出力層の出力が教師データに近づいてるのかを表す尺度として損失関数を重みやバイアスの変数で微分(偏微分)し2乗誤差 Eをを小さくする指定した今回は10000回)
19
27
  2,その時の重み、ベクトル量を保持する。
20
- 3,新たな入力(践データ)に対して、定められた重二乗誤差を用いてoutput()を通ることで適当な値が予想できると思っています。
28
+ 3,新たな入力(践データ)に対して、保持された重バイアス用いて入力と重みとバイアスの値からどう推定すか定めた関数に入れることで(今回は**inference(score_placeholder)**)適当な値が予想できると思っています。
21
29
 
22
30
 
23
31
  *誤差逆伝播法の理解に誤りがありました、入力ノードから次の層へのリンク一つ一つにランダムで割り当てられた重みがつき、それらの和がシグモイド関数orReLU関数に入力されて次の層のノードに入力され、行きついた値と教師データの値との間の誤差をみて、重みを変化させるフィードバックを与えるという理解をしています。

4

理解の修正

2017/07/01 08:35

投稿

zakio49
zakio49

スコア29

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,出力層の出力が教師信号に近づいてるのかを表す尺度として2乗誤差 Eがもっとも小さい値を保持す
18
+ 1,出力層の出力が教師データに近づいてるのかを表す尺度として2乗誤差 Eがもっとも小さい値を求め(指定した今回は10000回)
18
- 2,その時の重さは 2乗誤差 Eから復元でき
19
+ 2,その時の重み、ベクトル量を保持す
19
- 3,新たな入力に対して、定められた重さと二乗誤差を用いてoutput()を通ることで適当な値が予想できると思っています。
20
+ 3,新たな入力(践データ)に対して、定められた重さと二乗誤差を用いてoutput()を通ることで適当な値が予想できると思っています。
20
21
 
22
+
21
- *誤差逆伝播法の理解に誤りがありました、入力ノードの一つ一つにランダムで割り当てられた重がつき、それらの和がグモイドorRuLA関数に入力されて次の層のノードに入力され、行きついた値と教師データの値との間の誤差をみて、重みを変化させるフィードバックを与えるという理解をしています。
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

モデルの再利用部分のコードの修正をさせていただきました。

2017/07/01 08:20

投稿

zakio49
zakio49

スコア29

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',global_step=100)
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("new_data.csv"), delimiter=",")
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
- #復元して、学習して得られた損失関数の値を使新しく読込んだ値から予想計算するよにoutput関数にくぐらせ
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(output, feed_dict=feed_dict_test2)
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
- resess.close()
132
+ sess2.close()
137
133
  ````

2

誤差逆伝播法の理解を追記

2017/07/01 08:10

投稿

zakio49
zakio49

スコア29

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

現状の理解について追記

2017/06/30 21:35

投稿

zakio49
zakio49

スコア29

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("one_record.csv"), delimiter=",")
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={