사실 난 K-Digital-Training 과정을 듣기 전에 나의 메타인지를 위해(난 도대체 어떤 부분이 모자랄까...를 알기 위해) 맛보기로 KDC 과정으로 아이펠의 '쫄지말자 딥러닝'과 '캐글러로 가는 데이터 분석 첫걸음'을 들었었다. 그러다 보니 오늘 하는 '인공지능으로 가위바위보 만들기' 프로젝트도 한 번 했던 것 같다. 그래서 나는 이번에는 했던걸 반복한다는 느낌보다 나 혼자서 전체적인 그림 생각해보기
, 혹시나 새롭게 이 문제에 다가갈 방법은 없을지
를 고민하며 진행할 예정이다.
오늘이 지난 후
후기)
: 사실 해보니 새롭게 이 문제를 바라보게 된다기 보다 복습하는 듯한 느낌이었다. 이전에 놓쳤던 부분인데 이번에는 제대로 이해됐다라고 할까...
"데이터 준비 → 딥러닝 네트워크 설계 → 학습 → 테스트(평가)"의 순서대로
만들게 된단다.
centered by bounding box
rather than center of mass(데이터 양질화)np.min()
, np.max()
에 3차원 벡터가 들어가면 뭘 기준으로 값을 뽑아내나 찾아보니 기본적으로 flattened input을 사용한단다.Sequential API는 개발의 자유도는 많이 떨어지지만, 매우 간단하게 딥러닝 모델을 만들어낼 수 있는 방법입니다. 여러분들은 이 방법을 통해 미리 정의된 딥러닝 레이어(layer)를 손쉽게 추가할 수 있습니다.
1) model = keras.model.Sequential() # 모델 생성 2) model.add(keras.layers...) # 레이어 쌓기 3) model.compile(optimizer='adam'...) # 학습할 수 있게 configuration 4) model.fit(x_train, y_train, epoch=) # 모델 학습 5) model.evaluate(x_test, y_test) # 모델 평가(테스트 데이터로) 6) model.predict(x_test) # 모델이 추론한 값만 보기
dataset
을 0~1로 정규화를 나름 해주었다.array
였는데, 그걸 다 255로 나누었다.glob
모듈each multiplied by 2 from original | total params | test_accuracy |
---|---|---|
n_channel_1(16 -> 32) | 35,530 | 0.9871 |
n_channel_2(32 -> 64) | 61,002 | 0.9904 |
n_dense(32 -> 64) | 56,714 | 0.9899 |
n_train_epoch(10 -> 20) | 30,762 | 0.9905 |
하이퍼파라미터 튜닝 등을 위해 모델을 여러 개 만든다면...
데이터 퀄리티의 중요성 !
결론은 test, 즉 실제 데이터에 흡사한 train 데이터가 많은 게 좋다.
이미지 데이터의 전처리(이 부분도 살짝 헤맴)
array
로 가져와보니 채널이 4개Image.open().convert('RGB')
로 3채널로 바꿀 수 있다.array
자체를 4채널로 정해놓고 딥러닝 모델의 인풋도 그렇게 하면 문제 없다.1) 왜 숫자(0~9)는 10개의 class
로 구현할까? 잘 모르니 던져보자면 '숫자'라는 1개의 class
에 10개의 정보를 담을 수는 없을까?
-> 어쩌면 진짜 python의 class
개념이 아니라 kind
의 개념일 수도 있겠다...
2) dataset
이 array 1개(0~255)까지인데(물론 shape은 이미지이니 4차원) 다른 abnormaly different한 데이터 컬럼이 없는데도 255를 나눠서 정규화를 한 이유는 뭘까...?
keras
에서 model.evaluate()
, model.predict()
의 차이(evaluate 후 같은 데이터를 predict에 써도 될까...?)import numpy as np
def load_data(img_path, number_of_data=300): # 가위바위보 이미지 개수 총합에 주의하세요.
# 가위 : 0, 바위 : 1, 보 : 2
img_size=28
color=3
#이미지 데이터와 라벨(가위 : 0, 바위 : 1, 보 : 2) 데이터를 담을 행렬(matrix) 영역을 생성합니다.
imgs=np.zeros(number_of_data*img_size*img_size*color,dtype=np.int32).reshape(number_of_data,img_size,img_size,color)
labels=np.zeros(number_of_data,dtype=np.int32)
idx=0
for file in glob.iglob(img_path+'/scissor/*.jpg'):
img = np.array(Image.open(file),dtype=np.int32)
imgs[idx,:,:,:]=img # 데이터 영역에 이미지 행렬을 복사
labels[idx]=0 # 가위 : 0
idx=idx+1
for file in glob.iglob(img_path+'/rock/*.jpg'):
img = np.array(Image.open(file),dtype=np.int32)
imgs[idx,:,:,:]=img # 데이터 영역에 이미지 행렬을 복사
labels[idx]=1 # 바위 : 1
idx=idx+1
for file in glob.iglob(img_path+'/paper/*.jpg'):
img = np.array(Image.open(file),dtype=np.int32)
imgs[idx,:,:,:]=img # 데이터 영역에 이미지 행렬을 복사
labels[idx]=2 # 보 : 2
idx=idx+1
print("학습데이터(x_train)의 이미지 개수는", idx,"입니다.")
return imgs, labels
image_dir_path = os.getenv("HOME") + "/aiffel/rock_scissor_paper"
(x_train, y_train)=load_data(image_dir_path)
x_train_norm = x_train/255.0 # 입력은 0~1 사이의 값으로 정규화
print("x_train shape: {}".format(x_train.shape))
print("y_train shape: {}".format(y_train.shape))
>>>
학습데이터(x_train)의 이미지 개수는 300 입니다.
x_train shape: (300, 28, 28, 3)
y_train shape: (300,)
이 코드가 하는 걸 정리하자면,
1)np.zeros()
array를 만듦
2) 그 array는 크기가 받을 이미지 데이터의 갯수와 가로, 세로 픽셀수 그리고 컬러채널 수의 곱, 즉 다 담는 크기이다.
3) 그리고 이미지 파일을 불러온다.
4)for loop
를 사용하고, 불러온 순서대로 값을 지정한다.
5) 어떤 값이냐면, 이미지 데이터 그 자체를 다시 할당,
6) 다른 쪽에서는 그 값의 label을 같은 순서에 담는 array 업데이트