사용가능한 gpu의 list를 보려면 다음과 같이 입력해서 확인합니다.

후에 출력되는 name부분을 보시면 됩니다.

from tensorflow.python.client import device_lib
print(device_lib.list_local_devices())


현재 2개의 gpu를 가지고 있다고 생각하면 cpu:0, gpu:0, gpu:1로 나타낼 수 있습니다.

os.environ["CUDA_DEVICE_ORDER"]="PCI_BUS_ID";
# 1번째 gpu를 사용하고 싶다면, 
os.environ["CUDA_VISIBLE_DEVICES"]="1";  

더해서

with K.tf.device('/gpu:1'):
	~
    model.fit(~)
    ~

의 방법도 있습니다.

 

Ndivia driver 삭제

sudo apt-get remove --purge '^nvidia-.*' 

 

CUDA 삭제

sudo apt-get --purge remove 'cuda*'
sudo apt-get autoremove --purge 'cuda*'

CUDA 파일 삭제

sudo rm -rf /usr/local/cuda
or
sudo rm -rf /usr/local/cuda-10.0

 

machine learning 분야에서 성능에 가장 중요한 영향을 끼치는 요소 중 하나가 데이터인 것에는 틀림이 없습니다. 

train시에 input을 어떤 데이터로 구성하느냐에 따라 성능이 향상할지 감소할지가 결정되죠.

이때 주로 사용하게 되는 것이 CV(cross-validation)방법입니다. 

test set을 제외하고 모든 데이터를 사용하여 학습을 시키게 되며 이 중 어느 부분은 validation set(Dev-set)으로 쪼개지게되어 성능을 검증하는데 사용하게 됩니다. 

train_idx, val_idx = train_test_split(its, train_size = 0.8, random_state = 80)

하지만 여러가지 이유(시간 부족, 학습 환경 부실)로 인해 CV를 사용하기가 힘든 경우라면?

신경망을 한번 학습시키는데만 해도 엄청난 시간이 필요하며 한 cycle(큰 수의 epoch)을 돌리는데 시간 뿐만 아니라 학습 환경또한 벅찬 경우가 있습니다. 


train set으로 학습시키고 validation set으로 검증한 뒤, test set을 사용하여 최종 결과물을 낸 model이 있습니다.

하지만 이 모델은 validation set으로 사용한 데이터를 한번도 보지 못했기때문에 아마(100% 확실하지 않기 떄문) 성능이 떨어질거라고 예상됩니다. 모델은 데이터를 많이 보면 볼수록 견고(robust)해지고, 최종적으로 일반적이게 되니까요.

그럼 우리는 최종 모델을 어떻게든 저장을 했을 겁니다. hdf5든 h5든 어떠한 형식으로든요. 다시 로드해서 이번엔 split 과정을 거치지 않습니다. 모델을 더욱 강화시키기 위해서 entire set으로 retrain시킵니다. 이때 당연한 사실이지만 반드시 test set은 건들지 말아야합니다.

이렇게 해서 새롭게 얻어진 모델로 inference를 하여 최종 성능을 얻을 수 있습니다. 

이상적으로 CV를 통해 score를 얻을 수 있다면, 이를 이용해서 비교헀을때 성능이 유사함을 알 수 있습니다.

신경망의 성능을 향상시키는 방법에는 상당히 많은 방법이 존재합니다. 도메인이나 모델에 따라서도 다양하게 존재합니다.

하지만 공통적으로 모델을 구성하기 전에 가장 중요한 방법이 있습니다.

바로 Data augmentation 작업입니다.

데이터 증식은 flip, shear, translation, rotation 등의 방법을 제공하여 train set을 부풀리게 해주고, 우리가 구성한 모델을 더욱 견고하게 만들어주는 역할을 합니다. (모델이 한번도 보지 않은 이미지를 계속해서 보게함으로써 최종적으로 general한 모델로 만들어지니까요)

car image augmentation - 이미지 출처 캐글 코리아 3차대회

이는 Train에서의 augmentation 방법이며, test에서의 augmentation 방법이 따로 있습니다. 그리고 이것을 Test Time Augmentation(TTA)라고 부릅니다.


