質問編集履歴

3

構成を変更

2021/12/07 03:02

投稿

aiueo12345
aiueo12345

スコア41

test CHANGED
File without changes
test CHANGED
@@ -6,9 +6,7 @@
6
6
 
7
7
 
8
8
 
9
- 例として以下のようなモデルがあったとします。
9
+ ###### ネットワークモデル
10
-
11
-
12
10
 
13
11
  ```python
14
12
 
@@ -30,17 +28,173 @@
30
28
 
31
29
  model = tf.keras.Model(inputs=inputs, outputs=outputs)
32
30
 
31
+ ```例として↑のようなモデルがあったとします。
32
+
33
+
34
+
35
+ ###### カスタム損失関数
36
+
37
+ ```python
38
+
39
+ def my_loss(y_true, y_pred):
40
+
41
+ layer = model.get_layer('layer001')
42
+
43
+ weights = layer.get_weights()[0] # 学習パラメータの取得
44
+
45
+
46
+
47
+ # weightsを用いてlossを計算したい
48
+
49
+ loss = tf.keras.losses.SparseCategoricalCrossentropy()(y_true, y_pred)
50
+
51
+ return loss
52
+
53
+ ```このとき、カスタム損失関数my_lossを↑のように定義したとします。
54
+
55
+ my_lossの中ではmodelの学習パラメータを取得します。(本当は取得したパラメータを損失の計算に用いたい。)
56
+
57
+
58
+
59
+ ###### 学習実行
60
+
61
+ ```python
62
+
63
+ model.compile(optimizer='adam',
64
+
65
+ loss=my_loss,
66
+
67
+ metrics=['accuracy'])
68
+
69
+
70
+
71
+ (x_train, y_train), (x_test, y_test) = tf.keras.datasets.mnist.load_data()
72
+
73
+ history = model.fit(x_train, y_train, batch_size=4, epochs=20)
74
+
33
75
  ```
34
76
 
35
-
77
+ ##### エラー
78
+
36
-
79
+ ```ERROR
80
+
81
+ Traceback (most recent call last):
82
+
83
+
84
+
85
+ File "C:\Users\ユーザー名\Desktop\sample.py", line 25, in <module>
86
+
87
+
88
+
89
+ File "C:\Users\ユーザー名\anaconda3\lib\site-packages\keras\utils\traceback_utils.py", line 67, in error_handler
90
+
91
+ raise e.with_traceback(filtered_tb) from None
92
+
93
+
94
+
95
+ File "C:\Users\ユーザー名\anaconda3\lib\site-packages\tensorflow\python\framework\func_graph.py", line 1129, in autograph_handler
96
+
97
+ raise e.ag_error_metadata.to_exception(e)
98
+
99
+
100
+
101
+ RuntimeError: in user code:
102
+
103
+
104
+
105
+ File "C:\Users\ユーザー名\anaconda3\lib\site-packages\keras\engine\training.py", line 878, in train_function *
106
+
107
+ return step_function(self, iterator)
108
+
109
+ File "C:\Users\ユーザー名\anaconda3\lib\site-packages\keras\engine\training.py", line 867, in step_function **
110
+
111
+ outputs = model.distribute_strategy.run(run_step, args=(data,))
112
+
113
+ File "C:\Users\ユーザー名\anaconda3\lib\site-packages\keras\engine\training.py", line 860, in run_step **
114
+
115
+ outputs = model.train_step(data)
116
+
117
+ File "C:\Users\ユーザー名\anaconda3\lib\site-packages\keras\engine\training.py", line 809, in train_step
118
+
119
+ loss = self.compiled_loss(
120
+
121
+ File "C:\Users\ユーザー名\anaconda3\lib\site-packages\keras\engine\compile_utils.py", line 201, in __call__
122
+
123
+ loss_value = loss_obj(y_t, y_p, sample_weight=sw)
124
+
125
+ File "C:\Users\ユーザー名\anaconda3\lib\site-packages\keras\losses.py", line 141, in __call__
126
+
127
+ losses = call_fn(y_true, y_pred)
128
+
129
+ File "C:\Users\ユーザー名\anaconda3\lib\site-packages\keras\losses.py", line 245, in call **
130
+
131
+ return ag_fn(y_true, y_pred, **self._fn_kwargs)
132
+
133
+ File "C:\Users\ユーザー名\Desktop\sample.py", line 13, in my_loss **
134
+
135
+
136
+
137
+ File "C:\Users\ユーザー名\anaconda3\lib\site-packages\keras\engine\base_layer.py", line 1906, in get_weights
138
+
139
+ return backend.batch_get_value(output_weights)
140
+
141
+ File "C:\Users\ユーザー名\anaconda3\lib\site-packages\keras\backend.py", line 3872, in batch_get_value
142
+
143
+ raise RuntimeError('Cannot get value inside Tensorflow graph function.')
144
+
145
+
146
+
147
+ RuntimeError: Cannot get value inside Tensorflow graph function.
148
+
37
- このき、カスム損失関数my_lossのように定義したとします。
149
+ ```例してMNISTデーセットでモデル学習以下のように実行する、エラーが発生します。
150
+
38
-
151
+ ※windowsのユーザー名は「ユーザー名」に置き換えました。
152
+
153
+ ※また、プログラム13行目は「layer.get_weights()」の行に対応しています。
154
+
155
+
156
+
157
+ 「layer.get_weights()」でエラーが発生しているようです。
158
+
39
- my_lossのではmodelの学習パラメータを取得します
159
+ ちなみに、my_lossの外(モデル作成直後など)では学習パラメータを取得することができま
160
+
161
+
162
+
40
-
163
+ 損失関数内でパラメータを取得することはできないのでしょうか。
164
+
41
-
165
+ 可能であるならば、どのようにすればよいでしょうか。
166
+
167
+
168
+
42
-
169
+ ご回答何卒よろしくお願いいたします。
170
+
171
+
172
+
173
+
174
+
175
+ ### プログラム全体
176
+
43
- ```python
177
+ ```python
178
+
179
+ import tensorflow as tf
180
+
181
+
182
+
183
+ inputs = tf.keras.Input(shape=(28, 28))
184
+
185
+ x = tf.keras.layers.Flatten()(inputs)
186
+
187
+ x = tf.keras.layers.Dense(128, activation='relu', name='layer001')(x)
188
+
189
+ x = tf.keras.layers.Dropout(0.2)(x)
190
+
191
+ outputs = tf.keras.layers.Dense(10, activation='softmax')(x)
192
+
193
+
194
+
195
+ model = tf.keras.Model(inputs=inputs, outputs=outputs)
196
+
197
+
44
198
 
