質問編集履歴

2

質問内容の簡潔化

2018/12/22 00:53

投稿

Amanokawa
Amanokawa

スコア41

test CHANGED
@@ -1 +1 @@
1
- [TensorFlow]学習したvariableの値二つのグラフで分けて保存したい
1
+ [TensorFlow]学習したmodelを保存したい
test CHANGED
@@ -1,10 +1,10 @@
1
1
  tensorflowを使ってGANを学習させているのですが、generatorとdiscriminatorを別々に保存・復元できるようにしたいです。
2
2
 
3
- variable全て"gen"と"dis"のどちらかのscopeに属しているグラフを作成しました。
3
+ graphそれぞれ"gen"と"dis"のscopeに属すよう作成しました。
4
4
 
5
5
  そのうえで、saverをそれぞれ以下のように定義し、
6
6
 
7
- ```TF
7
+ ```python
8
8
 
9
9
  gen_var = tf.get_collection(tf.GraphKeys.TRAINABLE_VARIABLES, "gen")
10
10
 
@@ -16,9 +16,9 @@
16
16
 
17
17
  ```
18
18
 
19
- それぞれのモデルの保存と
19
+ 学習後それぞれの保存と
20
20
 
21
- ```TF
21
+ ```python
22
22
 
23
23
  saver_gen.save(sess, MODEL_GEN_DIR + "model.ckpt")
24
24
 
@@ -28,7 +28,9 @@
28
28
 
29
29
  復元をこのように記述しています。
30
30
 
31
- ```TF
31
+ ```python
32
+
33
+ sess.tf.global_variables_initializer()
32
34
 
33
35
  saver_gen.restore(sess, MODEL_GEN_DIR + "model.ckpt")
34
36
 
@@ -36,86 +38,12 @@
36
38
 
37
39
  ```
38
40
 
39
- saveとrestoreを行う際はエラーも出ず一見うまくいっているようなのですが、どうもgeneratorの出力が保存時と復元時で異なっているようなのです。
41
+ saveとrestoreを行う際はエラーも出ず一見うまくいっているようなのですが、出力が保存時と復元時で異なっているようなのです。
42
+
43
+ variableを詳しく調べてみると、tf.contrib.layers.batch_norm()で使用される'(スコープ)/moving_mean'と'(スコープ)/moving_variance'のvariableが保存されていない事がわかりました。
44
+
45
+ どうやら、batch_normのvariableの内gammaとbetaはtf.get_collection(tf.GraphKeys.TRAINABLE_VARIABLES)で取得できるが、moving_meanとmoving_varianceは取得できていないようです。
40
46
 
41
47
 
42
48
 
43
- 恐らく原因はgeneratorに入れたtf.contrib.layers.batch_norm()なのではないかと思っています。
44
-
45
- 学習する際に
46
-
47
- ```TF
48
-
49
- with tf.control_dependencies(tf.get_collection(tf.GraphKeys.UPDATE_OPS, "gen")):
50
-
51
- tf.train.AdamOptimizer(learning_rate=GEN_LEARNING_RATE).minimize(
52
-
53
- g_loss, var_list=gen_var, name="gen_opt"
54
-
55
- )
56
-
57
- ```
58
-
59
- の様にtf.GraphKeys.UPDATE_OPSを指定しなければなりません。
60
-
61
- tf.GraphKeys.UPDATE_OPSがなんなのか理解できていないのですが、このあたりがあやしいような・・・
62
-
63
-
64
-
65
- スコープを指定せずに全てを保存した場合はしっかりと復元できている事は確認しています。
66
-
67
- グラフを二つに分けて保存した際、完全な復元をするにはどのようにすればよいでか?御教示お願いします。
49
+ この2変数の取得はどのように行えばよいでしょうか?御教示お願いします。
68
-
69
-
70
-
71
- ---
72
-
73
- 追記
74
-
75
- モデルをrestoreする際に、先にglobal_variables_initializer()を使用せずやってみたところ
76
-
77
- ```TF
78
-
79
- FailedPreconditionError (see above for traceback): Attempting to use uninitialized value "BNまでのスコープ"/moving_mean>
80
-
81
- ```
82
-
83
- とエラーが出ました。
84
-
85
- optimizerがvariableを持っている事は知っているので、ここではoptimizer関連のエラーのみが出ると思っていましたが、どうやらtf.GraphKeys.TRAINABLE_VARIABLES以外のvariable(?)が存在しているのですかね?
86
-
87
-
88
-
89
- tf.contrib.layers.batch_norm()関連の変数ですが、
90
-
91
- tf.get_collection(tf.GraphKeys.TRAINABLE_VARIABLES)で
92
-
93
- ```TF
94
-
95
- <tf.Variable "BNまでのスコープ"/gamma:0' shape=(32,) dtype=float32_ref>
96
-
97
- <tf.Variable "BNまでのスコープ"/beta:0' shape=(32,) dtype=float32_ref>
98
-
99
- ```
100
-
101
- tf.get_collection(tf.GraphKeys.UPDATE_OPS)で
102
-
103
- ```TF
104
-
105
- Tensor("BNまでのスコープ"/AssignMovingAvg:0", shape=(32,), dtype=float32_ref)
106
-
107
- Tensor("BNまでのスコープ"/AssignMovingAvg_1:0", shape=(32,), dtype=float32_ref)
108
-
109
- ```
110
-
111
- が取得できます。
112
-
113
-
114
-
115
- そもそもtf.GraphKeys.TRAINABLE_VARIABLESにはoptimizerの変数が含まれていない様なので、sarver定義時に入れる変数名はTRAINABLE_VARIABLESだけでは足りていないということになるのでしょうか。
116
-
117
-
118
-
119
- タイトルは「グラフを二つに分けたい」でしたが、質問の内容が少し変わりました。
120
-
121
- modelを保存する際に全ての情報を指定し、引数を指定しないtf.train.Saver()と同じsarverを作るにはどうすればよいのでしょうか?

