前提・実現したいこと
リンク内容
上記の記事を参考に、githubの リンク内容 をクローンしてkeras-yolo3による独自学習がうまくいきました。
そこで、今の設定では下の写真のようにlossとvalue-lossだけしか表示できませんが、それだけでなくmAPも表示させ、グラフを作成したいです。
調べてところ、こちらの リンク内容 によると、下記コードをtrain.pyに加えればmAPを表示できるようです。
python
1import keras.backend as K 2 3def mean_pred(y_true, y_pred): 4 return K.mean(y_pred) 5 6model.compile(optimizer='rmsprop', 7 loss='binary_crossentropy', 8 metrics=['accuracy', mean_pred])
そこで、train.pyに 上記def mean_pred(~ の2行を加え、train.pyの下記コードを
python
1 model.compile(optimizer=Adam(lr=1e-3), loss={ 2 # use custom yolo_loss Lambda layer. 3 'yolo_loss': lambda y_true, y_pred: y_pred})
こちら↓に書き換えて実行しました。lossなどは表示されませんが、ひとまずmAPをだすのを優先しました。
python
1model.compile(optimizer='rmsprop', 2 loss='binary_crossentropy', 3 metrics=['accuracy', mean_pred])
しかしうまくいかず、下記のエラーが発生しました。コードを挿入する位置を他にもずらしてやってみましたが、うまくいかず躓いています。
train.pyをどう改変すれば、当初の予定通りにmAPを出し、グラフを描けるでしょうか。
発生している問題・エラーメッセージ
File "C:\Users\Anaconda3\envs\sleep\lib\site-packages\tensorflow\python\ops\nn_impl.py", line 166, in sigmoid_cross_entropy_with_logits (logits.get_shape(), labels.get_shape())) ValueError: logits and labels must have the same shape (() vs (?, ?))
該当のソースコード
train.py全体のコードはこちらの リンク内容 を使っています
python
1 2手を加えたtrain.pyを実行 3 4""" 5Retrain the YOLO model for your own dataset. 6""" 7 8import numpy as np 9import keras.backend as K 10from keras.layers import Input, Lambda 11from keras.models import Model 12from keras.optimizers import Adam 13from keras.callbacks import TensorBoard, ModelCheckpoint, ReduceLROnPlateau, EarlyStopping 14from yolo3.model import preprocess_true_boxes, yolo_body, tiny_yolo_body, yolo_loss 15from yolo3.utils import get_random_data 16import sys 17 18 19 20#改変した箇所➀ 下記2行を加えました 21def mean_pred(y_true, y_pred): 22 return K.mean(y_pred) 23 24def _main(): 25 annotation_path = 'model_data/2007_train.txt' 26 log_dir = 'logs/000/' 27 classes_path = 'model_data/voc_classes.txt' 28 anchors_path = 'model_data/yolo_anchors.txt' 29 class_names = get_classes(classes_path) 30 num_classes = len(class_names) 31 anchors = get_anchors(anchors_path) 32 33 input_shape = (320,320) # multiple of 32, hw 34 if len(sys.argv) > 1: 35 input_shape = (int(sys.argv[1]),int(sys.argv[1])) 36 37 is_tiny_version = len(anchors)==6 # default setting 38 if is_tiny_version: 39 model = create_tiny_model(input_shape, anchors, num_classes, 40 freeze_body=2, weights_path='model_data/tiny_yolo_weights.h5') 41 else: 42 model = create_model(input_shape, anchors, num_classes, 43 freeze_body=2, weights_path='model_data/yolo_weights.h5') # make sure you know what you freeze 44 45 logging = TensorBoard(log_dir=log_dir) 46 checkpoint = ModelCheckpoint(log_dir + 'ep{epoch:03d}-loss{loss:.3f}-val_loss{val_loss:.3f}.h5', 47 monitor='val_loss', save_weights_only=True, save_best_only=True, period=3) 48 reduce_lr = ReduceLROnPlateau(monitor='val_loss', factor=0.1, patience=3, verbose=1) 49 early_stopping = EarlyStopping(monitor='val_loss', min_delta=0, patience=10, verbose=1) 50 51 val_split = 0.1 52 with open(annotation_path) as f: 53 lines = f.readlines() 54 np.random.seed(10101) 55 np.random.shuffle(lines) 56 np.random.seed(None) 57 num_val = int(len(lines)*val_split) 58 num_train = len(lines) - num_val 59 60 # Train with frozen layers first, to get a stable loss. 61 # Adjust num epochs to your dataset. This step is enough to obtain a not bad model. 62 if True: 63 64 #改変した箇所➁ model.compile()の中身を書き換えました 65 model.compile(optimizer='rmsprop', 66 loss='binary_crossentropy', 67 metrics=['accuracy', mean_pred]) 68 69 70 batch_size = 32 71 if len(sys.argv) > 2: 72 batch_size = int(sys.argv[2]) 73 74 print('Train on {} samples, val on {} samples, with batch size {}.'.format(num_train, num_val, batch_size)) 75 model.fit_generator(data_generator_wrapper(lines[:num_train], batch_size, input_shape, anchors, num_classes), 76 steps_per_epoch=max(1, num_train//batch_size), 77 validation_data=data_generator_wrapper(lines[num_train:], batch_size, input_shape, anchors, num_classes), 78 validation_steps=max(1, num_val//batch_size), 79 epochs=50, 80 initial_epoch=0, 81 callbacks=[logging, checkpoint]) 82 model.save_weights(log_dir + 'trained_weights_stage_1.h5') 83 84 # Unfreeze and continue training, to fine-tune. 85 # Train longer if the result is not good. 86 if True: 87 for i in range(len(model.layers)): 88 model.layers[i].trainable = True 89 90 #改変した箇所➂ model.compile()の中身を書き換えました 91 model.compile(optimizer='rmsprop', 92 loss='binary_crossentropy', 93 metrics=['accuracy', mean_pred]) # recompile to apply the change 94 95#以下略 96 97
補足情報(FW/ツールのバージョンなど)
windows10
anacondaの仮想環境を使用
python3.6
あなたの回答
tips
プレビュー