45
199
  def my_loss(y_true, y_pred):
46
200
 
@@ -56,176 +210,20 @@
56
210
 
57
211
  return loss
58
212
 
213
+
214
+
215
+ model.compile(optimizer='adam',
216
+
217
+ loss=my_loss,
218
+
219
+ metrics=['accuracy'])
220
+
221
+
222
+
223
+ (x_train, y_train), (x_test, y_test) = tf.keras.datasets.mnist.load_data()
224
+
225
+
226
+
227
+ history = model.fit(x_train, y_train, batch_size=4, epochs=20)
228
+
59
229
  ```
60
-
61
-
62
-
63
- 例としてMNISTデータセットでモデル学習を以下のように実行すると、エラーが発生します。
64
-
65
-
66
-
67
- ```python
68
-
69
- model.compile(optimizer='adam',
70
-
71
- loss=my_loss,
72
-
73
- metrics=['accuracy'])
74
-
75
-
76
-
77
- (x_train, y_train), (x_test, y_test) = tf.keras.datasets.mnist.load_data()
78
-
79
- history = model.fit(x_train, y_train, batch_size=4, epochs=20)
80
-
81
- ```
82
-
83
- ```ERROR
84
-
85
- Traceback (most recent call last):
86
-
87
-
88
-
89
- File "C:\Users\ユーザー名\Desktop\sample.py", line 25, in <module>
90
-
91
-
92
-
93
- File "C:\Users\ユーザー名\anaconda3\lib\site-packages\keras\utils\traceback_utils.py", line 67, in error_handler
94
-
95
- raise e.with_traceback(filtered_tb) from None
96
-
97
-
98
-
99
- File "C:\Users\ユーザー名\anaconda3\lib\site-packages\tensorflow\python\framework\func_graph.py", line 1129, in autograph_handler
100
-
101
- raise e.ag_error_metadata.to_exception(e)
102
-
103
-
104
-
105
- RuntimeError: in user code:
106
-
107
-
108
-
109
- File "C:\Users\ユーザー名\anaconda3\lib\site-packages\keras\engine\training.py", line 878, in train_function *
110
-
111
- return step_function(self, iterator)
112
-
113
- File "C:\Users\ユーザー名\anaconda3\lib\site-packages\keras\engine\training.py", line 867, in step_function **
114
-
115
- outputs = model.distribute_strategy.run(run_step, args=(data,))
116
-
117
- File "C:\Users\ユーザー名\anaconda3\lib\site-packages\keras\engine\training.py", line 860, in run_step **
118
-
119
- outputs = model.train_step(data)
120
-
121
- File "C:\Users\ユーザー名\anaconda3\lib\site-packages\keras\engine\training.py", line 809, in train_step
122
-
123
- loss = self.compiled_loss(
124
-
125
- File "C:\Users\ユーザー名\anaconda3\lib\site-packages\keras\engine\compile_utils.py", line 201, in __call__
126
-
127
- loss_value = loss_obj(y_t, y_p, sample_weight=sw)
128
-
129
- File "C:\Users\ユーザー名\anaconda3\lib\site-packages\keras\losses.py", line 141, in __call__
130
-
131
- losses = call_fn(y_true, y_pred)
132
-
133
- File "C:\Users\ユーザー名\anaconda3\lib\site-packages\keras\losses.py", line 245, in call **
134
-
135
- return ag_fn(y_true, y_pred, **self._fn_kwargs)
136
-
137
- File "C:\Users\ユーザー名\Desktop\sample.py", line 13, in my_loss **
138
-
139
-
140
-
141
- File "C:\Users\ユーザー名\anaconda3\lib\site-packages\keras\engine\base_layer.py", line 1906, in get_weights
142
-
143
- return backend.batch_get_value(output_weights)
144
-
145
- File "C:\Users\ユーザー名\anaconda3\lib\site-packages\keras\backend.py", line 3872, in batch_get_value
146
-
147
- raise RuntimeError('Cannot get value inside Tensorflow graph function.')
148
-
149
-
150
-
151
- RuntimeError: Cannot get value inside Tensorflow graph function.
152
-
153
- ```※windowsのユーザー名は「ユーザー名」に置き換えました。
154
-
155
- ※また、プログラム13行目は「layer.get_weights()」の行に対応しています。
156
-
157
-
158
-
159
- 「layer.get_weights()」でエラーが発生しているようです。
160
-
161
- ちなみに、my_lossの外(モデル作成直後など)では学習パラメータを取得することができました。
162
-
163
-
164
-
165
- 損失関数内でパラメータを取得することはできないのでしょうか。
166
-
167
- 可能であるならば、どのようにすればよいでしょうか。
168
-
169
-
170
-
171
- ご回答何卒よろしくお願いいたします。
172
-
173
-
174
-
175
-
176
-
177
- ### プログラム全体
178
-
179
- ```python
180
-
181
- import tensorflow as tf
182
-
183
-
184
-
185
- inputs = tf.keras.Input(shape=(28, 28))
186
-
187
- x = tf.keras.layers.Flatten()(inputs)
188
-
189
- x = tf.keras.layers.Dense(128, activation='relu', name='layer001')(x)
190
-
191
- x = tf.keras.layers.Dropout(0.2)(x)
192
-
193
- outputs = tf.keras.layers.Dense(10, activation='softmax')(x)
194
-
195
-
196
-
197
- model = tf.keras.Model(inputs=inputs, outputs=outputs)
198
-
199
-
200
-
201
- def my_loss(y_true, y_pred):
202
-
203
- layer = model.get_layer('layer001')
204
-
205
- weights = layer.get_weights()[0] # 学習パラメータの取得
206
-
207
-
208
-
209
- # weightsを用いてlossを計算したい
210
-
211
- loss = tf.keras.losses.SparseCategoricalCrossentropy()(y_true, y_pred)
212
-
213
- return loss
214
-
215
-
216
-
217
- model.compile(optimizer='adam',
218
-
219
- loss=my_loss,
220
-
221
- metrics=['accuracy'])
222
-
223
-
224
-
225
- (x_train, y_train), (x_test, y_test) = tf.keras.datasets.mnist.load_data()
226
-
227
-
228
-
229
- history = model.fit(x_train, y_train, batch_size=4, epochs=20)
230
-
231
- ```

2

誤字の修正

2021/12/07 03:02

投稿

aiueo12345
aiueo12345

スコア41

test CHANGED
File without changes
test CHANGED
@@ -152,7 +152,7 @@
152
152
 
153
153
  ```※windowsのユーザー名は「ユーザー名」に置き換えました。
154
154
 
155
- ※また、プログラム20行目は
155
+ ※また、プログラム13行目は「layer.get_weights()」の行に対応しています。
156
156
 
157
157
 
158
158
 

1

タイトル修正、コードの修正

2021/12/07 02:54

投稿

aiueo12345
aiueo12345

スコア41

test CHANGED
@@ -1 +1 @@
1
- TensorFlowのカスタム損失でモデルのパラメータを取得したい
1
+ TensorFlowのカスタム損失で学習パラメータを取得したい
test CHANGED
@@ -42,8 +42,6 @@
42
42
 
43
43
  ```python
44
44
 
45
- # カスタム損失
46
-
47
45
  def my_loss(y_true, y_pred):
48
46
 
49
47
  layer = model.get_layer('layer001')
@@ -78,8 +76,6 @@
78
76
 
79
77
  (x_train, y_train), (x_test, y_test) = tf.keras.datasets.mnist.load_data()
80
78
 
81
-
82
-
83
79
  history = model.fit(x_train, y_train, batch_size=4, epochs=20)
84
80
 
85
81
  ```