質問編集履歴

2

修正依頼の反映

2020/02/11 12:35

投稿

TakaKan
TakaKan

スコア10

test CHANGED
File without changes
test CHANGED
@@ -8,6 +8,238 @@
8
8
 
9
9
  ※h5ファイルは、計4つのクラスそれぞれトレーニング画像約300枚、バリデーション用画像役100枚でfine-tuningを用いて作成しました。
10
10
 
11
+ 作成時に使用したコードは以下のようになります。
12
+
13
+ ```Python
14
+
15
+ import os
16
+
17
+ from keras.applications.vgg16 import VGG16
18
+
19
+ from keras.preprocessing.image import ImageDataGenerator
20
+
21
+ from keras.models import Sequential, Model
22
+
23
+ from keras.layers import Input, Activation, Dropout, Flatten, Dense
24
+
25
+ from keras.preprocessing.image import ImageDataGenerator
26
+
27
+ from keras import optimizers
28
+
29
+ import numpy as np
30
+
31
+ import time
32
+
33
+
34
+
35
+ # 分類するクラス
36
+
37
+ classes = ['arin', 'kanako', 'reni', 'shiori']
38
+
39
+ nb_classes = len(classes)
40
+
41
+
42
+
43
+ img_width, img_height = 150, 150
44
+
45
+
46
+
47
+ # トレーニング用とバリデーション用の画像格納先
48
+
49
+ train_data_dir = '/dataset/train'
50
+
51
+ validation_data_dir = 'dataset/validation'
52
+
53
+
54
+
55
+ # 今回はトレーニング用に200枚、バリデーション用に50枚の画像を用意した。
56
+
57
+ nb_train_samples = 1438
58
+
59
+ nb_validatbion_samples = 389
60
+
61
+
62
+
63
+ batch_size = 16
64
+
65
+ nb_epoch = 10
66
+
67
+
68
+
69
+
70
+
71
+ result_dir = 'results'
72
+
73
+ if not os.path.exists(result_dir):
74
+
75
+ os.mkdir(result_dir)
76
+
77
+
78
+
79
+
80
+
81
+ def vgg_model_maker():
82
+
83
+ """ VGG16のモデルをFC層以外使用。FC層のみ作成して結合して用意する """
84
+
85
+
86
+
87
+ # VGG16のロード。FC層は不要なので include_top=False
88
+
89
+ input_tensor = Input(shape=(img_width, img_height, 3))
90
+
91
+ vgg16 = VGG16(include_top=False, weights='imagenet', input_tensor=input_tensor)
92
+
93
+
94
+
95
+ # FC層の作成
96
+
97
+ top_model = Sequential()
98
+
99
+ top_model.add(Flatten(input_shape=vgg16.output_shape[1:]))
100
+
101
+ top_model.add(Dense(256, activation='relu'))
102
+
103
+ top_model.add(Dropout(0.5))
104
+
105
+ top_model.add(Dense(nb_classes, activation='softmax'))
106
+
107
+
108
+
109
+ # VGG16とFC層を結合してモデルを作成
110
+
111
+ model = Model(input=vgg16.input, output=top_model(vgg16.output))
112
+
113
+
114
+
115
+ return model
116
+
117
+
118
+
119
+
120
+
121
+ def image_generator():
122
+
123
+ """ ディレクトリ内の画像を読み込んでトレーニングデータとバリデーションデータの作成 """
124
+
125
+ train_datagen = ImageDataGenerator(
126
+
127
+ rescale=1.0 / 255,
128
+
129
+ zoom_range=0.2,
130
+
131
+ horizontal_flip=True)
132
+
133
+
134
+
135
+ validation_datagen = ImageDataGenerator(rescale=1.0 / 255)
136
+
137
+
138
+
139
+ train_generator = train_datagen.flow_from_directory(
140
+
141
+ train_data_dir,
142
+
143
+ target_size=(img_width, img_height),
144
+
145
+ color_mode='rgb',
146
+
147
+ classes=classes,
148
+
149
+ class_mode='categorical',
150
+
151
+ batch_size=batch_size,
152
+
153
+ shuffle=True)
154
+
155
+
156
+
157
+ validation_generator = validation_datagen.flow_from_directory(
158
+
159
+ validation_data_dir,
160
+
161
+ target_size=(img_width, img_height),
162
+
163
+ color_mode='rgb',
164
+
165
+ classes=classes,
166
+
167
+ class_mode='categorical',
168
+
169
+ batch_size=batch_size,
170
+
171
+ shuffle=True)
172
+
173
+
174
+
175
+ return (train_generator, validation_generator)
176
+
177
+
178
+
179
+
180
+
181
+ if __name__ == '__main__':
182
+
183
+ start = time.time()
184
+
185
+
186
+
187
+ # モデル作成
188
+
189
+ vgg_model = vgg_model_maker()
190
+
191
+
192
+
193
+ # 最後のconv層の直前までの層をfreeze
194
+
195
+ for layer in vgg_model.layers[:15]:
196
+
197
+ layer.trainable = False
198
+
199
+
200
+
201
+ # 多クラス分類を指定
202
+
203
+ vgg_model.compile(loss='categorical_crossentropy',
204
+
205
+ optimizer=optimizers.SGD(lr=1e-3, momentum=0.9),
206
+
207
+ metrics=['accuracy'])
208
+
209
+
210
+
211
+ # 画像のジェネレータ生成
212
+
213
+ train_generator, validation_generator = image_generator()
214
+
215
+
216
+
217
+ # Fine-tuning
218
+
219
+ history = vgg_model.fit_generator(
220
+
221
+ train_generator,
222
+
223
+ samples_per_epoch=nb_train_samples,
224
+
225
+ nb_epoch=nb_epoch,
226
+
227
+ validation_data=validation_generator,
228
+
229
+ nb_val_samples=nb_validation_samples)
230
+
231
+
232
+
233
+ vgg_model.save_weights(os.path.join(result_dir, 'finetuning.h5'))
234
+
235
+
236
+
237
+ process_time = (time.time() - start) / 60
238
+
239
+ print(u'学習終了。かかった時間は', process_time, u'分です。')
240
+
241
+ ```
242
+
11
243
 
12
244
 
13
245
  ### 発生している問題・エラーメッセージ

1

修正依頼の反映

2020/02/11 12:35

投稿

TakaKan
TakaKan

スコア10

test CHANGED
File without changes
test CHANGED
@@ -3,6 +3,10 @@
3
3
 
4
4
 
5
5
  h5ファイルをtfliteに変換してandroid端末上で動かせるようにしたいです
6
+
7
+
8
+
9
+ ※h5ファイルは、計4つのクラスそれぞれトレーニング画像約300枚、バリデーション用画像役100枚でfine-tuningを用いて作成しました。
6
10
 
7
11
 
8
12