# AIMS HW2 資訊113 F74094041 李易宗 ## Questions 利用 Kaggle 上 [NIH Chest X-rays](https://www.kaggle.com/nih-chest-xrays/data) 的 dataset 來訓練一個可以做 multi-label 分類的 model ## Process ### data preprocess > 這個資料集把影像的資訊都放到 *DataEntry2017.csv* 檔案裡,所以在做資料前處理的時候,需要一直到裡面拿影像的資料 * 原始各個資料數量及類別(可以看出影像的數量落差很大) ![](https://i.imgur.com/BoIJgE2.png) * 這次希望只訓練有症狀的圖片,所以一開始直接把 *DataEntry2017.csv* 裡的no Finding 設成 "" * 再刪除一些極端的資料(年齡大於100歲) * 再把數量小於2000的 data 過濾掉,這裡剩下11個類別 ![](https://i.imgur.com/uSGjURD.jpg) * 因為這次的 dataset 數量很不平均,所以重新 sampling 以及調整不同疾病的權重,在按照這些權重挑出合計40000張影像 ![](https://i.imgur.com/JL8MFn5.jpg) ### Train Model * trained model 下載連結 : > https://drive.google.com/drive/folders/1RXhgwS1Pfw-foZdkedzedRt8DxlNY7wk?usp=share_link * 使用 Resnet50 來當作 training model ``` img_in = Input(t_x.shape[1:]) model = ResNet50(include_top=False, weights='imagenet', input_tensor=img_in, input_shape=t_x.shape[1:], pooling='avg') # output layer x = model.output predictions = Dense(len(all_labels), activation="sigmoid", name="predictions")(x) model = Model(inputs=img_in, outputs=predictions) ``` * 使用 Adam 當作 optimizer * 因為要分辨multi-label 所以使用 binary_crossentropy 當作 loss function ``` model.compile(optimizer=Adam(), loss="binary_crossentropy", metrics=[keras.metrics.binary_accuracy]) ``` * 把 data 依 4:1 分成 training data 跟 validation data,分別是32000張以及8000張 ``` train_df, valid_df = train_test_split(data,test_size=0.20, random_state=2018, stratify=data['FindingLabels'].map(lambda x: x[:4])) ``` * 及利用 ImageDataGenerator 來做 data augmentation ``` IMG_SIZE = (224, 224) core_idg = ImageDataGenerator(samplewise_center=True, samplewise_std_normalization=True, horizontal_flip=True, vertical_flip=False, height_shift_range=0.05, width_shift_range=0.1, rotation_range=5, shear_range=0.1, fill_mode='reflect', zoom_range=0.15) ``` ## Results * 訓練20個epoch ![](https://i.imgur.com/YB3OHpx.jpg) * ROC Curve ![](https://i.imgur.com/8UqfrIZ.jpg) * 利用roc_auc_score 算出 AUC = 0.7218111484913602 ## Experience * 一開始原本習慣性的要到colab去做,結果發現40GB的東西根本放不上去,後面在kaggle notebook上直接跑真的是發現新天地 * 在做這個資料前處理的時候,因為資料數量很不平均,所以要重新調整全重以及sampling,這些都是之前沒有做過的 * 因為這次沒有規定要用甚麼model去做,所以在尋找model的時候也看到了很多同的模型 * 雖然是第一次做muti-label的分類,但是跟之前寫的model感覺差不多,只是最後面要用AUC來判斷準確率