---
# System prepended metadata

title: AIMS HW2

---

# 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來判斷準確率