지난 시간에는 인공신경망으로 럭키백의 성능을 높여봤음! But, 층이 하나뿐이었음.
홍 선배🗣️ "딥"러닝인 만큼, 층을 더 추가해서 성능을 더 높여보자 ~!
.load_data()
함수로 데이터 준비함.은닉층
: 입력층과 출력층 사이에 있는 모든 층 (몇 개든 상관 없음!)Dense
)를 만들고, Sequential()
로 전달해서 만들 수 있음.activation
은 가장 대표적인 시그모이드로 일단 해봄.➕ 참고로, 여기서 은닉층의 뉴런 개수를 100개로 정한 건 특별한 기준이 있는 게 아니라, 경험적으로 본인이 판단해야 하는 부분입니다... 대신, 정보손실이 없도록 하려면 적어도 출력층의 유닛 개수보다는 많게 만들어야겠죠!
.summary()
로 모델에 대한 유용한 정보를 확인 가능. Dense()
클래스를 아예 Sequential()
안에서 바로!name
으로 층 이름도 설정해놓을 수 있음 (영문 only! summary
에서 그대로 나옴).add()
로 원하는 만큼 추가add()
속에 if문 등을 활용해서 조건에 따라 층을 추가할 수도 있음!.compile()
로 설정하고, .fit()
으로 훈련하는 과정은 동일하게 하면 됨!➕ "렐루 함수를 쓴 모델을 만들어 보기 전에 층도 하나 더 알려드리죠"
Flatten()
: 입력데이터를 1차원으로 펼쳐주는 유틸리티 층. (그냥 편의를 위한 층)summary
출력해보면 입력값 개수를 바로 알 수 있음! (걍 전처리 과정을 점점 모델 내에 포함시키는 추세의 연장선이라 보면 될 듯).reshape()
필요없어짐. + 렐루 함수 덕분에 성능 조금 더 좋아짐.100
, 활성화함수 activation
, 층의 종류 Dense
Flatten
, 배치크기 batch_size
, 반복횟수 epochs
등이 있었음.SGD()
: 이름은 그냥 SGD인데 실제로는 미니배치 경사하강법 (기본 배치크기=32)optimizer
로 지정할 수 있으며, [16]처럼 문자열로 호출하거나, [17]처럼 객체로 만들어놓고 호출할 수도 있음이제 여러 개의 층을 추가한 다층 인공 신경망까지 터득 완-료!
activation
에 아무것도 지정해주지 않으면 된다!keras.layers
모듈 아래에 있어서 '층'이라고 한다.370p. 시그모이드는 그냥 0~1로 압축해주는 역할이었음. 근데 얘를 중간에 끼워넣는다고 성능이 좋아지는 이유가 뭐지?
👨🏻🏫 활성화 함수를 사용하는 이유는 369페이지 설명을 참고하세요. 🆗 아 그러네요 착각했습니다^^;; 성능이 좋아지는 건 활성화함수가 아니라 층을 쌓았기 때문..! 활성화함수는 그저 출력값의 존재가 무색해지지 않게 비틀어주는 것뿐! (본문 #3-1 참고)
그렇다면 질문을 바꿔서 드려야하겠네요. 그냥 똑같은 종류의 Dense 층을 하나 더 쌓았을 뿐인데 성능이 좋아지는 이유가 궁금합니다! 한번에 10개의 유닛(z)으로 가는 게 아니라, 100개의 h를 거치고 다시 10개의 z로 가니까 더 특징을 잘 잡아낸다 정도로 이해하면 되는 걸까요..?
377p. 렐루함수는 z가 양수일 때 z를 그대로 쓰는데, 그러면 활성화함수로서의 의미가 없는 게 아닌가요? 오히려 시그모이드 함수는 지수함수를 써서 비선형적으로 틀어줬는데, 왜 더 단순한 렐루함수가 유용하게 쓰이는 건지요ㅠ (음수는 걍 무시해버리는데 이것도 괜찮은 건지,,)
376p. 경사하강법에서 점진적으로 학습하려면
partial.fit
으로 훈련시킨다고 배웠습니다. 그런데 제가 우연히 <run>을 잘못 눌러서fit
으로 한번 더 훈련시켰는데 성능이 높아지는 것을 발견했습니다. 혹시 이건 왜 그런 걸까요?👨🏻🏫 케라스에서는
fit()
메서드가 점진적인 학습 방법입니다. 🆗 오호라!
384p. 고급 옵티마이저인 Adam을 사용했는데도 성능이 거의 동일하게 나온 이유가 궁금합니다. 혹시 성능은 비슷한 대신 시간이 더 줄어드나요?
어떤 옵티마이저가 항상 더 나은 성능을 낸다는 보장은 없습니다. 🆗 그래.. 그냥 해당 문제에 더 잘 맞냐 안 맞냐가 있는 거겠지..!
지난 시간에 배운 신경망에서 층을 추가하는 방법을 배웠다. 그러니 사실상 이제서야 신경망의 기본적인 형태를 배운 셈..! 다만 여러가지 고급 옵티마이저들을 보니 또 할 게 많이 남았다는 생각이 밀려온다 🥲 저스트 킵 고잉 ..
여전히 패션 럭키백을 만드는데, 지난 번에 만든 인공신경망을 더 업그레이드 하기로 함! = 심층신경망 → 이번엔 입력층과 출력층 사이에 은닉층이라는 걸 하나 추가함! → 층 추가하는 방법 (1) 객체로 만들고 전달 (2) Sequential 내에서 바로 생성 (3) 객체는 아니고 add 메소드로 전달 → 시그모이드 활성화함수의 단점을 극복한 렐루 활성화함수를 새롭게 도입 + 입력데이터를 일렬로 펼쳐주는 Flatten 층도 새로 도입 → 확실히 성능 좋아짐! → 더 나아가, 하강법의 종류를 설정해서 성능 더더욱 높일 수 있는 옵티마이저까지 배움!