###前提
https://sleepless-se.net/2019/06/21/how-to-train-keras%E2%88%92yolo3/を参考に独自データにおけるYOLOv3の学習を行っています。
上記サイトで使用されているコード:
https://github.com/sleepless-se/keras-yolo3
すべてでなくても良いので教えていただけると助かります。
質問したいこと
1.
train.pyのコードの中で不明な点があります。
52行目から90行目の以下のコードの部分で、2回model.fit_generater()を行っているのはなぜでしょうか。2つの違いを教えていただきたいです。
また、それぞれのepochsとinitial_epochsの数値は何を指定しているのでしょうか。この状態だと50epochsずつの計100epochs繰り返すのですが、自分でepochs数を変えたい場合、どの数値を変更したらどう変わるのか教えていただきたいです。
Python
1 # Train with frozen layers first, to get a stable loss. 2 # Adjust num epochs to your dataset. This step is enough to obtain a not bad model. 3 if True: 4 model.compile(optimizer=Adam(lr=1e-3), loss={ 5 # use custom yolo_loss Lambda layer. 6 'yolo_loss': lambda y_true, y_pred: y_pred}) 7 8 batch_size = 32 9 if len(sys.argv) > 2: 10 batch_size = int(sys.argv[2]) 11 12 print('Train on {} samples, val on {} samples, with batch size {}.'.format(num_train, num_val, batch_size)) 13 model.fit_generator(data_generator_wrapper(lines[:num_train], batch_size, input_shape, anchors, num_classes), 14 steps_per_epoch=max(1, num_train//batch_size), 15 validation_data=data_generator_wrapper(lines[num_train:], batch_size, input_shape, anchors, num_classes), 16 validation_steps=max(1, num_val//batch_size), 17 epochs=50, 18 initial_epoch=0, 19 callbacks=[logging, checkpoint]) 20 model.save_weights(log_dir + 'trained_weights_stage_1.h5') 21 22 # Unfreeze and continue training, to fine-tune. 23 # Train longer if the result is not good. 24 if True: 25 for i in range(len(model.layers)): 26 model.layers[i].trainable = True 27 model.compile(optimizer=Adam(lr=1e-4), loss={'yolo_loss': lambda y_true, y_pred: y_pred}) # recompile to apply the change 28 print('Unfreeze all of the layers.') 29 30 batch_size = 32 # note that more GPU memory is required after unfreezing the body 31 print('Train on {} samples, val on {} samples, with batch size {}.'.format(num_train, num_val, batch_size)) 32 model.fit_generator(data_generator_wrapper(lines[:num_train], batch_size, input_shape, anchors, num_classes), 33 steps_per_epoch=max(1, num_train//batch_size), 34 validation_data=data_generator_wrapper(lines[num_train:], batch_size, input_shape, anchors, num_classes), 35 validation_steps=max(1, num_val//batch_size), 36 epochs=100, 37 initial_epoch=50, 38 callbacks=[logging, checkpoint, reduce_lr, early_stopping]) 39 model.save_weights(log_dir + 'trained_weights_final.h5')
2.学習中のログに関して
このログを出力するコードは何行目に書かれているのでしょうか。また、デフォルトだとlossとval_lossが出力されているのですが、accuracyを一緒に表示するのはどうすればよいのでしょうか。
3.データ拡張に関して
170行目から192行目で定義されるdata_generatorの部分で学習データの水増しはされているのでしょうか。
また、されていない場合どこにどのようなコードを追加すればできるのでしょうか。
Python
1def data_generator(annotation_lines, batch_size, input_shape, anchors, num_classes): 2 '''data generator for fit_generator''' 3 n = len(annotation_lines) 4 i = 0 5 while True: 6 image_data = [] 7 box_data = [] 8 for b in range(batch_size): 9 if i==0: 10 np.random.shuffle(annotation_lines) 11 image, box = get_random_data(annotation_lines[i], input_shape, random=True) 12 image_data.append(image) 13 box_data.append(box) 14 i = (i+1) % n 15 image_data = np.array(image_data) 16 box_data = np.array(box_data) 17 y_true = preprocess_true_boxes(box_data, input_shape, anchors, num_classes) 18 yield [image_data, *y_true], np.zeros(batch_size) 19 20def data_generator_wrapper(annotation_lines, batch_size, input_shape, anchors, num_classes): 21 n = len(annotation_lines) 22 if n==0 or batch_size<=0: return None 23 return data_generator(annotation_lines, batch_size, input_shape, anchors, num_classes)
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/01/22 08:48