가지고 있는 list 형식의 data에서 특정 조건을 만족하는 값들로 다시 array를 만들고 싶을때.



import numpy as np


array = np.random.rand(100)

# 조건식 주고 idx 뽑기

idx = np.where(array>0.5)[0]

# 랜덤하게 인덱스 뽑기

test = np.random.choice(idx,10)

# array

new_array = array[test]


print(array)

print(len(array))

print('-----------------------------------------------------------')

print(idx)

print(len(idx))

print('-----------------------------------------------------------')

print(len(new_array))

print(new_array)




'Study > Code' 카테고리의 다른 글

python href 크롤링  (0) 2019.08.13
python list 중복 값 카운터하기  (0) 2019.02.22
Python Asterisk 가변인자. *args, **kargs  (0) 2018.12.28
Python lamdba, map ,reduce  (0) 2018.12.27
Python list Comprehension  (0) 2018.12.27

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 

  1. 데이터를 생성.
  2. 셔플 함수를 통해 데이터 인덱스를 무작위로 섞음.
  3. start_index와 finish_index를 batch_size만큼 해당 index의 데이터를 뽑아옴.
  4. start_index와 finish_index를 batch_size만큼 더 해줘 index의 위치를 변경.
  5.  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



MNIST 데이터셋

  • 0 ~ 9 까지의 숫자를 필기체 이미지와 라벨 데이터를 가지고 있는 데이터셋.
  • 28 x 28 사이즈의 크기이며, 흑백을 가짐.
  • train data 60000개, test data 10000개, vaildation data 5000개로 구성.

 

 0

1

 2

 4

 6

 8

 9

 train

 5444

6179

5470 

5638 

5307 

4987 

5417 

5715 

5389 

5454 

 test

980 

1135 

1032 

1010 

982 

892 

958 

1028 

974 

1009 

vaildation 

479 

563 

488 

493 

535 

434 

501 

550 

462 

495 




cifar10 데이터셋

  • 총 10개의 클래스를 가지는 이미지와 라벨 데이터를 가지고 있는 데이터셋
  • 32 x 32 사이즈의 크기이며, 컬러를 가짐.
  • train data 50000개 test data 10000개로 구성

 

 0

1

 2

 4

 6

 8

 9

 train

 5000

5000

5000

5000

5000 

5000

5000

5000

5000

5000

 test

1000

1000

1000

1000

1000

1000

1000

1000

1000

1000


그래픽 카드(GPU)는 기본적으로 두 종류 쿨러 타입을 가집니다.

블로워(Blower) 방식과 비블로워 방식이 되겠습니다.

이 방식은 GPU 팬이 열을 흡입해 어느 방향으로 내뿜는지에 따라 달라지게 됩니다.


블로워 방식의 경우 열을 흡입해 본체뒤로 내뿜게 됩니다.

반대로 비블로워 방식의 경우 열을 흡입해 gpu의 양옆으로 내뿜는 구조입니다.


딥러닝을 가동하는 서버 컴퓨터의 경우 여러개의 GPU를 사용하게 됩니다.

이에따라 gpu로 인해 본체 내에 많은 열을 발생하게 됩니다.

딥러닝용 서버 컴퓨터의 경우 여러개의 gpu에서 열을 발생 시키기 때문에 본체 밖으로 열을 배출하는 

블로워 타입을 추천합니다.


1080ti 4개를 다는 서버로 테스트를 진행했을때 비블로워 타입의 경우 온도가 100도 넘게 

올라가는 것을 확인 할수 있었습니다.


블로워 타입의 경우 reference 타입의 그래픽 카드를 구매하시면 되겠습니다.

reference 타입 : 그래픽 카드 모델의 기본형이 되겠습니다.

비 reference  타입 : 제조사가 성능이나 쿨러등을 변경한 모델. (ex. 조텍, 이엠텍, 등등등...)

블로워타입 장단점.
  • 열을 케이스 밖으로 빼내는 구조로 케이스 내부 공기 배출이 잘 안되는 구조나 멀티 gpu 구조에 유리.
  • high rpm에서 소음이 심함.
  • 모델의 성능이나 쿨링 성능은 떨어짐.






Tensorflow 학습 시 발생하는 에러.

  • 학습시 사용되는 data 타입 불일치.
  • Sess.run으로 return 받는 변수명이 중복일때.

ValueError: Cannot feed value of shape (10,) for Tensor u'Placeholder_1:0', which has shape '(?, 10)'



sess.run을 통해 return 받는 변수 명이 같을때 발생...

train 데이터 학습시 sess.run으로 리턴 받는 변수명과 

test 데이터 학습시 sess.run으로 리턴 받는 변수명을 다르게 한다.

cost, layer, y, acc = sess.run([cost, L4, Y, accuracy], feed_dict=train_feed_dict)

cost, layer, y, acc = sess.run([cost, L4, Y, accuracy], feed_dict=test_feed_dict)

train_cost, train_layer, train_y, test_acc = sess.run([cost, L4, Y, accuracy], feed_dict=train_feed_dict)

test_cost, test_layer, test_y, test_acc = sess.run([cost, L4, Y, accuracy], feed_dict=test_feed_dict)


+ Recent posts