1

追記

2018/12/22 00:53

投稿

Amanokawa
Amanokawa

スコア41

test CHANGED
File without changes
test CHANGED
@@ -65,3 +65,57 @@
65
65
  スコープを指定せずに全てを保存した場合はしっかりと復元できている事は確認しています。
66
66
 
67
67
  グラフを二つに分けて保存した際、完全な復元をするにはどのようにすればよいですか?御教示お願いします。
68
+
69
+
70
+
71
+ ---
72
+
73
+ 追記
74
+
75
+ モデルをrestoreする際に、先にglobal_variables_initializer()を使用せずやってみたところ
76
+
77
+ ```TF
78
+
79
+ FailedPreconditionError (see above for traceback): Attempting to use uninitialized value "BNまでのスコープ"/moving_mean>
80
+
81
+ ```
82
+
83
+ とエラーが出ました。
84
+
85
+ optimizerがvariableを持っている事は知っているので、ここではoptimizer関連のエラーのみが出ると思っていましたが、どうやらtf.GraphKeys.TRAINABLE_VARIABLES以外のvariable(?)が存在しているのですかね?
86
+
87
+
88
+
89
+ tf.contrib.layers.batch_norm()関連の変数ですが、
90
+
91
+ tf.get_collection(tf.GraphKeys.TRAINABLE_VARIABLES)で
92
+
93
+ ```TF
94
+
95
+ <tf.Variable "BNまでのスコープ"/gamma:0' shape=(32,) dtype=float32_ref>
96
+
97
+ <tf.Variable "BNまでのスコープ"/beta:0' shape=(32,) dtype=float32_ref>
98
+
99
+ ```
100
+
101
+ tf.get_collection(tf.GraphKeys.UPDATE_OPS)で
102
+
103
+ ```TF
104
+
105
+ Tensor("BNまでのスコープ"/AssignMovingAvg:0", shape=(32,), dtype=float32_ref)
106
+
107
+ Tensor("BNまでのスコープ"/AssignMovingAvg_1:0", shape=(32,), dtype=float32_ref)
108
+
109
+ ```
110
+
111
+ が取得できます。
112
+
113
+
114
+
115
+ そもそもtf.GraphKeys.TRAINABLE_VARIABLESにはoptimizerの変数が含まれていない様なので、sarver定義時に入れる変数名はTRAINABLE_VARIABLESだけでは足りていないということになるのでしょうか。
116
+
117
+
118
+
119
+ タイトルは「グラフを二つに分けたい」でしたが、質問の内容が少し変わりました。
120
+
121
+ modelを保存する際に全ての情報を指定し、引数を指定しないtf.train.Saver()と同じsarverを作るにはどうすればよいのでしょうか?