http://futurelab.creatorlink.net/
1) output layer와 class의 연관성
-> output layer node는 각각 class가 될 확률이다.
즉, output layer node개수 = class 개수
2) softmax의 연산과정 (y_hat)

3) one-hot encoding (y) : multiclass classification의 label 표현법
class의 표현 : vector
-> 서로 연관성이 존재하지 않는 class 간의 독립성을 표현하기 위해 class를 vector로 표현한다.
=> 이 때 사용하는 것이 one-hot encoding
4) loss 계산 : L(y, y_hat)

but, 사실 딥러닝에서는 Dropout을 더 많이 사용

1. 데이터 업로드 및 확인
2. data preprocess
-형변환 : tensorflow는 기본적으로 'float32'를 사용해서 astype을 사용해 형변환
-normalizaiton : 0~255 -> 0~1
-flatten : dense layer는 vector만 input으로 받을 수 있어서, 3D-array를 flatten
-one-hot encoding : 단어 집합의 크기를 벡터의 차원으로 하고, 표현하고 싶은 단어의 인덱스에 1의 값을 부여하고, 다른 인덱스에는 0을 부여하는 단어의 벡터 표현 방식
(tensorflow.keras.utils에서 to_categorical로 실행 가능)
loss선택
1) 원핫인코딩 안한경우 -> sparse_categorical_crossentropy
2) 원핫인코딩 한 경우 ->categorical_crossentropy
3. 모델 만들기
-Seuquential을 함수 안에 넣기

4. 모델의 학습과정 설정(compile)
compile은 3가지 argument가 핵심!!
1) optimizer
2) loss
3) metrics(평가지표) : 대표적으로 accuracy가 존재,
-s가 들어간 건 list자료형으로 argument를 구성
5. 모델 학습 (fit)
fit의 기본 parameter
1) x:feature = input
2) y: label
3) epochs : 전체 데이터를 몇 번 학습할 것이냐
4) verbose : train할 때 표시되는 bar
5) validationsplit : 여기서 data split 가능, but random하게 나눔으로 재현 불가능
6) validation_data : train_test_split으로 미리 data를 잘라 두었다면 'validation_data = (x_val, y_val)' 식으로 할당 가능
6. 학습과정 graph -> underfit,overfit 판단가능, 이를 바탕으로 수정
7. 최종 test(evaluate) : test set으로 마지막 검증하는 과정 ( y값을 넣어 y와 비교)
_vs. predict : 정답(label,y)를 모르고 주어진 x에 대해서 예측
+holdout validation : fit에서 data split이 가능하나, 랜덤하게 분할하므로 재현 불가능 하다는 단점이 있다.
따라서 train_test_split으로 미리 분할하는 것을 추천! (재현 가능)
stratify를 통해 계층화

++ 2D 이상의 ndarray flatten하는 법
-1) numpy.ndarray.reshape == numpy.ndarray.flatten == numpy.ndarray.ravel
-2) tensorflow.keras.layers.Flatten