質問編集履歴
3
使用した画像のサンプルをUPしました。
test
CHANGED
File without changes
|
test
CHANGED
@@ -247,3 +247,5 @@
|
|
247
247
|
#[-2.2691705]
|
248
248
|
|
249
249
|
```
|
250
|
+
|
251
|
+
使用した画像のサンプル![使用した画像のサンプル](0b45721d0d349a07bc5ffcbd2c787a30.png)
|
2
プログラムを全文表示しました。
test
CHANGED
File without changes
|
test
CHANGED
@@ -6,6 +6,8 @@
|
|
6
6
|
|
7
7
|
こちらのサイトを使って、未知の画像を予測してみたいのですが方法が分かりません。出力して確認したいのは、以下の4点です。
|
8
8
|
|
9
|
+
|
10
|
+
|
9
11
|
・予測する画像の表示
|
10
12
|
|
11
13
|
・予測した確率
|
@@ -16,28 +18,232 @@
|
|
16
18
|
|
17
19
|
|
18
20
|
|
21
|
+
予測しようと思って書いみたプログラムは以下(全文)です。
|
22
|
+
|
19
|
-
|
23
|
+
最後に#case1, #case2と書いた「predict」のところです。 arrayがうまいこと配列になっていない?気がしています。(当然、np.argmaxも)
|
24
|
+
|
20
|
-
|
25
|
+
上記4点がうまいこと確認できません。勉強不足でお恥ずかしい限りです。ですが、頑張りたいと思います。
|
26
|
+
|
21
|
-
|
27
|
+
基本的なことで申し訳ないですが、どなたかアドバイスをお願いしてもよろしいでしょうか。
|
22
|
-
|
23
|
-
|
28
|
+
|
24
|
-
|
25
|
-
|
29
|
+
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
np.argmax(prediction[5])
|
30
|
-
|
31
|
-
#0
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
val_labels[5]
|
36
|
-
|
37
|
-
#4.0
|
38
30
|
|
39
31
|
```
|
40
32
|
|
33
|
+
import os
|
34
|
+
|
35
|
+
import keras
|
36
|
+
|
41
|
-
|
37
|
+
from keras.preprocessing.image import ImageDataGenerator
|
42
|
-
|
38
|
+
|
43
|
-
|
39
|
+
from keras.models import Sequential, Model
|
40
|
+
|
41
|
+
from keras.layers import Input, Dense, Dropout, Activation, Flatten,MaxPooling2D,Conv2D
|
42
|
+
|
43
|
+
from keras import optimizers
|
44
|
+
|
45
|
+
import tensorflow as tf
|
46
|
+
|
47
|
+
import numpy as np
|
48
|
+
|
49
|
+
from keras.preprocessing.image import load_img, img_to_array
|
50
|
+
|
51
|
+
from keras.applications.vgg16 import preprocess_input
|
52
|
+
|
53
|
+
|
54
|
+
|
55
|
+
# 分類クラス
|
56
|
+
|
57
|
+
classes = ['cat1','cat2','cat3']
|
58
|
+
|
59
|
+
nb_classes = len(classes)
|
60
|
+
|
61
|
+
batch_size_for_data_generator = 20
|
62
|
+
|
63
|
+
|
64
|
+
|
65
|
+
base_dir = "XXX"
|
66
|
+
|
67
|
+
|
68
|
+
|
69
|
+
train_dir = os.path.join(base_dir, 'train')
|
70
|
+
|
71
|
+
validation_dir = os.path.join(base_dir, 'validation')
|
72
|
+
|
73
|
+
test_dir = os.path.join(base_dir, 'test')
|
74
|
+
|
75
|
+
|
76
|
+
|
77
|
+
train_1_dir = os.path.join(train_dir, '1')
|
78
|
+
|
79
|
+
train_2_dir = os.path.join(train_dir, '2')
|
80
|
+
|
81
|
+
train_3_dir = os.path.join(train_dir, '3')
|
82
|
+
|
83
|
+
|
84
|
+
|
85
|
+
validation_1_dir = os.path.join(validation_dir, '1')
|
86
|
+
|
87
|
+
validation_2_dir = os.path.join(validation_dir, '2')
|
88
|
+
|
89
|
+
validation_3_dir = os.path.join(validation_dir, '3')
|
90
|
+
|
91
|
+
|
92
|
+
|
93
|
+
test_1_dir = os.path.join(test_dir, '1')
|
94
|
+
|
95
|
+
test_2_dir = os.path.join(test_dir, '2')
|
96
|
+
|
97
|
+
test_3_dir = os.path.join(test_dir, '3')
|
98
|
+
|
99
|
+
|
100
|
+
|
101
|
+
# 画像サイズ
|
102
|
+
|
103
|
+
img_rows, img_cols = 200, 200
|
104
|
+
|
105
|
+
|
106
|
+
|
107
|
+
train_datagen = ImageDataGenerator(rescale=1.0 / 255,shear_range=0.2,zoom_range=0.2,horizontal_flip=True)
|
108
|
+
|
109
|
+
train_generator = train_datagen.flow_from_directory(directory=train_dir,target_size=(img_rows, img_cols),color_mode='rgb',batch_size=batch_size_for_data_generator,shuffle=True)
|
110
|
+
|
111
|
+
|
112
|
+
|
113
|
+
test_datagen = ImageDataGenerator(rescale=1.0 / 255)
|
114
|
+
|
115
|
+
validation_generator = test_datagen.flow_from_directory(directory=validation_dir,target_size=(img_rows, img_cols),color_mode='rgb',batch_size=batch_size_for_data_generator,shuffle=True)
|
116
|
+
|
117
|
+
|
118
|
+
|
119
|
+
IMG_SHAPE = (224, 224, 3)
|
120
|
+
|
121
|
+
base_model = tf.keras.applications.MobileNetV2(input_shape=IMG_SHAPE,
|
122
|
+
|
123
|
+
include_top=False,
|
124
|
+
|
125
|
+
weights='imagenet')
|
126
|
+
|
127
|
+
base_model.trainable = False
|
128
|
+
|
129
|
+
|
130
|
+
|
131
|
+
maxpool_layer = tf.keras.layers.GlobalMaxPooling2D()
|
132
|
+
|
133
|
+
prediction_layer = tf.keras.layers.Dense(1)
|
134
|
+
|
135
|
+
|
136
|
+
|
137
|
+
learning_rate = 0.0001
|
138
|
+
|
139
|
+
model = tf.keras.Sequential([
|
140
|
+
|
141
|
+
base_model,
|
142
|
+
|
143
|
+
maxpool_layer,
|
144
|
+
|
145
|
+
prediction_layer
|
146
|
+
|
147
|
+
])
|
148
|
+
|
149
|
+
|
150
|
+
|
151
|
+
base_learning_rate = 0.0001
|
152
|
+
|
153
|
+
model.compile(optimizer=tf.keras.optimizers.RMSprop(lr=base_learning_rate),
|
154
|
+
|
155
|
+
loss=tf.keras.losses.BinaryCrossentropy(from_logits=True),
|
156
|
+
|
157
|
+
metrics=['accuracy'])
|
158
|
+
|
159
|
+
model.summary()
|
160
|
+
|
161
|
+
|
162
|
+
|
163
|
+
initial_epochs = 10
|
164
|
+
|
165
|
+
validation_steps=20
|
166
|
+
|
167
|
+
loss0,accuracy0 = model.evaluate(validation_generator, steps = validation_steps)
|
168
|
+
|
169
|
+
|
170
|
+
|
171
|
+
history = model.fit(train_generator,
|
172
|
+
|
173
|
+
epochs=initial_epochs,
|
174
|
+
|
175
|
+
validation_data=validation_generator)
|
176
|
+
|
177
|
+
|
178
|
+
|
179
|
+
base_model.trainable = True
|
180
|
+
|
181
|
+
|
182
|
+
|
183
|
+
for layer in base_model.layers[:100]:
|
184
|
+
|
185
|
+
layer.trainable = False
|
186
|
+
|
187
|
+
|
188
|
+
|
189
|
+
print("Number of layers in the base model: ", len(base_model.layers))
|
190
|
+
|
191
|
+
|
192
|
+
|
193
|
+
model.compile(loss=tf.keras.losses.BinaryCrossentropy(from_logits=True),
|
194
|
+
|
195
|
+
optimizer = tf.keras.optimizers.RMSprop(lr=base_learning_rate/10),
|
196
|
+
|
197
|
+
metrics=['accuracy'])
|
198
|
+
|
199
|
+
model.summary()
|
200
|
+
|
201
|
+
|
202
|
+
|
203
|
+
fine_tune_epochs = 10
|
204
|
+
|
205
|
+
total_epochs = initial_epochs + fine_tune_epochs
|
206
|
+
|
207
|
+
|
208
|
+
|
209
|
+
history_fine = model.fit(train_generator,
|
210
|
+
|
211
|
+
epochs=total_epochs,
|
212
|
+
|
213
|
+
initial_epoch = history.epoch[-1],
|
214
|
+
|
215
|
+
validation_data=validation_generator)
|
216
|
+
|
217
|
+
|
218
|
+
|
219
|
+
#case1
|
220
|
+
|
221
|
+
filename = os.path.join('XXX/', 'XXX.png')
|
222
|
+
|
223
|
+
filename
|
224
|
+
|
225
|
+
|
226
|
+
|
227
|
+
img = load_img(filename, target_size=(224, 224))
|
228
|
+
|
229
|
+
x = img_to_array(img)
|
230
|
+
|
231
|
+
x = np.expand_dims(x, axis=0)
|
232
|
+
|
233
|
+
|
234
|
+
|
235
|
+
predict = model.predict(preprocess_input(x))
|
236
|
+
|
237
|
+
predict
|
238
|
+
|
239
|
+
#array([[4.345547]], dtype=float32)
|
240
|
+
|
241
|
+
|
242
|
+
|
243
|
+
#case2
|
244
|
+
|
245
|
+
print(model.predict(validation_generator)[0])
|
246
|
+
|
247
|
+
#[-2.2691705]
|
248
|
+
|
249
|
+
```
|
1
質問内容を「未知の画像を予測する方法が分からない」としました。
test
CHANGED
File without changes
|
test
CHANGED
@@ -2,9 +2,9 @@
|
|
2
2
|
|
3
3
|
で質問した者です。恥ずかしながら、また分からなくなってしまい、質問させて頂きました。
|
4
4
|
|
5
|
-
|
5
|
+
公式サイト「[Transfer learning with a pretrained ConvNet](https://www.tensorflow.org/tutorials/images/transfer_learning?hl=ja)」を実装確認したところです。
|
6
6
|
|
7
|
-
ですが
|
7
|
+
こちらのサイトを使って、未知の画像を予測してみたいのですが方法が分かりません。出力して確認したいのは、以下の4点です。
|
8
8
|
|
9
9
|
・予測する画像の表示
|
10
10
|
|
@@ -14,39 +14,9 @@
|
|
14
14
|
|
15
15
|
・正解ラベル(画像のラベル)
|
16
16
|
|
17
|
-
自分で用意した画像を投入するためのプログラムは以下です。画像は、0~9が書かれたpngで、各数字10files、合計100filesあります。
|
18
|
-
|
19
|
-
```
|
20
|
-
|
21
|
-
#データセットを作る
|
22
|
-
|
23
|
-
labels = []
|
24
|
-
|
25
|
-
for file in filenames:
|
26
|
-
|
27
|
-
img = load_img(file, color_mode = "grayscale", target_size=(28,28))
|
28
|
-
|
29
|
-
array = img_to_array(img)
|
30
|
-
|
31
|
-
cat = file[11] #ファイル名からラベルをとっている。
|
32
|
-
|
33
|
-
labels.append(cat)
|
34
|
-
|
35
|
-
labels = np.array(labels,float)
|
36
17
|
|
37
18
|
|
38
|
-
|
39
|
-
train_filenames, val_filenames, train_labels, val_labels = train_test_split(filenames,
|
40
|
-
|
41
|
-
labels,
|
42
|
-
|
43
|
-
train_size=0.9,
|
44
|
-
|
45
|
-
random_state=420)
|
46
|
-
|
47
|
-
```
|
48
|
-
|
49
|
-
|
19
|
+
予測しようと思って書いみたプログラムは以下です。arrayがうまいこと配列になっていない?気がしています。(当然、np.argmaxも)
|
50
20
|
|
51
21
|
```prediction=model.predict(val_data)
|
52
22
|
|
@@ -68,4 +38,6 @@
|
|
68
38
|
|
69
39
|
```
|
70
40
|
|
41
|
+
なかなか上記4点がうまいこと確認できません。勉強不足でお恥ずかしい限りです。
|
42
|
+
|
71
|
-
|
43
|
+
基本的なことで申し訳ないですが、どなたかアドバイスをお願いしてもよろしいでしょうか。
|