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

回答編集履歴

4

2018/09/27 05:17

投稿

tiitoi
tiitoi

スコア21962

answer CHANGED
@@ -68,8 +68,104 @@
68
68
  ## 質問の内容について
69
69
 
70
70
  ```
71
+ 予測結果は、分類するクラスに対するそれぞれの確率のことを意図していました。
71
- 精度等はコールバック関数を利用して取得きるのですが、入力データと予測結果の取得方法がわかりません
72
+ また、バッチ処理ランダムにサンプリングされた入力取得したいです
72
73
  ```
73
74
 
74
- 予測結果とは、validation 誤差/精度のことでしょうか?
75
- だとすると、上記のコールバック関数の引数にその情報は渡ってこないので、自分でミニバッチを作成し、 [train_on_batch()](https://keras.io/ja/models/model/) で1バッチ分学習したあと、バッチごとに行いたい処理を書きます。
75
+ 上記のコールバック関数の引数で対応できないことなので、自分でミニバッチを作成し、 [train_on_batch()](https://keras.io/ja/models/model/) で1バッチ分学習したあと、バッチごとに行いたい処理を書きます。
76
+
77
+ 以下は次の処理を行うサンプルコードになります。
78
+
79
+ * 1イテレーションごとのみにバッチの入力を取得する。
80
+ * 1エポックごとにテストデータによる各クラスの分類精度と混合行列を表示する。
81
+
82
+ ```python
83
+ import numpy as np
84
+ import seaborn as sn
85
+ from keras.datasets import mnist
86
+ from keras.layers import Activation, BatchNormalization, Dense, Dropout
87
+ from keras.models import Sequential
88
+ from keras.utils.np_utils import to_categorical
89
+ from sklearn import metrics
90
+
91
+ # MNIST データを取得する。
92
+ (x_train, y_train), (x_test, y_test) = mnist.load_data()
93
+ print('x_train.shape', x_train.shape) # x_train.shape (60000, 28, 28)
94
+ print('y_train.shape', y_train.shape) # y_train.shape (60000,)
95
+ print('x_test.shape', x_test.shape) # x_test.shape (10000, 28, 28)
96
+ print('y_test.shape', y_test.shape) # y_test.shape (10000,)
97
+
98
+ # モデルを作成する。
99
+ model = Sequential()
100
+ model.add(Dense(10, input_dim=784))
101
+ model.add(BatchNormalization())
102
+ model.add(Activation('relu'))
103
+ model.add(Dense(10))
104
+ model.add(BatchNormalization())
105
+ model.add(Activation('relu'))
106
+ model.add(Dense(10))
107
+ model.add(BatchNormalization())
108
+ model.add(Activation('softmax'))
109
+ model.compile(optimizer='adam',
110
+ loss='categorical_crossentropy',
111
+ metrics=['accuracy'])
112
+
113
+ def get_batch(x, y, batch_size, shuffle=False):
114
+ '''ミニバッチを生成するジェネレーター関数
115
+ '''
116
+ num_samples = len(x)
117
+ if shuffle:
118
+ indices = np.random.permutation(num_samples)
119
+ else:
120
+ indices = np.random.arange(num_samples)
121
+ num_iterations = np.ceil(num_samples / batch_size).astype(int)
122
+ for itr in range(num_iterations):
123
+ start = batch_size * itr
124
+ excerpt = indices[start:start + batch_size]
125
+ yield x[excerpt], y[excerpt]
126
+
127
+ # モデルの入力に合わせて1次元配列にする。 (28, 28) -> (784,) にする
128
+ x_train = x_train.reshape(len(x_train), -1)
129
+ x_test = x_test.reshape(len(x_test), -1)
130
+
131
+ # one-hot 表現に変換する。
132
+ y_train_onehot = to_categorical(y_train)
133
+
134
+ # 学習する。
135
+ epochs = 10
136
+ for i in range(epochs):
137
+ for x_batch, y_batch in get_batch(x_train, y_train_onehot, batch_size=128, shuffle=True):
138
+ # x_batch, y_batch が生成されたミニバッチ
139
+
140
+ # 1バッチ分学習する
141
+ model.train_on_batch(x_batch, y_batch)
142
+
143
+ # エポックごとにテストデータで推論する。
144
+ indices = np.random.randint(0, len(x_test), 100)
145
+ y_pred = model.predict_classes(x_test[indices])
146
+
147
+ # 混合行列を表示する。
148
+ cmx = metrics.confusion_matrix(y_test[indices], y_pred)
149
+ accuracies = (cmx.astype(np.float) / cmx.sum(axis=1)).diagonal()
150
+ for label, accuracy in enumerate(accuracies):
151
+ print('class: {}: {:.2%}'.format(label, accuracy))
152
+
153
+ plt.figure(figsize=(6, 6))
154
+ sn.heatmap(cmx)
155
+ plt.show()
156
+ ```
157
+
158
+ ![イメージ説明](8c9e4c2f0d35a94b301b0a76293cba1c.png)
159
+
160
+ ```
161
+ class: 0: 100.00%
162
+ class: 1: 100.00%
163
+ class: 2: 100.00%
164
+ class: 3: 91.67%
165
+ class: 4: 75.00%
166
+ class: 5: 90.91%
167
+ class: 6: 100.00%
168
+ class: 7: 90.91%
169
+ class: 8: 87.50%
170
+ class: 9: 100.00%
171
+ ```

3

2018/09/27 05:17

投稿

tiitoi
tiitoi

スコア21962

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

2

2018/09/24 11:47

投稿

tiitoi
tiitoi

スコア21962

answer CHANGED
File without changes

1

追記

2018/09/24 11:47

投稿

tiitoi
tiitoi

スコア21962

answer CHANGED
@@ -63,4 +63,13 @@
63
63
  validation_data=(x_test, y_test),
64
64
  callbacks=[MyCallback()])
65
65
 
66
- ```
66
+ ```
67
+
68
+ ## 質問の内容について
69
+
70
+ ```
71
+ 精度等はコールバック関数を利用して取得できるのですが、入力データと予測結果の取得方法がわかりません。
72
+ ```
73
+
74
+ 予測結果とは、validation 誤差/精度のことでしょうか?
75
+ だとすると、上記のコールバック関数の引数にその情報は渡ってこないので、自分でサンプルデータを作成し、 [train_on_batch](https://keras.io/ja/models/model/) で1バッチ分学習したあと、バッチごとに行いたい処理を書きます。