質問編集履歴

8

誤字。修正

2017/07/01 09:14

投稿

zakio49
zakio49

スコア29

test CHANGED
File without changes
test CHANGED
@@ -20,6 +20,12 @@
20
20
 
21
21
 
22
22
 
23
+ TensorFlowのPythonコードの初歩を噛み砕いてみる
24
+
25
+ [http://qiita.com/To_Murakami/items/5984a4891597b17fc40e](http://qiita.com/To_Murakami/items/5984a4891597b17fc40e)
26
+
27
+
28
+
23
29
  実行環境はwindows10+Anaconda+python3.5+tensorflow1.0~になります
24
30
 
25
31
 
@@ -50,7 +56,9 @@
50
56
 
51
57
 
52
58
 
53
- **ただ、実践データは学習データと異なり正解のデータがないのでcsvファイルの列も一つ少ないので、モデルの組み方が異なると、interface関数を変更する必要がて、model.ckptの値が反映できないのではないかとその互換性で躓いています。
59
+ **ただ、実践データは学習データと異なり正解のデータがないのでcsvファイルの列も一つ少ないので、モデルの組み方が異なると、最初に学習の時に使ったinterface()関数をそのまま使えないのwith tf.Session() as sess2:ないで新たに関数を定義したらmodel.ckptの値が反映できないのではないかとそのあたりで躓いています。
60
+
61
+ 現状の実践データ正解データも込みで行っていますがエラーが発生しておりなかなかうまくいきません。よろしくお願いいたします
54
62
 
55
63
  **
56
64
 

7

修正コード

2017/07/01 09:14

投稿

zakio49
zakio49

スコア29

test CHANGED
File without changes
test CHANGED
@@ -50,15 +50,79 @@
50
50
 
51
51
 
52
52
 
53
-
53
+ **ただ、実践データは学習データと異なり正解のデータがないのでcsvファイルの列も一つ少ないので、モデルの組み方が異なると、interface関数を変更する必要がでて、model.ckptの値が反映できないのではないかと、その互換性で躓いています。
54
+
54
-
55
+ **
56
+
55
-
57
+ ````
58
+
59
+
60
+
56
-
61
+ with tf.Session() as sess2:
62
+
57
-
63
+ # 変数の読み込み
64
+
58
-
65
+ #新しいデータ
66
+
59
-
67
+ raw_input2 = numpy.loadtxt(open("one_record.csv"), delimiter=",")
68
+
60
-
69
+ [tensor, score] = numpy.hsplit(raw_input2, [1])
70
+
61
-
71
+ #モデルつくり
72
+
73
+ feed_dict_test2 ={
74
+
75
+ tensor_placeholder: tensor,
76
+
77
+ score_placeholder: score,
78
+
79
+ loss_label_placeholder: "loss_test"
80
+
81
+ }
82
+
83
+ #復元して、損失関数で定まった、重みをもとに予想を行う関数にいれる
84
+
85
+ saver = tf.train.Saver()
86
+
87
+ cwd = os.getcwd()
88
+
89
+ saver.restore(sess2,cwd + "/model.ckpt")
90
+
91
+ best_match2 = sess2.run(inference, feed_dict=feed_dict_test2)
92
+
93
+ print(best_match2)
94
+
95
+ print("fin")
96
+
97
+ sess2.close()
98
+
99
+ ````
100
+
101
+
102
+
103
+
104
+
105
+ エラーコード
106
+
107
+ ````
108
+
109
+ Traceback (most recent call last):
110
+
111
+ File "tensor_session.py", line 103, in <module>
112
+
113
+ best_match2 = sess2.run(inference, feed_dict=feed_dict_test2)
114
+
115
+ File "C:\Users\takkun\Anaconda3\envs\tensorenv\lib\site-packages\tensorflow\python\client\session.py", line 767, in run
116
+
117
+ run_metadata_ptr)
118
+
119
+ File "C:\Users\takkun\Anaconda3\envs\tensorenv\lib\site-packages\tensorflow\python\client\session.py", line 944, in _run
120
+
121
+ % (np_val.shape, subfeed_t.name, str(subfeed_t.get_shape())))
122
+
123
+ ValueError: Cannot feed value of shape (1,) for Tensor 'tensor_placeholder:0', which has shape '(?, 1)'
124
+
125
+ ````
62
126
 
