# 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* 檔案裡,所以在做資料前處理的時候,需要一直到裡面拿影像的資料
* 原始各個資料數量及類別(可以看出影像的數量落差很大)

* 這次希望只訓練有症狀的圖片,所以一開始直接把 *DataEntry2017.csv* 裡的no Finding 設成 ""
* 再刪除一些極端的資料(年齡大於100歲)
* 再把數量小於2000的 data 過濾掉,這裡剩下11個類別

* 因為這次的 dataset 數量很不平均,所以重新 sampling 以及調整不同疾病的權重,在按照這些權重挑出合計40000張影像

### 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

* ROC Curve

* 利用roc_auc_score 算出 AUC = 0.7218111484913602
## Experience
* 一開始原本習慣性的要到colab去做,結果發現40GB的東西根本放不上去,後面在kaggle notebook上直接跑真的是發現新天地
* 在做這個資料前處理的時候,因為資料數量很不平均,所以要重新調整全重以及sampling,這些都是之前沒有做過的
* 因為這次沒有規定要用甚麼model去做,所以在尋找model的時候也看到了很多同的模型
* 雖然是第一次做muti-label的分類,但是跟之前寫的model感覺差不多,只是最後面要用AUC來判斷準確率