TTA는 증강된 이미지를 여러번 보여준 다음 각각의 단계에 대해서 prediction을 평균하고 이 결과를 최종값으로 사용하는 것입니다.

이 방법을 사용하면 가장 좋은 점은 1번만 예측하여 결과를 도출했을 시에 해당 차량의 클래스가 아니라고 추측하는 반면, TTA를 통해 도출된 최종 결과값은 올바른 차량의 클래스라고 맞춘다는 것입니다. 

이미 앙상블을 경험해 보셨다면(Xgboost + RF + adaboost etc.), 이 말이 무슨 뜻인지 이해하기 쉽습니다.

가장 쉽게 말해서 prediction ensemble이라고 생각하면 편합니다. 

keras에서 사용하기는 더욱 쉽습니다. 단 몇줄의 코드로 끝나게 됩니다. 

tta_steps = 10
predictions = []

for i in tqdm(range(tta_steps)):
	# generator 초기화
    test_generator.reset()
    
    preds = model.predict_generator(generator = test_generator, steps = len(test_set) // batch_size, verbose = 1)
    predictions.append(preds)

# 평균을 통한 final prediction
pred = np.mean(predictions, axis=0)

# argmax for submission
np.mean(np.equal(np.argmax(y_val, axis=-1), np.argmax(pred, axis=-1)))

+ tqdm은 for-loop의 상태진행바를 나타내주는 library입니다(pip install tqdm)

Reference

https://towardsdatascience.com/test-time-augmentation-tta-and-how-to-perform-it-with-keras-4ac19b67fb4d
https://www.kaggle.com/c/2019-3rd-ml-month-with-kakr

'# Machine Learning > Keras Implementation' 카테고리의 다른 글

Keras Custom Activation 사용해보기  (0) 2019.10.27
keras Custom generator - 1  (1) 2019.07.29
Keras callback함수 쓰기  (0) 2018.12.23
Keras ImageDataGenerator flow 사용  (0) 2018.12.20
CNN visualization code (3)  (0) 2018.11.26
1. tf.feature_column.numeric_column

- 단순하게 수치형으로 바꿔준다. 

예를 들어, housing 데이터에서 tf.feature_column.numeric_column('logitude')

2. tf.feature_column.bucketized_column

- 수치형 데이터를 버킷화(구간 분할) 시켜준다. 

예를 들어, tf.feature_column.bucketized_column("col", boundaries = [0., 1., 2.]) 으로 선언하면 데이터의 각 구간을 

(-inf ~ 0), [0~1), [1~2), [2~inf)로 나누어준다.

3. tf.feature_column.categorical_column_with_vocabulary_list("col", list)

- 각 값을 label화 시켜줍니다.

예를 들어, ['man', 'woman'] -> [0, 1]로 ID를 붙여줍니다.

보통 one-hot encoding을 하려고할 때 쓰이기 때문에 tf.feature_column.indicator_column과 같이 쓰입니다.

예를 들어, [0, 1]로 label화 되어있는 것을 [[1, 0], [0, 1]]로 바꾸어줍니다.

4. tf.feature_column.crossed_column([col_a, col_b,...], hash_bucket_size)

- pandas에서 groupby를 통한 feature 생성이라고 생각하면 쉽습니다. 이 함수는 범주형 특성에 대해 특성교차를 제공합니다.

hash_bucket_size는 특성교차시에 얼마나 많은 버킷을 생성할지 입니다. 

5. tf.feature_column_embedding_column(col, dimension)

- 범주형 또는 카테고리형 데이터에 모두 사용할 수 있습니다. 함수 그대로 임베딩 벡터를 제공합니다. 

'# Machine Learning > TensorFlow Function' 카테고리의 다른 글

tf.data.dataset.window 예시  (0) 2020.04.05
tensorflow Loss 함수에 존재하는 from_logits란  (3) 2020.03.06
tf.image.non_max_suppression  (0) 2019.04.16
tf.boolean_mask  (0) 2019.04.15
tf.nn.embedding_lookup 예시  (0) 2019.04.13