63
127
 
64
128
 
@@ -104,6 +168,8 @@
104
168
 
105
169
 
106
170
 
171
+
172
+
107
173
  ````
108
174
 
109
175
 
@@ -319,27 +385,3 @@
319
385
  sess2.close()
320
386
 
321
387
  ````
322
-
323
-
324
-
325
- エラーコード
326
-
327
- ````
328
-
329
- Traceback (most recent call last):
330
-
331
- File "tensor_session.py", line 103, in <module>
332
-
333
- best_match2 = sess2.run(inference, feed_dict=feed_dict_test2)
334
-
335
- File "C:\Users\takkun\Anaconda3\envs\tensorenv\lib\site-packages\tensorflow\python\client\session.py", line 767, in run
336
-
337
- run_metadata_ptr)
338
-
339
- File "C:\Users\takkun\Anaconda3\envs\tensorenv\lib\site-packages\tensorflow\python\client\session.py", line 944, in _run
340
-
341
- % (np_val.shape, subfeed_t.name, str(subfeed_t.get_shape())))
342
-
343
- ValueError: Cannot feed value of shape (1,) for Tensor 'tensor_placeholder:0', which has shape '(?, 1)'
344
-
345
- ````

6

修正2

2017/07/01 09:10

投稿

zakio49
zakio49

スコア29

test CHANGED
File without changes
test CHANGED
@@ -30,13 +30,47 @@
30
30
 
31
31
 
32
32
 
33
+
34
+
35
+ 色々な点を修正させていただき新たな疑問として
36
+
37
+
38
+
39
+ 復元したモデルを再利用する流れについては
40
+
41
+ 1.変数の読み込み(csvファイル)
42
+
43
+ 2.使えるデータ形式に変化()
44
+
45
+ 3.学習したときに使ったinterface(score_placeholder)で使える形にモデルを作る
46
+
47
+ 4.meta.ckptを復元して、重みをもとに予想を行う関数(interface)にいれる
48
+
49
+ 5,sess.runを行い予想値をプリントする。
50
+
51
+
52
+
53
+
54
+
55
+
56
+
57
+
58
+
59
+
60
+
61
+
62
+
63
+
64
+
65
+
66
+
67
+
68
+
33
- > 二重誤差の最小値が重要ではなくて、重みとバイアスが重要であることがよくわかりました。model.ckpt.metaファイルに特別重みの値が書かれていなかったので、二重誤差の値が重要だと勘違いしていました。制御コードが埋め込まれている
69
+ > 二重誤差の最小値が重要ではなくて、重みとバイアスが重要であることがよくわかりました。model.ckpt.metaファイルにそれぞれのリンクの重みの値が書かれていなかったので、二重誤差の値から復元できると勘違いしていました。
34
-
35
-
36
-
37
-
38
-
70
+
71
+
72
+
39
- ↓によると MetaGraphDef protocol buffer.がmodel.ckpt.metaファイルをもとにプロセスを復元するから、重みの値はその中で復元されるから、直接は書いてないよという理解をしました。
73
+ 結局、model.ckpt.metaはブラックボックスのままなのですが(制御コードとか埋め込まれており)リンクによると MetaGraphDef protocol buffer.がmodel.ckpt.metaファイルをもとにプロセスを復元するから、重みの値はその中で復元されるから、直接は書いてないよという理解をしました。
40
74
 
41
75
  What is the TensorFlow checkpoint meta file?
42
76
 
@@ -46,13 +80,13 @@
46
80
 
47
81
 
48
82
 
