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

回答編集履歴

2

2018/09/29 08:57

投稿

tiitoi
tiitoi

スコア21962

answer CHANGED
@@ -5,6 +5,8 @@
5
5
 
6
6
  ----
7
7
 
8
+ 2個目のコードでは [0, 1] に正規化する処理が入っていないので、学習した際と同じ前処理を行うようにしてみてください。
9
+
8
10
  # MNIST データで 0/1 判定するサンプル
9
11
 
10
12
  ```python

1

a

2018/09/29 08:57

投稿

tiitoi
tiitoi

スコア21962

answer CHANGED
@@ -1,4 +1,77 @@
1
1
  一番確率が高いクラスがどれかという情報だけ得られればよければ、model.predict_classes() を使うと簡潔にかけます。
2
2
 
3
3
  今回の件は validation accuracy が 0.8 なのに、実際テストデータを流すと全部 [[1. 0.]] になるということでしょうか。
4
- 記載いただいた範囲でコードに問題はなさそうなのですが、validation accuracy が 0.8 というのはどのように確認されましたか?
4
+ 記載いただいた範囲でコードに問題はなさそうなのですが、validation accuracy が 0.8 というのはどのように確認されましたか?
5
+
6
+ ----
7
+
8
+ # MNIST データで 0/1 判定するサンプル
9
+
10
+ ```python
11
+ import numpy as np
12
+ from keras.datasets import mnist
13
+ from keras.layers import Activation, BatchNormalization, Dense
14
+ from keras.models import Sequential, model_from_json
15
+ from keras.utils import np_utils
16
+ from sklearn.model_selection import train_test_split
17
+
18
+ (x_train, y_train), (x_test, y_test) = mnist.load_data()
19
+ X = np.append(x_train, x_test, axis=0)
20
+ Y = np.append(y_train, y_test)
21
+
22
+ # 数字0と1のデータだけ取り出す
23
+ indices = np.logical_or(Y == 0, Y == 1)
24
+ X = X[indices]
25
+ Y = Y[indices]
26
+ print('X.shape', X.shape) # X.shape (14780, 28, 28)
27
+ print('Y.shape', Y.shape) # Y.shape (14780,)
28
+
29
+ # 前処理
30
+ X = X.astype(np.float32) / 255
31
+ X = X.reshape(len(X), -1)
32
+
33
+ # 学習データ、テストデータに分割する。
34
+ x_train, x_test, y_train, y_test = \
35
+ train_test_split(X, Y, test_size=0.2)
36
+
37
+ # one-hot 表現に変換する。
38
+ y_train = np_utils.to_categorical(y_train, 2)
39
+
40
+ # モデルを作成する。
41
+ model = Sequential()
42
+ model.add(Dense(10, input_dim=784))
43
+ model.add(BatchNormalization())
44
+ model.add(Activation('relu'))
45
+ model.add(Dense(10))
46
+ model.add(BatchNormalization())
47
+ model.add(Activation('relu'))
48
+ model.add(Dense(2))
49
+ model.add(BatchNormalization())
50
+ model.add(Activation('softmax'))
51
+ model.compile(optimizer='adam',
52
+ loss='categorical_crossentropy',
53
+ metrics=['accuracy'])
54
+
55
+ # 学習する。
56
+ history = model.fit(x_train, y_train, epochs=10, batch_size=128,
57
+ validation_split=0.2, verbose=0)
58
+
59
+ # モデル及び重みを保存する。
60
+ with open('model.json', 'w') as f:
61
+ f.write(model.to_json())
62
+ model.save_weights('weights.h5')
63
+
64
+ from sklearn.metrics import accuracy_score
65
+
66
+ # 保存したモデル及び重みを読み込む。
67
+ with open('model.json') as f:
68
+ model = model_from_json(f.read())
69
+ model.load_weights('weights.h5')
70
+
71
+ # 推論する。
72
+ y_pred = model.predict_classes(x_test)
73
+
74
+ # 精度を表示する。
75
+ accuracy = accuracy_score(y_pred, y_test)
76
+ print('{:.2%}'.format(accuracy)) # 99.93%
77
+ ```