kerasを用いて画像の2値分類を行っています。
jupyter notebookで開発しています。
モデルの評価指標としてaccuracyだけを見て良いモデルか評価するのは良くないと考え
ROC曲線、ROC AUCなどを取得できるようにしたいです。
kerasにはROC曲線、ROC AUCなどは標準でサポートされている評価指標に含まれていないので自分で作成する必要があるのですが何から手をつけてよいか分からず良き詰まっています。
自分なりに調べてみて以下のリンクを真似て記述してみたのですが
How to compute Receiving Operating Characteristic (ROC) and AUC in keras?
関数aucとroc_aucでは処理は行われるのですが結果が違っており、tensolflowなどの記述も含まれていて今の自分には理解ができないので使ったことのあるscikit-learnを使おうと考えたのですが上手く行きません。
コード内の
model.compile
部分で以下のエラーとなります。
compileは設定だけだと理解しているのですがエラーを見た感じは引数の不備かと思うのですが、まだ学習もさせていないので何が現状渡されようとしているのか分からず、関数auc, roc_aucに関してはなぜ問題ないのか分かりません。
自分の記述している内容はどこが間違っているでしょうか?
また、metricsの中でscikit-learnを使う場合はどのように記述すればよいでしょうか?
フレームワークの挙動もまだ理解できておらず初歩的な質問ですがアドバイス頂きたいです。
以下コードになります。
データのフォルダ分けなどの部分は省略させて頂いています。
python
1from keras import layers 2from keras import models 3from keras import optimizers 4 5model = models.Sequential() 6#layers.Conv2D(32, (3, 3)) 7#input_shape = CNNの入力テンソルが(image_height, image_width, image_channels)(バッチ次元を含まない)の形状 8model.add(layers.Conv2D(32, (3, 3), activation='relu', input_shape=(300, 300, 3))) 9model.add(layers.BatchNormalization()) 10model.add(layers.MaxPooling2D((2, 2))) 11 12model.add(layers.Conv2D(64, (3, 3), activation='relu')) 13model.add(layers.BatchNormalization()) 14model.add(layers.MaxPooling2D((2, 2))) 15 16model.add(layers.Conv2D(128, (3, 3), activation='relu')) 17model.add(layers.BatchNormalization()) 18model.add(layers.MaxPooling2D((2, 2))) 19 20model.add(layers.Conv2D(128, (3, 3), activation='relu')) 21model.add(layers.BatchNormalization()) 22model.add(layers.MaxPooling2D((2, 2))) 23 24model.add(layers.Conv2D(128, (3, 3), activation='relu')) 25model.add(layers.BatchNormalization()) 26model.add(layers.MaxPooling2D((2, 2))) 27 28model.add(layers.Flatten()) 29model.add(layers.Dense(512, activation='relu')) 30model.add(layers.BatchNormalization()) 31model.add(layers.Dense(1, activation='sigmoid')) 32 33import keras.backend as K 34from sklearn.metrics import roc_auc_score 35import tensorflow as tf 36from sklearn.metrics import precision_score 37from sklearn.metrics import roc_curve 38 39def auc(y_true, y_pred): 40 auc = tf.metrics.auc(y_true, y_pred)[1] 41 K.get_session().run(tf.local_variables_initializer()) 42 return auc 43 44def roc_auc(y_true, y_pred): 45 roc_auc = tf.py_func(roc_auc_score, (y_true, y_pred), tf.double) 46 return roc_auc 47 48def roc(y_true, y_pred): 49 fpr, tpr, thresholds = roc_curve(y_true, y_pred) 50 return fpr, tpr, thresholds 51 52 53model.compile(loss='binary_crossentropy', 54 optimizer=optimizers.RMSprop(lr=1e-4), 55 metrics=['acc', auc, roc_auc, roc]) 56 57from keras.callbacks import EarlyStopping, ModelCheckpoint, TensorBoard 58from keras.preprocessing.image import ImageDataGenerator 59 60fpath = r'C:\Users\python file\model\DA_BN\{epoch:02d}-{acc:.2f}-{loss:.2f}-{val_acc:.2f}-{val_loss:.2f}.hdf5' 61check_point = ModelCheckpoint(filepath = fpath, monitor='val_loss', verbose=0, save_best_only=True, mode='min', period=1) 62 63train_datagen = ImageDataGenerator( 64 rescale=1./255, 65 brightness_range=[0.4, 1.0], 66 channel_shift_range=3., 67) 68 69test_datagen = ImageDataGenerator(rescale=1./255) 70 71predict_datagen = ImageDataGenerator(rescale=1./255) 72 73train_generator = train_datagen.flow_from_directory( 74 train_dir, #ターゲットディレクトリ 75 target_size = (300, 300), #全ての画像サイズを150*150に変更 76 batch_size = 20, #バッチサイズ 77 class_mode = 'binary', #binary_crossentropyを使用するため2値のラベルが必要, 78 save_to_dir = r'C:\Users\python file\dataAugmentation_DA_BN', 79 save_prefix = 'generated', 80 save_format = 'png') 81 82validation_generator = test_datagen.flow_from_directory( 83 val_dir, 84 target_size = (300, 300), 85 batch_size = 20, 86 class_mode = 'binary') 87 88predict_generator = predict_datagen.flow_from_directory( 89 test_dir, 90 target_size = (300, 300), 91 batch_size = 20, 92 class_mode = 'binary') 93 94history = model.fit_generator(train_generator, 95 steps_per_epoch = 1, 96 epochs = 5, 97 validation_data = validation_generator, 98 validation_steps = 1, 99 callbacks=[check_point])
python
1--------------------------------------------------------------------------- 2ValueError Traceback (most recent call last) 3<ipython-input-38-b90f05e5f8e8> in <module>() 4 3 model.compile(loss='binary_crossentropy', 5 4 optimizer=optimizers.RMSprop(lr=1e-4), 6----> 5 metrics=['acc', auc, roc_auc, roc]) 7 8~\AppData\Local\Continuum\anaconda3\lib\site-packages\keras\engine\training.py in compile(self, optimizer, loss, metrics, loss_weights, sample_weight_mode, weighted_metrics, target_tensors, **kwargs) 9 438 output_metrics = nested_metrics[i] 10 439 output_weighted_metrics = nested_weighted_metrics[i] 11--> 440 handle_metrics(output_metrics) 12 441 handle_metrics(output_weighted_metrics, weights=weights) 13 442 14 15~\AppData\Local\Continuum\anaconda3\lib\site-packages\keras\engine\training.py in handle_metrics(metrics, weights) 16 407 metric_result = weighted_metric_fn(y_true, y_pred, 17 408 weights=weights, 18--> 409 mask=masks[i]) 19 410 20 411 # Append to self.metrics_names, self.metric_tensors, 21 22~\AppData\Local\Continuum\anaconda3\lib\site-packages\keras\engine\training_utils.py in weighted(y_true, y_pred, weights, mask) 23 401 """ 24 402 # score_array has ndim >= 2 25--> 403 score_array = fn(y_true, y_pred) 26 404 if mask is not None: 27 405 # Cast the mask to floatX to avoid float64 upcasting in Theano 28 29<ipython-input-37-3b434b12b89b> in roc(y_true, y_pred) 30 41 31 42 def roc(y_true, y_pred): 32---> 43 fpr, tpr, thresholds = roc_curve(y_true, y_pred) 33 44 return fpr, tpr, thresholds 34 35~\AppData\Local\Continuum\anaconda3\lib\site-packages\sklearn\metrics\ranking.py in roc_curve(y_true, y_score, pos_label, sample_weight, drop_intermediate) 36 532 """ 37 533 fps, tps, thresholds = _binary_clf_curve( 38--> 534 y_true, y_score, pos_label=pos_label, sample_weight=sample_weight) 39 535 40 536 # Attempt to drop thresholds corresponding to points in between and 41 42~\AppData\Local\Continuum\anaconda3\lib\site-packages\sklearn\metrics\ranking.py in _binary_clf_curve(y_true, y_score, pos_label, sample_weight) 43 313 """ 44 314 # Check to make sure y_true is valid 45--> 315 y_type = type_of_target(y_true) 46 316 if not (y_type == "binary" or 47 317 (y_type == "multiclass" and pos_label is not None)): 48 49~\AppData\Local\Continuum\anaconda3\lib\site-packages\sklearn\utils\multiclass.py in type_of_target(y) 50 242 if not valid: 51 243 raise ValueError('Expected array-like (array or non-string sequence), ' 52--> 244 'got %r' % y) 53 245 54 246 sparseseries = (y.__class__.__name__ == 'SparseSeries') 55 56ValueError: Expected array-like (array or non-string sequence), got <tf.Tensor 'dense_2_target_8:0' shape=(?, ?) dtype=float32>
回答1件
あなたの回答
tips
プレビュー