49
- ニューラルネットワークの流れというか保持・復元のしていること
83
+ ニューラルネットワークの流れというか保持・復元のしていること(修正)
50
-
84
+
51
- 1,出力層の出力が教師データに近づいてるのかを表す尺度として損失関数を重みやバイアスの変で微分(偏微分)し2乗誤差 Eをを小さくする指定した今回は10000回)
85
+ 1,出力層の出力が教師データに近づいてるのかを表す尺度として損失関数を重みやバイアスで指定した回数(10000回)偏微分を行い。2乗誤差 Eをを小さくしようとする
52
86
 
53
87
  2,その時の重み、ベクトル量を保持する。
54
88
 
55
- 3,新たな入力(実践データ)に対して、保持された重みとバイアス用いて入力と重みとバイアスの値からどう推定するか定めた関数に入れることで(今回は**inference(score_placeholder)**適当な値が予想できると思っています。
89
+ 3,新たな入力(実践データ)に対して、保持された重みとバイアス用いて実践データを**inference(score_placeholder)**に入れることで適当な値が予想できると思っています。
56
90
 
57
91
 
58
92
 
@@ -62,6 +96,8 @@
62
96
 
63
97
  このままだとプログラムの誤差が最小の値を保持していても、復元した際のノード毎に与える重みはどこに保存されているかがわからず困っています。
64
98
 
99
+ →直接の値はかかれていないMetaGraphDef protocol bufferの中で復元される認識です(お手上げです)
100
+
65
101
 
66
102
 
67
103
  pythonに不慣れなところもあるのですが、困っているのでぜひ答えていただけたら幸いです。

5

修正

2017/07/01 08:52

投稿

zakio49
zakio49

スコア29

test CHANGED
File without changes
test CHANGED
@@ -10,13 +10,13 @@
10
10
 
11
11
  ニューラルネットワークでプロ野球選手の給与を査定してみる
12
12
 
13
- http://qiita.com/sergeant-wizard/items/9bb45c0850aebca2bc07
13
+ [http://qiita.com/sergeant-wizard/items/9bb45c0850aebca2bc07](http://qiita.com/sergeant-wizard/items/9bb45c0850aebca2bc07)
14
14
 
15
15
 
16
16
 
17
17
  TensorFlowでmodelを保存して復元する
18
18
 
19
- http://testpy.hatenablog.com/entry/2017/02/02/000000
19
+ [http://testpy.hatenablog.com/entry/2017/02/02/000000](http://testpy.hatenablog.com/entry/2017/02/02/000000)
20
20
 
21
21
 
22
22
 
@@ -30,13 +30,29 @@
30
30
 
31
31
 
32
32
 
33
+ > 二重誤差の最小値が重要ではなくて、重みとバイアスが重要であることがよくわかりました。model.ckpt.metaファイルに特別重みがの値が書かれていなかったので、二重誤差の値が重要だと勘違いしていました。制御コードが埋め込まれている
34
+
35
+
36
+
37
+
38
+
39
+ ↓によると MetaGraphDef protocol buffer.がmodel.ckpt.metaファイルをもとにプロセスを復元するから、重みの値はその中で復元されるから、直接は書いてないよという理解をしました。
40
+
41
+ What is the TensorFlow checkpoint meta file?
42
+
43
+ [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)
44
+
45
+
46
+
47
+
48
+
33
49
  ニューラルネットワークの流れというか保持・復元のしていること
34
50
 
35
- 1,出力層の出力が教師データに近づいてるのかを表す尺度として2乗誤差 Eがもっとも小さい値を求め指定した今回は10000回)
51
+ 1,出力層の出力が教師データに近づいてるのかを表す尺度として損失関数を重みやバイアスの変数で微分(偏微分)し2乗誤差 Eをを小さくする指定した今回は10000回)
36
52
 
37
53
  2,その時の重み、ベクトル量を保持する。
38
54
 
39
- 3,新たな入力(践データ)に対して、定められた重二乗誤差を用いてoutput()を通ることで適当な値が予想できると思っています。
55
+ 3,新たな入力(践データ)に対して、保持された重バイアス用いて入力と重みとバイアスの値からどう推定すか定めた関数に入れることで(今回は**inference(score_placeholder)**)適当な値が予想できると思っています。
40
56
 
41
57
 
42
58
 

4

理解の修正

2017/07/01 08:35

投稿

zakio49
zakio49

スコア29

test CHANGED
File without changes
test CHANGED
@@ -26,19 +26,23 @@
26
26
 
27
27
  現状の理解・躓いていると思っている箇所
28
28
 
29
+ *修正7/1 17:02
30
+
29
31
 
30
32
 
31
33
  ニューラルネットワークの流れというか保持・復元のしていること
32
34
 
33
- 1,出力層の出力が教師信号に近づいてるのかを表す尺度として2乗誤差 Eがもっとも小さい値を保持す
35
+ 1,出力層の出力が教師データに近づいてるのかを表す尺度として2乗誤差 Eがもっとも小さい値を求め(指定した今回は10000回)
34
-
36
+
35
- 2,その時の重さは 2乗誤差 Eから復元でき
37
+ 2,その時の重み、ベクトル量を保持す
36
-
38
+
37
- 3,新たな入力に対して、定められた重さと二乗誤差を用いてoutput()を通ることで適当な値が予想できると思っています。
39
+ 3,新たな入力(践データ)に対して、定められた重さと二乗誤差を用いてoutput()を通ることで適当な値が予想できると思っています。
38
-
39
-
40
-
40
+
41
+
42
+
43
+
44
+
41
- *誤差逆伝播法の理解に誤りがありました、入力ノードの一つ一つにランダムで割り当てられた重がつき、それらの和がグモイドorRuLA関数に入力されて次の層のノードに入力され、行きついた値と教師データの値との間の誤差をみて、重みを変化させるフィードバックを与えるという理解をしています。
45
+ *誤差逆伝播法の理解に誤りがありました、入力ノードから次層へのリンク一つ一つにランダムで割り当てられた重がつき、それらの和がグモイド関数orReLU関数に入力されて次の層のノードに入力され、行きついた値と教師データの値との間の誤差をみて、重みを変化させるフィードバックを与えるという理解をしています。
42
46
 
43
47
  このままだとプログラムの誤差が最小の値を保持していても、復元した際のノード毎に与える重みはどこに保存されているかがわからず困っています。
44
48
 
@@ -263,3 +267,27 @@
263
267
  sess2.close()
264
268
 
265
269
  ````
270
+
271
+
272
+
273
+ エラーコード
274
+
275
+ ````
276
+
277
+ Traceback (most recent call last):
278
+
279
+ File "tensor_session.py", line 103, in <module>
280
+
281
+ best_match2 = sess2.run(inference, feed_dict=feed_dict_test2)
282
+
283
+ File "C:\Users\takkun\Anaconda3\envs\tensorenv\lib\site-packages\tensorflow\python\client\session.py", line 767, in run
284
+
285
+ run_metadata_ptr)
286
+
287
+ File "C:\Users\takkun\Anaconda3\envs\tensorenv\lib\site-packages\tensorflow\python\client\session.py", line 944, in _run
288
+
289
+ % (np_val.shape, subfeed_t.name, str(subfeed_t.get_shape())))
290
+
291
+ ValueError: Cannot feed value of shape (1,) for Tensor 'tensor_placeholder:0', which has shape '(?, 1)'
292
+
293
+ ````

