回答編集履歴

2

2018/09/29 08:57

投稿

tiitoi
tiitoi

スコア21956

test CHANGED
@@ -9,6 +9,10 @@
9
9
 
10
10
 
11
11
  ----
12
+
13
+
14
+
15
+ 2個目のコードでは [0, 1] に正規化する処理が入っていないので、学習した際と同じ前処理を行うようにしてみてください。
12
16
 
13
17
 
14
18
 

1

a

2018/09/29 08:57

投稿

tiitoi
tiitoi

スコア21956

test CHANGED
@@ -5,3 +5,149 @@
5
5
  今回の件は validation accuracy が 0.8 なのに、実際テストデータを流すと全部 [[1. 0.]] になるということでしょうか。
6
6
 
7
7
  記載いただいた範囲でコードに問題はなさそうなのですが、validation accuracy が 0.8 というのはどのように確認されましたか?
8
+
9
+
10
+
11
+ ----
12
+
13
+
14
+
15
+ # MNIST データで 0/1 判定するサンプル
16
+
17
+
18
+
19
+ ```python
20
+
21
+ import numpy as np
22
+
23
+ from keras.datasets import mnist
24
+
25
+ from keras.layers import Activation, BatchNormalization, Dense
26
+
27
+ from keras.models import Sequential, model_from_json
28
+
29
+ from keras.utils import np_utils
30
+
31
+ from sklearn.model_selection import train_test_split
32
+
33
+
34
+
35
+ (x_train, y_train), (x_test, y_test) = mnist.load_data()
36
+
37
+ X = np.append(x_train, x_test, axis=0)
38
+
39
+ Y = np.append(y_train, y_test)
40
+
41
+
42
+
43
+ # 数字0と1のデータだけ取り出す
44
+
45
+ indices = np.logical_or(Y == 0, Y == 1)
46
+
47
+ X = X[indices]
48
+
49
+ Y = Y[indices]
50
+
51
+ print('X.shape', X.shape) # X.shape (14780, 28, 28)
52
+
53
+ print('Y.shape', Y.shape) # Y.shape (14780,)
54
+
55
+
56
+
57
+ # 前処理
58
+
59
+ X = X.astype(np.float32) / 255
60
+
61
+ X = X.reshape(len(X), -1)
62
+
63
+
64
+
65
+ # 学習データ、テストデータに分割する。
66
+
67
+ x_train, x_test, y_train, y_test = \
68
+
69
+ train_test_split(X, Y, test_size=0.2)
70
+
71
+
72
+
73
+ # one-hot 表現に変換する。
74
+
75
+ y_train = np_utils.to_categorical(y_train, 2)
76
+
77
+
78
+
79
+ # モデルを作成する。
80
+
81
+ model = Sequential()
82
+
83
+ model.add(Dense(10, input_dim=784))
84
+
85
+ model.add(BatchNormalization())
86
+
87
+ model.add(Activation('relu'))
88
+
89
+ model.add(Dense(10))
90
+
91
+ model.add(BatchNormalization())
92
+
93
+ model.add(Activation('relu'))
94
+
95
+ model.add(Dense(2))
96
+
97
+ model.add(BatchNormalization())
98
+
99
+ model.add(Activation('softmax'))
100
+
101
+ model.compile(optimizer='adam',
102
+
103
+ loss='categorical_crossentropy',
104
+
105
+ metrics=['accuracy'])
106
+
107
+
108
+
109
+ # 学習する。
110
+
111
+ history = model.fit(x_train, y_train, epochs=10, batch_size=128,
112
+
113
+ validation_split=0.2, verbose=0)
114
+
115
+
116
+
117
+ # モデル及び重みを保存する。
118
+
119
+ with open('model.json', 'w') as f:
120
+
121
+ f.write(model.to_json())
122
+
123
+ model.save_weights('weights.h5')
124
+
125
+
126
+
127
+ from sklearn.metrics import accuracy_score
128
+
129
+
130
+
131
+ # 保存したモデル及び重みを読み込む。
132
+
133
+ with open('model.json') as f:
134
+
135
+ model = model_from_json(f.read())
136
+
137
+ model.load_weights('weights.h5')
138
+
139
+
140
+
141
+ # 推論する。
142
+
143
+ y_pred = model.predict_classes(x_test)
144
+
145
+
146
+
147
+ # 精度を表示する。
148
+
149
+ accuracy = accuracy_score(y_pred, y_test)
150
+
151
+ print('{:.2%}'.format(accuracy)) # 99.93%
152
+
153
+ ```