回答編集履歴

4

2018/09/27 05:17

投稿

tiitoi
tiitoi

スコア21956

test CHANGED
@@ -138,12 +138,204 @@
138
138
 
139
139
  ```
140
140
 
141
+ 予測結果は、分類するクラスに対するそれぞれの確率のことを意図していました。
142
+
141
- 精度等はコールバック関数を利用して取得きるのですが、入力データと予測結果の取得方法がわかりません
143
+ また、バッチ処理ランダムにサンプリングされた入力取得したいです
142
-
144
+
143
- ```
145
+ ```
144
-
145
-
146
-
147
- 予測結果とは、validation 誤差/精度のことでしょうか?
146
+
148
-
147
+
148
+
149
- だとすると、上記のコールバック関数の引数にその情報は渡ってこなので、自分でミニバッチを作成し、 [train_on_batch()](https://keras.io/ja/models/model/) で1バッチ分学習したあと、バッチごとに行いたい処理を書きます。
149
+ 上記のコールバック関数の引数で対応できないなので、自分でミニバッチを作成し、 [train_on_batch()](https://keras.io/ja/models/model/) で1バッチ分学習したあと、バッチごとに行いたい処理を書きます。
150
+
151
+
152
+
153
+ 以下は次の処理を行うサンプルコードになります。
154
+
155
+
156
+
157
+ * 1イテレーションごとのみにバッチの入力を取得する。
158
+
159
+ * 1エポックごとにテストデータによる各クラスの分類精度と混合行列を表示する。
160
+
161
+
162
+
163
+ ```python
164
+
165
+ import numpy as np
166
+
167
+ import seaborn as sn
168
+
169
+ from keras.datasets import mnist
170
+
171
+ from keras.layers import Activation, BatchNormalization, Dense, Dropout
172
+
173
+ from keras.models import Sequential
174
+
175
+ from keras.utils.np_utils import to_categorical
176
+
177
+ from sklearn import metrics
178
+
179
+
180
+
181
+ # MNIST データを取得する。
182
+
183
+ (x_train, y_train), (x_test, y_test) = mnist.load_data()
184
+
185
+ print('x_train.shape', x_train.shape) # x_train.shape (60000, 28, 28)
186
+
187
+ print('y_train.shape', y_train.shape) # y_train.shape (60000,)
188
+
189
+ print('x_test.shape', x_test.shape) # x_test.shape (10000, 28, 28)
190
+
191
+ print('y_test.shape', y_test.shape) # y_test.shape (10000,)
192
+
193
+
194
+
195
+ # モデルを作成する。
196
+
197
+ model = Sequential()
198
+
199
+ model.add(Dense(10, input_dim=784))
200
+
201
+ model.add(BatchNormalization())
202
+
203
+ model.add(Activation('relu'))
204
+
205
+ model.add(Dense(10))
206
+
207
+ model.add(BatchNormalization())
208
+
209
+ model.add(Activation('relu'))
210
+
211
+ model.add(Dense(10))
212
+
213
+ model.add(BatchNormalization())
214
+
215
+ model.add(Activation('softmax'))
216
+
217
+ model.compile(optimizer='adam',
218
+
219
+ loss='categorical_crossentropy',
220
+
221
+ metrics=['accuracy'])
222
+
223
+
224
+
225
+ def get_batch(x, y, batch_size, shuffle=False):
226
+
227
+ '''ミニバッチを生成するジェネレーター関数
228
+
229
+ '''
230
+
231
+ num_samples = len(x)
232
+
233
+ if shuffle:
234
+
235
+ indices = np.random.permutation(num_samples)
236
+
237
+ else:
238
+
239
+ indices = np.random.arange(num_samples)
240
+
241
+ num_iterations = np.ceil(num_samples / batch_size).astype(int)
242
+
243
+ for itr in range(num_iterations):
244
+
245
+ start = batch_size * itr
246
+
247
+ excerpt = indices[start:start + batch_size]
248
+
249
+ yield x[excerpt], y[excerpt]
250
+
251
+
252
+
253
+ # モデルの入力に合わせて1次元配列にする。 (28, 28) -> (784,) にする
254
+
255
+ x_train = x_train.reshape(len(x_train), -1)
256
+
257
+ x_test = x_test.reshape(len(x_test), -1)
258
+
259
+
260
+
261
+ # one-hot 表現に変換する。
262
+
263
+ y_train_onehot = to_categorical(y_train)
264
+
265
+
266
+
267
+ # 学習する。
268
+
269
+ epochs = 10
270
+
271
+ for i in range(epochs):
272
+
273
+ for x_batch, y_batch in get_batch(x_train, y_train_onehot, batch_size=128, shuffle=True):
274
+
275
+ # x_batch, y_batch が生成されたミニバッチ
276
+
277
+
278
+
279
+ # 1バッチ分学習する
280
+
281
+ model.train_on_batch(x_batch, y_batch)
282
+
283
+
284
+
285
+ # エポックごとにテストデータで推論する。
286
+
287
+ indices = np.random.randint(0, len(x_test), 100)
288
+
289
+ y_pred = model.predict_classes(x_test[indices])
290
+
291
+
292
+
293
+ # 混合行列を表示する。
294
+
295
+ cmx = metrics.confusion_matrix(y_test[indices], y_pred)
296
+
297
+ accuracies = (cmx.astype(np.float) / cmx.sum(axis=1)).diagonal()
298
+
299
+ for label, accuracy in enumerate(accuracies):
300
+
301
+ print('class: {}: {:.2%}'.format(label, accuracy))
302
+
303
+
304
+
305
+ plt.figure(figsize=(6, 6))
306
+
307
+ sn.heatmap(cmx)
308
+
309
+ plt.show()
310
+
311
+ ```
312
+
313
+
314
+
315
+ ![イメージ説明](8c9e4c2f0d35a94b301b0a76293cba1c.png)
316
+
317
+
318
+
319
+ ```
320
+
321
+ class: 0: 100.00%
322
+
323
+ class: 1: 100.00%
324
+
325
+ class: 2: 100.00%
326
+
327
+ class: 3: 91.67%
328
+
329
+ class: 4: 75.00%
330
+
331
+ class: 5: 90.91%
332
+
333
+ class: 6: 100.00%
334
+
335
+ class: 7: 90.91%
336
+
337
+ class: 8: 87.50%
338
+
339
+ class: 9: 100.00%
340
+
341
+ ```

3

2018/09/27 05:17

投稿

tiitoi
tiitoi

スコア21956

test CHANGED
@@ -146,4 +146,4 @@
146
146
 
147
147
  予測結果とは、validation 誤差/精度のことでしょうか?
148
148
 
149
- だとすると、上記のコールバック関数の引数にその情報は渡ってこないので、自分でサンプルデータを作成し、 [train_on_batch](https://keras.io/ja/models/model/) で1バッチ分学習したあと、バッチごとに行いたい処理を書きます。
149
+ だとすると、上記のコールバック関数の引数にその情報は渡ってこないので、自分でミニバッチを作成し、 [train_on_batch()](https://keras.io/ja/models/model/) で1バッチ分学習したあと、バッチごとに行いたい処理を書きます。

2

2018/09/24 11:47

投稿

tiitoi
tiitoi

スコア21956

test CHANGED
File without changes

1

追記

2018/09/24 11:47

投稿

tiitoi
tiitoi

スコア21956

test CHANGED
@@ -129,3 +129,21 @@
129
129
 
130
130
 
131
131
  ```
132
+
133
+
134
+
135
+ ## 質問の内容について
136
+
137
+
138
+
139
+ ```
140
+
141
+ 精度等はコールバック関数を利用して取得できるのですが、入力データと予測結果の取得方法がわかりません。
142
+
143
+ ```
144
+
145
+
146
+
147
+ 予測結果とは、validation 誤差/精度のことでしょうか?
148
+
149
+ だとすると、上記のコールバック関数の引数にその情報は渡ってこないので、自分でサンプルデータを作成し、 [train_on_batch](https://keras.io/ja/models/model/) で1バッチ分学習したあと、バッチごとに行いたい処理を書きます。