3

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

2017/07/01 08:20

投稿

zakio49
zakio49

スコア29

test CHANGED
File without changes
test CHANGED
@@ -214,9 +214,9 @@
214
214
 
215
215
  saver=tf.train.Saver()
216
216
 
217
- saver.save(sess,cwd+'model.ckpt',global_step=100)
217
+ saver.save(sess,cwd+'/model.ckpt')
218
+
218
-
219
+ print(cwd)
219
-
220
220
 
221
221
  print('Saved a model.')
222
222
 
@@ -224,25 +224,19 @@
224
224
 
225
225
 
226
226
 
227
-
228
-
229
-
230
-
231
- #ここからが復元するコードです。
232
-
233
227
  with tf.Session() as sess2:
234
228
 
235
229
  # 変数の読み込み
236
230
 
237
- #新しいデータ
231
+ #新しいデータ
238
-
232
+
239
- raw_input2 = numpy.loadtxt(open("new_data.csv"), delimiter=",")
233
+ raw_input2 = numpy.loadtxt(open("one_record.csv"), delimiter=",")
240
234
 
241
235
  [tensor, score] = numpy.hsplit(raw_input2, [1])
242
236
 
243
- #モデルつくり
237
+ #モデルつくり
244
-
238
+
245
- feed_dict_test2={
239
+ feed_dict_test2 ={
246
240
 
247
241
  tensor_placeholder: tensor,
248
242
 
@@ -252,7 +246,7 @@
252
246
 
253
247
  }
254
248
 
255
- #復元して、学習して得られた損失関数の値を使新しく読込んだ値から予想計算するよにoutput関数にくぐらせ
249
+ #復元して、損失関数で定まをもとに予想をう関数にいれ
256
250
 
257
251
  saver = tf.train.Saver()
258
252
 
@@ -260,14 +254,12 @@
260
254
 
261
255
  saver.restore(sess2,cwd + "/model.ckpt")
262
256
 
263
- best_match2 = sess2.run(output, feed_dict=feed_dict_test2)
257
+ best_match2 = sess2.run(inference, feed_dict=feed_dict_test2)
264
-
265
- prediction = tf.argmax(new_data,None)
266
258
 
267
259
  print(best_match2)
268
260
 
269
261
  print("fin")
270
262
 
271
- resess.close()
263
+ sess2.close()
272
264
 
273
265
  ````

2

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

2017/07/01 08:10

投稿

zakio49
zakio49

スコア29

test CHANGED
File without changes
test CHANGED
@@ -38,6 +38,12 @@
38
38
 
39
39
 
40
40
 
41
+ *誤差逆伝播法の理解に誤りがありました、入力ノードの一つ一つにランダムで割り当てられた重さがつき、それらの和がジグモイドorRuLA関数に入力されて次の層のノードに入力され、行きついた値と教師データの値との間の誤差をみて、重みを変化させるフィードバックを与えるという理解をしています。
42
+
43
+ このままだとプログラムの誤差が最小の値を保持していても、復元した際のノード毎に与える重みはどこに保存されているかがわからず困っています。
44
+
45
+
46
+
41
47
  pythonに不慣れなところもあるのですが、困っているのでぜひ答えていただけたら幸いです。
42
48
 
43
49
 

1

現状の理解について追記

2017/06/30 21:35

投稿

zakio49
zakio49

スコア29

test CHANGED
File without changes
test CHANGED
@@ -24,9 +24,21 @@
24
24
 
25
25
 
26
26
 
27
- より詳細な情報
27
+ 現状の理解・躓いていると思っている箇所
28
+
29
+
30
+
28
-
31
+ ニューラルネットワークの流れというか保持・復元のしていること
32
+
29
-
33
+ 1,出力層の出力が教師信号に近づいてるのかを表す尺度として2乗誤差 Eがもっとも小さい値を保持する。
34
+
35
+ 2,その時の重さは 2乗誤差 Eから復元できる?
36
+
37
+ 3,新たな入力に対して、定められた重さと二乗誤差を用いてoutput()を通ることで適当な値が予想できると思っています。
38
+
39
+
40
+
41
+ pythonに不慣れなところもあるのですが、困っているのでぜひ答えていただけたら幸いです。
30
42
 
31
43
 
32
44
 
@@ -218,7 +230,7 @@
218
230
 
219
231
  #新しいデータ
220
232
 
221
- raw_input2 = numpy.loadtxt(open("one_record.csv"), delimiter=",")
233
+ raw_input2 = numpy.loadtxt(open("new_data.csv"), delimiter=",")
222
234
 
223
235
  [tensor, score] = numpy.hsplit(raw_input2, [1])
224
236