Imbalanced data를 실험을 해야 할때 발생한 문제점과 코드 작성 주의사항.
보통 Imbalanced data를 실험할때 기본 데이터 셋에서 실험할 데이터 크기에따라 Imbalance 한 데이터 셋을 만들어야 한다. 여기 데이터 셋을 만들때 데이터가 중복되지 않도록 만드는 것이 중요함.
-> 데이터의 크기가 정말로 많다면 별 영향을 미치지 않을 거지만, 소수의 데이터, 즉 우리가 실험하고자 하는 Imbalance 한 데이터의 경우 각 클래스 별로 데이터 수가 다르고 이러한 imbalance 데이터들이 deep learning 학습에 영향을 주는지 확인을 해야하기 때문에 중요한 사항이 된다.
Imbalanced data에 대해 data크기 만큼의 정확한 학습을 하기 위해선 배치 단위 학습시에 배치의 크기로 데이터의 크기를 나눴을때 나머지가 0이 나오도록 해 데이터 전체가 학습에 사용되도록 한다.
ex) (len(imbalance_data) / batch_size)) == 0
-> 이부분은 imbalance 데이터가 epoch 단위 학습시 데이터 전체가 사용되게 하기 위함이다. 기본적인 deep learing 학습시 배치 사이즈를 4,8,16,32,64,128 이런식의 배치 사이즈를 많이 따르게 된다. 배치 사이즈와 트레이닝 데이터의 사이즈가 딱 맞아 떨어지지 않을 경우 학습시 데이터가 잘리는 현상이 발생하게 되기 때문에 이부분도 중요하다 생각이 든다.
또한 데이터의 feature map이나 어떠한 작업을 추후에 할 경우 기존에 생성한 train data의 수가 맞지 않는 문제가 발생. 즉 생성한 데이터의 수와 실제로 사용된 데이터의 수가 차이남. 정확한 실험 불가능.
Code
- 데이터를 생성.
- 셔플 함수를 통해 데이터 인덱스를 무작위로 섞음.
- start_index와 finish_index를 batch_size만큼 해당 index의 데이터를 뽑아옴.
- start_index와 finish_index를 batch_size만큼 더 해줘 index의 위치를 변경.
- 3, 4 번을 반복하며 데이터 학습.
def data_shuffle(data_x, data_y):
print('train data shuffle')
idx = np.arange(0, len(data_x))
np.random.shuffle(idx)
idx = idx[:len(data_x)]
data_shuffle = [data_x[i] for i in idx]
labels_shuffle = [data_y[i] for i in idx]
return np.asarray(data_shuffle), np.asarray(labels_shuffle)
def next_batch(start_index, finish_index, data_x, data_y):
data_shuffle = data_x[start_index:finish_index]
labels_shuffle = data_y[start_index:finish_index]
return np.asarray(data_shuffle), np.asarray(labels_shuffle)
train_x, train_y, test_x, test_y , vali_x, vali_y = mnist_function.data_set(count)
train_x, train_y = mnist_function.data_shuffle(train_x, train_y)
start_index = 0
finish_index = batch_size
for i in range(total_batch):
batch = mnist_function.next_batch(start_index, finish_index, train_x, train_y)
start_index += batch_size
finish_index += batch_size
'Study > Deep Learning' 카테고리의 다른 글
Pytorch model parameter save & load & change parameter (0) | 2019.04.05 |
---|---|
PyTorch 기초. MNIST 데이터를 이용한 Neural Networks (1) | 2019.02.26 |
MNIST & Cifar10 데이터셋 (0) | 2019.02.16 |
tensorflow ValueError: Cannot feed value of shape (10,) for Tensor u'Placeholder_1:0', which has shape '(?, 10)' (0) | 2019.02.05 |
Cifar10 Tensorflow example (0) | 2019.01.04 |