행위

"Python 라이브러리를 활용한 인공지능"의 두 판 사이의 차이

라이언의 꿀팁백과

 
(사용자 2명의 중간 판 68개는 보이지 않습니다)
28번째 줄: 28번째 줄:


== 책 ==
== 책 ==
도서를 읽으며 학습한 내용을 아래에 간략히 정리했다.
도서를 읽으며 학습한 내용은 별도 페이지인 [[핸즈온 머신러닝(2판)(책)]]을 참고하자.


=== 필요한 기술 ===
== 강의 ==
책을 읽으려면 아래 기술과 친숙해야 한다.
총 5일 동안 교육한 내용을 아래에 간략히 정리했다.
 
=== 1일차 ===
 
* 인공지능 관련 지루한 설명을 들었다.
*파일 공유를 위한 주소(https://tinyurl.com/ai220808<nowiki/>)를 공유 받았다.
*인공지능 공식을 간략히 소개하면  y=Wx 의 행렬곱이다.
**W 는 가중치(weight)를 의미한다.
*강사님이 딥러닝은 인간의 뇌를 모방했다면서 "유재석" 얘기를 했는데 앞에 앉아 있는 어떤 학생이 유재석이 나오는 <유퀴즈 온 더 블록>을 보고 있어서 어이 없었다.
*수업에서는 파이썬 언어, 수집(BeautiflSoup), 분석(Pandas), 시각화(Matplolib, Seaborn), ML 까지 실습을 하며 이를 위해 아나콘다(Anaconda)를 설치하며, 실습은 함께 설치하는 주피터(Jupyter)를 활용.
*환경설정은 아래와 같이 함
*#Anaconda 다운로드 https://www.anaconda.com/products/distribution
*#설치
*#주피터 노트북 실행  <br /><br />[[파일:20220808-주피터 실행.png|프레임없음|618x618픽셀]]  <br />
*주피터 노트북에 CSS를 적용하려면 윈도우 10 기준으로 %HOMEPATH% 에 .jupyter 폴더를 만든 후, 이어서 방금 만든 폴더 안에 custom 폴더를 만든다. 이어서 custom.css 라는 파일로 아래 CSS 파일을 custom 폴더에 저장한다. 그런 후 주피터 노트북을 재실행하면 CSS가 적용된다.<br />
<syntaxhighlight lang="css" line="1" start="1">
.container { width:100% !important; }
.CodeMirror {font-family: D2Coding; font-size: 22pt; line-height: 140%;}
div.output {
    font-family: D2Coding;
    font-size: 12pt;
}
div.prompt {
    padding-left: 0;
    min-width: 2ex;
}
</syntaxhighlight>
 
* D2Coding 폰트를 설치했다. (https://github.com/naver/d2codingfont)
*시험 공지를 해줬다. 4지선다 15문제, 단답형 5문제로 총 20문제다.
**(시험) 머신러닝 학습 특성에 따른 분류 : Supervised, Unsupervised, Reinforcement Learning
*주피터에서 파이썬 자료형, 제어문 등 기본 문법을 실습했다.
 
=== 2일차 ===


* 넘파이(Numpy) https://numpy.org/
* 오늘은 버스가 많이 막혀서 9:28 에 도착했다. 도착하기 전에 전화를 주셔서 "도착했어요!" 라고 얘기했다. KCP 수업 담당자님께서 강사님이 교통 체증으로 늦어서 양해의 표현으로 커피를 샀으니 마시라고 하셨다. 하하하. 그런데 강사님이 내가 도착한 후 1분 뒤에 오셨다. 강사님이 매번 늦어서 커피가 매번 제공되면 좋겠다.
* 판다스(Pandas) https://pandas.pydata.org/
* 어제 학습한 내용을 복습했다.
* 맷플롯립(Matplotlib) https://matplotlib.org/
* 주피터 노트북에서 모든 명령어를 다시 실행하려면 Kernel 메뉴에 있는 Restart & Run All 을 실행한다.  <br />[[파일:주피터 노트북에서 명령어 모두 다시 실행하기.png|프레임없음|600x600픽셀]]
*저 강사님 수업을 아마도 3년 전에 다른 수업에서 들었던 것 같다. 과거에 했던 로또 당첨번호 웹 스크래핑 실습을 또 한다. 사골국물도 아니고 이게 뭔가요?!?!?! ㅠ.ㅠ
*아무튼 나는 현재까지 당첨된 로또 번호 및 보너스 번호를 출력하는 프로그램으로 개량했다. (3년 전에도 똑같은 걸 했었다 ㅎ.ㅎ) <br />[[파일:로또 1등 및 보너스 번호.png|프레임없음|1000x1000픽셀]]
 
*이어서 타이타닉 호 승객 생존 예측 미니 프로젝트를 하는데 이것도 아마 3년 전에 했던 것 같다.
*파이썬 라이브러리 Numpy는 수치연산을 매우 빠르게 하는데 이것이 가능한 이유는 내부 코드를 C/C++로 구현했기 때문이다.
*코로나 이전에 기상청 직원이 강의를 수강했는데 거기는 여전히 포트란(Fortran)을 사용하고 있다고 한다. 다만 이를 Python에서 사용할 수 있게 바인딩해서 사용을 하고 있다고 한다.
*점심시간 전에 <타이타닉 호 승객 생존 예측 미니 프로젝트>를 위한 사전 작업을 완료했다. (데이터 제공, 가설 수립 등)
*커피 사주셨다. 나 퀴즈 틀렸는데? ㅋㅋㅋㅋㅋㅋㅋㅋ 위로커피인듯...  
*Dataframe의 info() 함수 결과값에서서 중요하게 봐야 하는 것 중 하나는 Non-Null Column 개수로 결측치 정도를 확인해야 한다. 이 값에 다라 해당 데이터를 활용할 수 있을지 없을지가 결정되기 때문이다.
*데이터 타입은 아래와 같이 나뉨
**수치형
***이산형 : 정수
***연속형 : 실수
**범주형
***명목형 : 혈액형
***순서형 : 학점, 성적
*Pandas의 Dataframe을 통해 데이터를 조작하는 것은 정말 사기다. 안 쓸 수 없다.  
*'''원-핫 인코딩(One-Hot Encoding)'''은 단어 집합의 크기를 벡터의 차원으로 하고, 표현하고 싶은 단어의 인덱스에 1의 값을 부여하고, 다른 인덱스에는 0을 부여하는 단어의 벡터 표현 방식입니다. 이렇게 표현된 벡터를 원-핫 벡터(One-Hot vector)라고 함 ([https://wikidocs.net/22647 링크])
*결측치를 채우는 방법을 배움
 
=== 3일차 ===


==== 2일차 복습 ====
* iPhyon 노트북은 서로 독립적이기 때문에 매번 import 문 등을 동일하게 추가해야 한다.
* Pandas의 static member function을 통해 엑셀파일을 읽을 수 있다. (C++, Java와 같은 언어에서는 인스턴스가 아닌 객체명으로 멤버를 호출했으니 정적 멤버함수가 맞는데 파이썬에서도 동일한가? 알아봐야할듯)
** df = pd.read_excel("파일명")
* 타이타닉 데이터 분석에서 파일을 연 후에 가장 먼저 한 행동은 특성 탐색
* 머신러닝을 활용하려면 입력과 출력이 반드시 숫자가 되어야 함 (예: 알파벳을 이해하려면 대소문자 알파벳 52자를 숫자로 변환한 후 학습을 시켜야 함)
* Dataframe 에서 교차표는 crosstab 함수로 그리며 합계를 추가하려면 margins=True 를 작성
* 데이터를 범주형으로 만들려면 Dataframe의 cut 함수 사용
**df['age_cat'] = pd.cut(df['age'], bins=[0,10,20,50,80], include_lowest=True, labels=['baby', 'teenage', 'adult', 'old'])
* Pandas에서 데이터를 반환하는 게 아니라 호출한 객체 값이 저장하게 하려면 inplace=True 를 추가하면 됨 (항상 그렇다는 건 아님)
* 현실에 맞게 학습하려면 이상치를 포함하는 게 맞음
* df[df['fare'].isnull()] : 운임이 null(결측치)인 사람 찾기
* df['survived'].value_counts() : 생존자 수 카운트


앞에 있는 파이썬의 과학 라이브러리(3종)를 학습하려면 아래 링크를 참고하자.
==== 머신러닝 코딩 5단계 ====


* 넘파이(Numpy)https://github.com/rickiepark/handson-ml2/blob/master/tools_numpy.ipynb
# 훈련 데이터와 테스트 데이터를 나눈다. : train_test_split
* 판다스(Pandas) https://github.com/rickiepark/handson-ml2/blob/master/tools_pandas.ipynb
# ML 알고리즘 선택
* 맷플롯립(Matplotlib) https://github.com/rickiepark/handson-ml2/blob/master/tools_matplotlib.ipynb
#* 머신러닝 알고리즘은 수학
# 훈련 : fit
# 평가 : score
# 새 데이터로 예측 : predict


==== 수업내용 필기 ====


파이썬을 잘 모른다면 아래 링크에서 학습하면 좋다.
* Tree를 여러 개 가져다가 다수결로 결정하는 알고리즘을 앙상블(Ensemble) 이라고 합니다.
* train_test_split 함수를 통해 학습 데이터와 테스트 데이터를 나눌 수 있는데, 이 때 random_state 값을 설정해야 하이퍼파라메터 조정을 하는 데 애로사항이 없다.
* 머신러닝이 최종적으로 하는 일은 가지로 나눌 수 있음 → 분류를 잘하거나 값을 맞추거나
** DecisionTreeClassifier : 분류
** DecisionTreeRegression : 값
* 대부분의 머신러닝 알고리즘 함수에는 -Classifier 또는 -Regression 이 붙음


* https://learnpython.org/
=== 오후수업 ===
* https://docs.python.org/ko/3/tutorial/
케라스 관련해서는 [http://www.kyobobook.co.kr/product/detailViewKor.laf?mallGb=KOR&ejkGb=KOR&barcode=9791160505979 <케라스 창시자에게 배우는 딥러닝>]이라는 책이 번역이 잘 되었다고 한다.


=== 파이썬 관련 인공지능 프레임워크 ===
* '''ML 코딩 5단계'''
*# 훈련 데이터와 테스트 데이터로 나눈다 : train_test_split
*# ML 알고리즘 선탱
*# 훈련 : fit
*# 평가 : score
*# 새 데이터로 예측 : predict
* '''ML 문제 분류'''
** 분류
*** 이진
**** 0
**** 1
*** 다중
**** A
**** B
**** C
**** ...
** 회귀
*** 값 예측
*주피터 노트북에서 외부 명령어를 실행하려면 '''"! 명령어"'''를 입력한다.
*최근에는 '''앙상블 모델'''을 이용하고 있다.
*앙상블 모델은 트리로 이루어진다. (예: 랜덤 포레스트)
*Kaggle 사이트(https://www.kaggle.com/<nowiki/>)에서 1% 이내에 들면 원하는 곳 취업 가능
*선형회귀 실습을 했다.
*SVM 실습을 했다.
*sigmoid 활성화 함수에 대해 언급했다.
*정규화를 위해 가장 많이 쓰는 애들은 StandardScaler, MinMaxScaler 이다.
**MinMaxScaler 는 값이 0.0 ~ 1.0 으로 바뀜
**StandardScaler는 평균을 0으로 만들고 표준편차는 1로 만듦
*Numpy에서 데이터 출력 관련 값은 np.set_printoptions 으로 설정 가능하다.
**np.set_printoptions(precision=4, suppress=True)
*DecisionTree 실습
**어떤 특성을 중요하게 판단했는지 확인하기 : tree.feature_importances_
**상기 값은 설명가능한 인공지능(eXplainable Artificial Intelligence, XAI)와 밀접한 관련이 있다.
=== 4일차 ===
시험에 대해서는 내일 정리해주겠다면서 수업을 시작했다.


* '''사이킷런(Scikit-Learn)''' https://scikit-learn.org/ - 사용법이 쉽고 많은 머신러닝 알고리즘이 효율적으로 구현되어 있으므로 머신러닝을 처음 배울 때 사용하기 아주 좋음. 2007년 데이빗 쿠르나포(David Cournapeau)가 개발했고 현재 Inria(French Institute for Research in Computer Science and Automation)의 연구팀이 이끌고 있음
==== 오전수업 ====
* '''텐서플로(TensorFlow)''' https://www.tensorflow.org/ - 분산 수치 계산을 위한 매우 복잡한 라이브러리. 수백 대의 다중 그래픽 처리 장치(GPU) 서버에 계산을 분산하여 대규모 신경망을 효과적으로 훈련하고 실행시킴. 구글에서 만들었고 구글의 대규모 머신러닝 애플리케이션에서 사용하고 있음. 2015년 11월에 오픈 소스로 공개되었고 2019년 9월 2.0 버전이 릴리스 됨.
* '''케라스(Keras)''' https://keras.io/ - 고수준 딥러닝 API. 매우 쉽게 신경망을 훈련하고 실행 가능. 케라스는 텐서플로, 시애노(Theano), 마이크로소프트 코그니티브 툴킷(Microsoft Cognitive Toolkit) 위에서 작동. 텐서플로는 자체적인 케라스 API 구현을 tf.keras란 이름으로 포함. tf.keras는 텐서플로의 고급기능을 지원함. (예: 효율적인 데이터 적재 기능 등)


=== 머신러닝 정의 ===
* 항상 그랬던 것처럼 복습으로 수업을 시작했다.
머신러닝은 데이터에서부터 학습하도록 컴퓨터를 프로그래밍하는 과학(또는 예술)이다. 조금 더 일반적인 정의는 다음과 같다.
* ML 코딩 5단계
*# 훈련 데이터와 테스트 데이터로 나눈다 : train_test_split
*# ML 알고리즘 선택
*# 훈련 : fit
*# 평가 : score
*# 새 데이터로 예측 : predict
* 경고 메시지 나오지 않게 하기  <br /><syntaxhighlight lang="python3" line="1">
import warnings
warnings.filterwarnings('ignore')
</syntaxhighlight>
* 적절한 파라미터를 찾는 과정을 '''하이퍼파라미터 찾기'''라고 함
* '''K-Neighbors''' 나 '''선형회귀(Linear Regression)'''은 실전에서는 쓰이지 않지만 기초이기 때문에 배울 필요가 있음 : KNeighborsClassifier
** K-Neighbors에서 n_neighbors가 너무 작으면 underfitting,  n_neighbors가 너무 크면 overfitting이 될 수 있어서 적절한 값을 찾아야 함 : LinearRegression
** Linear Regression에서 Cost가 너무 작으면 underfitting, Cost가 너무 크면 overfitting이 될 수 있어서 적절한 값을 찾아야 함 :
* '''Support Vector Machine(SVM)'''은 가장 두꺼워지는 직선을 찾음 : SVC
* 값의 범주가 동일하지 않은 데이터를 함께 분석해야 하는 경우에는 '''정규화(normalization)'''를 해야 하며 MinMaxScaler, StandardScaler로 가능
* 오늘은 DecisionTree와 Graph 관련 수업을 함
* numpy.arange([start, ] stop, [step, ] dtype=None) : numpy 모듈의 arange 함수는 반열린구간 [start, stop) 에서 step 의 크기만큼 일정하게 떨어져 있는 숫자들을 array 형태로 반환해 주는 함수
** (예) np.arange(30) 이라고 하면 [0, 1, 2, ... 28, 29] 를 값으로 갖는 array 를 return 함
* DecisionTree에서는 overfitting 혹은 underfitting이 일어나면 depth 조절을 함
*RandomForest는 Tree의 조합인데 max_depth를 통해 overfitting과 underfitting을 조절함
*머신러닝 이론 학습을 위해 제공한 PDF가 쉽게 잘 만들어져 있어서 유익함!!! ★★★★★
**sigmoid 는 머신러닝에서는 잘 되었으나 딥러닝에서는 잘 안되어서 ReLU(Rectified Linear Units) 라는 activation 함수를 사용
***사그라드는 sigmoid 대신 죽지 않는 ReLU를 쓰자 => '''vanishing gradient 문제 해결'''
**GradientDescent를 통해 가중치 parameters를 최적화 하는 게 너무 느려서 '''StochasticGradientDescent'''가 나옴 => '''Slowness''' '''문제 해결'''
***GradientDescnet는 loss function의 현 가중치에서 기울기(gradient)를 구해서 loss를 줄이는 방향으로 업데이트를 하는 함수
****'''현재는 Adam이 90% 정도 점유율로 사용되고 있음'''
**융통성이 없는 overfitting 은 어떻게 해결하지?
***'''DropOut'''을 씀. 즉, 학습을 시킬 때 일부러 정보를 누락 시키거나 중간 노드를 끈다. 이를 통해 일부 특성에만 집착하지 않고 중요한 요소가 무엇인지 터득한다.
**요약하면...
***학습이 잘 안되었던 것은 sigmoid 를 쓰면서 '''vanishing gradient''' 가 나왔기 때문이어서 '''ReLU''' 로 변경했음
***속도가 느린 건 '''GD'''를 '''Adams'''로 변경했음
***융통성이 없는 건 '''DropOut'''으로 해결했음
**문제의 유형에 따라 적절한 아키텍처를 적용하는 게 핵심
***스냅샷성 데이터(이미지, 영상 등) : '''Convolutional Neural Network(CNN)'''
***시퀀스성 데이터(음성, 언어, 주식 가격, 맥락 등) : '''Recurrent Neural Network(RNN)''' 또는 '''Long Short Term Memory(LSTM)'''
****'''RNN'''은 기본적으로 '''sigmoid''' 활성화 함수가 들어있어서 문제가 있다. 이를 개선한 것이 '''LSTM'''이다.
**'''Convolution'''은 특정 패턴이 있는지 없는지 박스로 훑으며 마킹하는 알고리즘
***위아래선 필터, 좌우선필터, 대각선필터, 이런질감필터, 요런질감필터, 동그라미필터 등등 여러 가지 "조각" 필터로 해당 패턴이 그림 위에 있는지 확인
***이 때 테두리가 잘리면 계산 값이 0으로 수렴하는 경우가 발생할 수 있어서 이미지 바깥쪽의 데이터를 0으로 채우는 '''zero padding'''을 함
**사이즈를 줄여서 계산량을 줄이는 '''MaxPooling''' 또한 자주 활용함
***'''AveragePooling'''도 있는데 얘는 최대값을 선택하는 '''MaxPooling''' 대비 평균 값을 채워서 사이즈를 줄임. 단, AveragePooling을 쓰면 이미지가 뭉개지는 경향이 있어서 가장 큰 값(선명한 값)을 선택하는 '''MaxPooling'''이 주로 쓰임
==== 오후수업 ====


* [머신러닝은] 명시적인 프로그래밍 없이 컴퓨터가 학습하는 능력을 갖추게 하는 연구 분야다. (아서 새뮤얼 Arthur Samuel, 1959)
* Convolution은 패턴들을 쌓아가며 점차 복잡한 패턴을 인식하도록 하고
* 어떤 작업 T에 대한 컴퓨터 프로그램의 성능을 P로 측정했을 때 경험 E로 인해 성능이 향상됐다면, 이 컴퓨터 프로그램은 작업 T와 성능 측정 P에 대해 경험 E로 학습한 것이다. (톰 미첼 Tom Michell, 1997)
* MaxPooling은 사이즈를 줄여가면서 패턴의 추상도를 높인다.
* 그러면서 중간에 DropOut을 하면서 일부에 집착하지 않고 중요한 요소를 파악하는 융통성을 키운다.
* PPT 자료가 진짜 좋다
* '''가상환경 만들기'''
** 시작 >  Anaconda3 > Anaconda Prompt(Anaconda3) > conda create -n tf python=3.7 anaconda
***위에서 만든 가상환경은 C:\Users\user\anaconda3\envs 에 위치함
*'''가상환경 사용 및 종료하기'''
**GUI
***아래처럼 '''Anaconda Prompt (tf)''' 를 선택해서 실행  <br />[[파일:아나콘다 가상환경 사용하기.png|프레임없음|686x686픽셀]]


=== 머신러닝 용도 ===
**CUI
***(사용) conda activate tf
***(종료) conda deactivate
* '''Conda 업데이트 하기'''
**conda update -n base -c defaults conda
*'''TensorFlow 설치하기'''
**conda install -c anaconda tensorflow==2.6
**GPU가 있는 경우 conda install -c anaconda tensorflow-gpu==2.6  <br />[[파일:아나콘다 TensorFlow 설치.png|프레임없음|1000x1000픽셀]]
*TnsorFlow 설치여부 확인하기
**아래와 같이 라이브러리를 import 한 후, 버전을 출력한다.  <br />[[파일:TensorFlow2 설치여부 확인하기.png|프레임없음|900x900픽셀]]


* 기존 솔루션으로는 많은 수동 조정과 규칙이 필요한 문제: 하나의 머신러닝 모델이 코드를 간단하게 만들고 전통적인 방법보다 더 잘 수행하도록 할 수 있음
*TensofrFlow Jupyter Notebook 실행하기
* 전통적인 방법으로는 해결 방법이 없는 복잡한 문제: 가장 뛰어난 머신러닝 기법으로 해결 방법을 찾을 수 있음
**아래처럼 Jupyter Notebook (tf) 를 실행한다.  <br />[[파일:TensorFlow Jupyter Notebook 실행.png|프레임없음|683x683픽셀]]
* 유동적인 환경: 머신러닝 시스템은 새로운 데이터에 적응할 수 있음
*TensorFlow 이름?
* 복잡한 문제와 대량의 데이터에서 통찰 얻기
**tensor = 다차원 배열
**flow = 흐름
*딥러닝의 내부 흐름인 "다차원 배열이 흘러간다" 는 것을 이름에 녹여냈다.
*MNIST 에서 train set 과 test set 을 255 로 나눈 이유는 정규화(nomalization)를 하기 위함이다.
*텐서플로우 MNIST 예제 보기  <br />[[파일:TF MNIST 예제.png|프레임없음|800x800픽셀]]
**훈련 데이터와 테스트 데이터 준비한다.
**'''모델을 설계한다.''' ← 딥러닝은 모델 설계 과정이 있음. 이게 앞서 학습했던 전통적인 머신러닝과의 차이점
**훈련한다.
**평가한다.
**새로운 데이터를 넣어서 모델을 업데이트 한다.
*TensorFlow를 Jupyter Notebook 에서 MNIST 데이터세트로 실습했다.
=== 5일차 ===


== 강의 ==
==== 초성퀴즈: ㅁㅈㅁ ㅅㅇ ====
총 5일 동안 교육한 내용을 아래에 간략히 정리했다.
* 마지막 수업


=== 1일차 ===
==== 어제 수업 복습 ====
* 가상환경 만들기 (왜? 프로젝트마다 Dependency 가 다름)
** (가상환경 생성) conda create -n 가상환경이름 python=3.7 anaconda
** (Anaconda 업데이트) conda update -n base -c defaults conda
** (TensorFlow 설치) conda install -c anaconda tensorflow==2.6
*** 리눅스나 맥은 2.7 이나 2.8 로 됨 (최근에는 항상 리눅스 버전이 먼저 나옴)
* Jupyter Notebook 사용 시 주의사항
** KMP_DUPLICATE_LIB_OK 설정 필요  <br /><syntaxhighlight lang="python3" line="1">
import os
os.environ['KMPDUPLICATE_LIB_OK']='True'
</syntaxhighlight>
* Warning 끄기  <br /><syntaxhighlight lang="python3" line="1">
import warnings
warnings.filterwarnings('ignore')
</syntaxhighlight>
* 관련 라이브러리 가져오기 <br /><syntaxhighlight lang="python3" line="1">
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
</syntaxhighlight>
*DL 코딩 5단계
** 훈련/테스트 데이터 준비 ← Pipeline을 만들어서 자동화 할 필요있음
** 모델 설계
** 훈련
***모델 학습 방식을 설정하기
****model.compile(optimizer, loss, metrics)
** 평가
** 예측
* TensorFlow 2.0 에는 Keras 가 포함되어 있음
** 1.0 때는 TF 코드와 Keras 코드가 별도로 있었으나 Keras가 더 간단해서 Google이 Keras 개발자 영입 후, 2.0 부터 포함시킴
*이러한 코드를 실습했다.
**뇌,건물 만들고 → model = Sequential()
**데이터를 평평하게 1차원으로 만들고 → model.add( Flatten(input_shape=(28, 28))
**다음 층에는 128개의 출력 뉴런을 ReLU 활성화 함수와 함께 쌓고 → model.add( Dense(128, activation='relu') )
**그 다음 층에는 20%의 출력 뉴런을 끈다 → model.add( Dropout(0.2) )
**마지막 층에는 출력방법을 설정한다 → model.add( Dense(10, activation='softmax') )
***마지막 activation 함수는 아래와 같이 설정
****softmax - 다중분류
****sigmoid - 이진분류
****X - 회귀
오전수업
*사이트 소개 : https://playground.tensorflow.org/
**값을 조절해가며 찾아봤다!    <br /><br />[[파일:Playground for TensorFlow.png|프레임없음|1300x1300픽셀]]    <br />
**이렇게 레이어를 많이 추가하면 된다.  <br />[[파일:Playground TensorFlow 이렇게.png|프레임없음|1300x1300픽셀]]<br />
*'''차원의 저주'''
**'''차원이 증가하면서 학습데이터 수가 차원 수보다 적어져서 성능이 저하되는 현상'''을 일컫는다. 차원이 증가할수록 변수가 증가하고, 개별 차원 내에서 학습할 데이터 수가 적어진다
**차원 = 컬럼의 개수
**차원이 많아 질수록 경우의 수가 많아져야 하므로 데이터가 기하급수적으로 많아져야 함
**그래야 모든 경우에 대해 학습이 가능함
**'''차원이 많아질수록 데이터가 많아지는 현상을 "차원의 저주" 라고 함'''
*머신러닝은 데이터가 적어도 가능하지만 딥러닝은 데이터가 적으면 어렵다.
*딥러닝을 하다보면 훈련이 잘 되었을 때, 멈출 필요가 있는데 이를 '''조기 종료(Early Stopping)'''하는 방법이 있음 (기준 : 검증 비용)
**'''patience''' parameter 가 중요. 훈련 횟수에 따라서 더 이상 떨어지지 않고 유지가 되거나 올라가는 경우에 몇 번이나 참을 것인지 설정 (=성능이 증가하지 않는 epoch을 몇 번이나 허용할 것인가를 정의한다 - [https://3months.tistory.com/424 링크])
*타이타닉에 탑승한 디카프리오와 윈슬렛의 생존확률을 딥러닝으로 작성했다.  <br />[[파일:TensorFlow 실습 타이타닉 탑승자 생존률 추측.png|프레임없음|1300x1300픽셀]] <br />
*딥러닝 대비 머신러닝은 feature_importances 등 좀 더 설명 가능한 요소를 확인할 수 있다.


* 인공지능 관련 지루한 설명을 들었다.
==== 오후수업 ====
*인공지능 공식을 간략히 소개하면  y=Wx 의 행렬곱이다.  
*강사님이 커피를 준다고 했는데 안 사왔다!!! 라이어!!!
*강사님이 딥러닝은 인간의 뇌를 모방했다면서 "유재석" 얘기를 했는데 앞에 앉아 있는 어떤 학생이 유재석이 나오는 <유퀴즈 온 더 블록>을 보고 있어서 어이 없었다.  
*오후에는 CNN 실습을 한다.
* 파일 공유를 위한 주소(https://tinyurl.com/ai220808<nowiki/>)를 공유 받았다.
*VGG를 구현한다.  <br />[[파일:VGG 구조.png|프레임없음|1100x1100픽셀]]
제로패딩(Zero-Padding)적절히 해주어야 양쪽 끝에 있는 픽셀이 줄어들지 않고 Convolution 계산이 됨
*model.add ( Conv2D(64, (3,3), activation='relu', padding='same', input_shape=(28, 28)) )
**same : 필터의 사이즈가 k이면 사방으로 k/2 만큼의 패딩을 준다. ([https://buomsoo-kim.github.io/keras/2018/05/02/Easy-deep-learning-with-Keras-8.md/ 링크])
CNN으로 MNIST 구현을 함


=== 2일차 ===
RNN 소개
업데이트 예정
*RNN은 activation 함수로 tanh 나 sigmoid를 쓰는 경우가 많음
비트코인 가격 예측 프로그램 작성
*어떻게 예측할까? 주어진 데이터를 통해 예측하는데 아래와 같이 하고자 함
**1~5일차 데이터로 6일 때 비트코인 가격 예측
**2~6일차 데이터로 7일 때 비트코인 가격 예측
**3~7일차 데이터로 8일 때 비트코인 가격 예측
**...


=== 3일차 ===
* 마지막에는 복습 및 시험관련 설명
업데이트 예정


=== 4일차 ===
==== 복습 및 시험관련 설명 ====
업데이트 예정
[[파일:머신러닝 수업정리-01.png|프레임없음|1000x1000픽셀]]


=== 5일차 ===
[[파일:머신러닝 수업-02.png|프레임없음|1100x1100픽셀]]
업데이트 예정


== 참고자료 ==
== 참고자료 ==
97번째 줄: 336번째 줄:
* 유튜브 강의 [https://bit.ly/homl2-youtube https://bit.ly/homl2-youtube/]
* 유튜브 강의 [https://bit.ly/homl2-youtube https://bit.ly/homl2-youtube/]
*GitHub Repository https://github.com/rickiepark/handson-ml2
*GitHub Repository https://github.com/rickiepark/handson-ml2
*FMA: A Dataset For Music Analysis https://github.com/mdeff/fma
*딥 러닝을 이용한 자연어 처리 입문 https://wikidocs.net/book/2155
== 기타 학습자료 ==
* 데이터 사이언스 스쿨 https://datascienceschool.net/intro.html
* 데이터 분석, 머신러닝 정리 노트 https://injo.tistory.com/6?category=1068433
*(책) 혼자 공부하는 머신러닝+딥러닝 https://www.kyobobook.co.kr/product/detailViewKor.laf?barcode=9791162243664
*(책) 기계 학습 https://www.kyobobook.co.kr/product/detailViewKor.laf?barcode=9791156641582


[[분류:교육]]
[[분류:교육]]

2022년 8월 12일 (금) 17:06 기준 최신판

1 개요[편집 | 원본 편집]

올해는 머신러닝 쪽 관련 지식을 함양하고자 한다. 이러한 노력의 일환으로 회사에서 보내주는 외부연수로 아래 강의를 수강했다.


<머신러닝 교육 요약>
강좌명 교육기간 교육장소 기타
Python 라이브러리를 활용한 인공지능 2022.8.8 ~ 2022.8.12 한국생산성본부 8층 803호 - 강사명 : 박성백 (sungback@naver.com / 010-8711-7982) ← 평생 A/S 가능

- 수강자 : 10명 (오프라인 7명, 온라인 3명)

- 교 재 : <Hands-On Machine Learning with Scikit-Learn Keras & TensorFlow>

2 교육과정[편집 | 원본 편집]

이번에 내가 수강하는 과정은 아래와 같이 총 5일, 35시간 동안 머신러닝 중 딥러닝에 대해 학습하는 과정이다.


20220808-강의커리큘럼-01.png20220808-강의커리큘럼-02.png

20220808-강의커리큘럼-03.png

3[편집 | 원본 편집]

도서를 읽으며 학습한 내용은 별도 페이지인 핸즈온 머신러닝(2판)(책)을 참고하자.

4 강의[편집 | 원본 편집]

총 5일 동안 교육한 내용을 아래에 간략히 정리했다.

4.1 1일차[편집 | 원본 편집]

  • 인공지능 관련 지루한 설명을 들었다.
  • 파일 공유를 위한 주소(https://tinyurl.com/ai220808)를 공유 받았다.
  • 인공지능 공식을 간략히 소개하면 y=Wx 의 행렬곱이다.
    • W 는 가중치(weight)를 의미한다.
  • 강사님이 딥러닝은 인간의 뇌를 모방했다면서 "유재석" 얘기를 했는데 앞에 앉아 있는 어떤 학생이 유재석이 나오는 <유퀴즈 온 더 블록>을 보고 있어서 어이 없었다.
  • 이 수업에서는 파이썬 언어, 수집(BeautiflSoup), 분석(Pandas), 시각화(Matplolib, Seaborn), ML 까지 실습을 하며 이를 위해 아나콘다(Anaconda)를 설치하며, 실습은 함께 설치하는 주피터(Jupyter)를 활용.
  • 환경설정은 아래와 같이 함
    1. Anaconda 다운로드 https://www.anaconda.com/products/distribution
    2. 설치
    3. 주피터 노트북 실행

      20220808-주피터 실행.png
  • 주피터 노트북에 CSS를 적용하려면 윈도우 10 기준으로 %HOMEPATH% 에 .jupyter 폴더를 만든 후, 이어서 방금 만든 폴더 안에 custom 폴더를 만든다. 이어서 custom.css 라는 파일로 아래 CSS 파일을 custom 폴더에 저장한다. 그런 후 주피터 노트북을 재실행하면 CSS가 적용된다.
.container { width:100% !important; }
.CodeMirror {font-family: D2Coding; font-size: 22pt; line-height: 140%;}
div.output {
    font-family: D2Coding;
    font-size: 12pt;
}
div.prompt {
    padding-left: 0;
    min-width: 2ex;
}
  • D2Coding 폰트를 설치했다. (https://github.com/naver/d2codingfont)
  • 시험 공지를 해줬다. 4지선다 15문제, 단답형 5문제로 총 20문제다.
    • (시험) 머신러닝 학습 특성에 따른 분류 : Supervised, Unsupervised, Reinforcement Learning
  • 주피터에서 파이썬 자료형, 제어문 등 기본 문법을 실습했다.

4.2 2일차[편집 | 원본 편집]

  • 오늘은 버스가 많이 막혀서 9:28 에 도착했다. 도착하기 전에 전화를 주셔서 "도착했어요!" 라고 얘기했다. KCP 수업 담당자님께서 강사님이 교통 체증으로 늦어서 양해의 표현으로 커피를 샀으니 마시라고 하셨다. 하하하. 그런데 강사님이 내가 도착한 후 1분 뒤에 오셨다. 강사님이 매번 늦어서 커피가 매번 제공되면 좋겠다.
  • 어제 학습한 내용을 복습했다.
  • 주피터 노트북에서 모든 명령어를 다시 실행하려면 Kernel 메뉴에 있는 Restart & Run All 을 실행한다.
    주피터 노트북에서 명령어 모두 다시 실행하기.png
  • 저 강사님 수업을 아마도 3년 전에 다른 수업에서 들었던 것 같다. 과거에 했던 로또 당첨번호 웹 스크래핑 실습을 또 한다. 사골국물도 아니고 이게 뭔가요?!?!?! ㅠ.ㅠ
  • 아무튼 나는 현재까지 당첨된 로또 번호 및 보너스 번호를 출력하는 프로그램으로 개량했다. (3년 전에도 똑같은 걸 했었다 ㅎ.ㅎ)
    로또 1등 및 보너스 번호.png
  • 이어서 타이타닉 호 승객 생존 예측 미니 프로젝트를 하는데 이것도 아마 3년 전에 했던 것 같다.
  • 파이썬 라이브러리 Numpy는 수치연산을 매우 빠르게 하는데 이것이 가능한 이유는 내부 코드를 C/C++로 구현했기 때문이다.
  • 코로나 이전에 기상청 직원이 강의를 수강했는데 거기는 여전히 포트란(Fortran)을 사용하고 있다고 한다. 다만 이를 Python에서 사용할 수 있게 바인딩해서 사용을 하고 있다고 한다.
  • 점심시간 전에 <타이타닉 호 승객 생존 예측 미니 프로젝트>를 위한 사전 작업을 완료했다. (데이터 제공, 가설 수립 등)
  • 커피 사주셨다. 나 퀴즈 틀렸는데? ㅋㅋㅋㅋㅋㅋㅋㅋ 위로커피인듯...
  • Dataframe의 info() 함수 결과값에서서 중요하게 봐야 하는 것 중 하나는 Non-Null Column 개수로 결측치 정도를 확인해야 한다. 이 값에 다라 해당 데이터를 활용할 수 있을지 없을지가 결정되기 때문이다.
  • 데이터 타입은 아래와 같이 나뉨
    • 수치형
      • 이산형 : 정수
      • 연속형 : 실수
    • 범주형
      • 명목형 : 혈액형
      • 순서형 : 학점, 성적
  • Pandas의 Dataframe을 통해 데이터를 조작하는 것은 정말 사기다. 안 쓸 수 없다.
  • 원-핫 인코딩(One-Hot Encoding)은 단어 집합의 크기를 벡터의 차원으로 하고, 표현하고 싶은 단어의 인덱스에 1의 값을 부여하고, 다른 인덱스에는 0을 부여하는 단어의 벡터 표현 방식입니다. 이렇게 표현된 벡터를 원-핫 벡터(One-Hot vector)라고 함 (링크)
  • 결측치를 채우는 방법을 배움

4.3 3일차[편집 | 원본 편집]

4.3.1 2일차 복습[편집 | 원본 편집]

  • iPhyon 노트북은 서로 독립적이기 때문에 매번 import 문 등을 동일하게 추가해야 한다.
  • Pandas의 static member function을 통해 엑셀파일을 읽을 수 있다. (C++, Java와 같은 언어에서는 인스턴스가 아닌 객체명으로 멤버를 호출했으니 정적 멤버함수가 맞는데 파이썬에서도 동일한가? 알아봐야할듯)
    • df = pd.read_excel("파일명")
  • 타이타닉 데이터 분석에서 파일을 연 후에 가장 먼저 한 행동은 특성 탐색
  • 머신러닝을 활용하려면 입력과 출력이 반드시 숫자가 되어야 함 (예: 알파벳을 이해하려면 대소문자 알파벳 52자를 숫자로 변환한 후 학습을 시켜야 함)
  • Dataframe 에서 교차표는 crosstab 함수로 그리며 합계를 추가하려면 margins=True 를 작성
  • 데이터를 범주형으로 만들려면 Dataframe의 cut 함수 사용
    • df['age_cat'] = pd.cut(df['age'], bins=[0,10,20,50,80], include_lowest=True, labels=['baby', 'teenage', 'adult', 'old'])
  • Pandas에서 데이터를 반환하는 게 아니라 호출한 객체 값이 저장하게 하려면 inplace=True 를 추가하면 됨 (항상 그렇다는 건 아님)
  • 현실에 맞게 학습하려면 이상치를 포함하는 게 맞음
  • df[df['fare'].isnull()] : 운임이 null(결측치)인 사람 찾기
  • df['survived'].value_counts() : 생존자 수 카운트

4.3.2 머신러닝 코딩 5단계[편집 | 원본 편집]

  1. 훈련 데이터와 테스트 데이터를 나눈다. : train_test_split
  2. ML 알고리즘 선택
    • 머신러닝 알고리즘은 수학
  3. 훈련 : fit
  4. 평가 : score
  5. 새 데이터로 예측 : predict

4.3.3 수업내용 필기[편집 | 원본 편집]

  • Tree를 여러 개 가져다가 다수결로 결정하는 알고리즘을 앙상블(Ensemble) 이라고 합니다.
  • train_test_split 함수를 통해 학습 데이터와 테스트 데이터를 나눌 수 있는데, 이 때 random_state 값을 설정해야 하이퍼파라메터 조정을 하는 데 애로사항이 없다.
  • 머신러닝이 최종적으로 하는 일은 두 가지로 나눌 수 있음 → 분류를 잘하거나 값을 맞추거나
    • DecisionTreeClassifier : 분류
    • DecisionTreeRegression : 값
  • 대부분의 머신러닝 알고리즘 함수에는 -Classifier 또는 -Regression 이 붙음

4.4 오후수업[편집 | 원본 편집]

  • ML 코딩 5단계
    1. 훈련 데이터와 테스트 데이터로 나눈다 : train_test_split
    2. ML 알고리즘 선탱
    3. 훈련 : fit
    4. 평가 : score
    5. 새 데이터로 예측 : predict
  • ML 문제 분류
    • 분류
      • 이진
        • 0
        • 1
      • 다중
        • A
        • B
        • C
        • ...
    • 회귀
      • 값 예측
  • 주피터 노트북에서 외부 명령어를 실행하려면 "! 명령어"를 입력한다.
  • 최근에는 앙상블 모델을 이용하고 있다.
  • 앙상블 모델은 트리로 이루어진다. (예: 랜덤 포레스트)
  • Kaggle 사이트(https://www.kaggle.com/)에서 1% 이내에 들면 원하는 곳 취업 가능
  • 선형회귀 실습을 했다.
  • SVM 실습을 했다.
  • sigmoid 활성화 함수에 대해 언급했다.
  • 정규화를 위해 가장 많이 쓰는 애들은 StandardScaler, MinMaxScaler 이다.
    • MinMaxScaler 는 값이 0.0 ~ 1.0 으로 바뀜
    • StandardScaler는 평균을 0으로 만들고 표준편차는 1로 만듦
  • Numpy에서 데이터 출력 관련 값은 np.set_printoptions 으로 설정 가능하다.
    • np.set_printoptions(precision=4, suppress=True)
  • DecisionTree 실습
    • 어떤 특성을 중요하게 판단했는지 확인하기 : tree.feature_importances_
    • 상기 값은 설명가능한 인공지능(eXplainable Artificial Intelligence, XAI)와 밀접한 관련이 있다.

4.5 4일차[편집 | 원본 편집]

시험에 대해서는 내일 정리해주겠다면서 수업을 시작했다.

4.5.1 오전수업[편집 | 원본 편집]

  • 항상 그랬던 것처럼 복습으로 수업을 시작했다.
  • ML 코딩 5단계
    1. 훈련 데이터와 테스트 데이터로 나눈다 : train_test_split
    2. ML 알고리즘 선택
    3. 훈련 : fit
    4. 평가 : score
    5. 새 데이터로 예측 : predict
  • 경고 메시지 나오지 않게 하기
    import warnings
    warnings.filterwarnings('ignore')
    
  • 적절한 파라미터를 찾는 과정을 하이퍼파라미터 찾기라고 함
  • K-Neighbors선형회귀(Linear Regression)은 실전에서는 쓰이지 않지만 기초이기 때문에 배울 필요가 있음 : KNeighborsClassifier
    • K-Neighbors에서 n_neighbors가 너무 작으면 underfitting, n_neighbors가 너무 크면 overfitting이 될 수 있어서 적절한 값을 찾아야 함 : LinearRegression
    • Linear Regression에서 Cost가 너무 작으면 underfitting, Cost가 너무 크면 overfitting이 될 수 있어서 적절한 값을 찾아야 함 :
  • Support Vector Machine(SVM)은 가장 두꺼워지는 직선을 찾음 : SVC
  • 값의 범주가 동일하지 않은 데이터를 함께 분석해야 하는 경우에는 정규화(normalization)를 해야 하며 MinMaxScaler, StandardScaler로 가능
  • 오늘은 DecisionTree와 Graph 관련 수업을 함
  • numpy.arange([start, ] stop, [step, ] dtype=None) : numpy 모듈의 arange 함수는 반열린구간 [start, stop) 에서 step 의 크기만큼 일정하게 떨어져 있는 숫자들을 array 형태로 반환해 주는 함수
    • (예) np.arange(30) 이라고 하면 [0, 1, 2, ... 28, 29] 를 값으로 갖는 array 를 return 함
  • DecisionTree에서는 overfitting 혹은 underfitting이 일어나면 depth 조절을 함
  • RandomForest는 Tree의 조합인데 max_depth를 통해 overfitting과 underfitting을 조절함
  • 머신러닝 이론 학습을 위해 제공한 PDF가 쉽게 잘 만들어져 있어서 유익함!!! ★★★★★
    • sigmoid 는 머신러닝에서는 잘 되었으나 딥러닝에서는 잘 안되어서 ReLU(Rectified Linear Units) 라는 activation 함수를 사용
      • 사그라드는 sigmoid 대신 죽지 않는 ReLU를 쓰자 => vanishing gradient 문제 해결
    • GradientDescent를 통해 가중치 parameters를 최적화 하는 게 너무 느려서 StochasticGradientDescent가 나옴 => Slowness 문제 해결
      • GradientDescnet는 loss function의 현 가중치에서 기울기(gradient)를 구해서 loss를 줄이는 방향으로 업데이트를 하는 함수
        • 현재는 Adam이 90% 정도 점유율로 사용되고 있음
    • 융통성이 없는 overfitting 은 어떻게 해결하지?
      • DropOut을 씀. 즉, 학습을 시킬 때 일부러 정보를 누락 시키거나 중간 노드를 끈다. 이를 통해 일부 특성에만 집착하지 않고 중요한 요소가 무엇인지 터득한다.
    • 요약하면...
      • 학습이 잘 안되었던 것은 sigmoid 를 쓰면서 vanishing gradient 가 나왔기 때문이어서 ReLU 로 변경했음
      • 속도가 느린 건 GDAdams로 변경했음
      • 융통성이 없는 건 DropOut으로 해결했음
    • 문제의 유형에 따라 적절한 아키텍처를 적용하는 게 핵심
      • 스냅샷성 데이터(이미지, 영상 등) : Convolutional Neural Network(CNN)
      • 시퀀스성 데이터(음성, 언어, 주식 가격, 맥락 등) : Recurrent Neural Network(RNN) 또는 Long Short Term Memory(LSTM)
        • RNN은 기본적으로 sigmoid 활성화 함수가 들어있어서 문제가 있다. 이를 개선한 것이 LSTM이다.
    • Convolution은 특정 패턴이 있는지 없는지 박스로 훑으며 마킹하는 알고리즘
      • 위아래선 필터, 좌우선필터, 대각선필터, 이런질감필터, 요런질감필터, 동그라미필터 등등 여러 가지 "조각" 필터로 해당 패턴이 그림 위에 있는지 확인
      • 이 때 테두리가 잘리면 계산 값이 0으로 수렴하는 경우가 발생할 수 있어서 이미지 바깥쪽의 데이터를 0으로 채우는 zero padding을 함
    • 사이즈를 줄여서 계산량을 줄이는 MaxPooling 또한 자주 활용함
      • AveragePooling도 있는데 얘는 최대값을 선택하는 MaxPooling 대비 평균 값을 채워서 사이즈를 줄임. 단, AveragePooling을 쓰면 이미지가 뭉개지는 경향이 있어서 가장 큰 값(선명한 값)을 선택하는 MaxPooling이 주로 쓰임

4.5.2 오후수업[편집 | 원본 편집]

  • Convolution은 패턴들을 쌓아가며 점차 복잡한 패턴을 인식하도록 하고
  • MaxPooling은 사이즈를 줄여가면서 패턴의 추상도를 높인다.
  • 그러면서 중간에 DropOut을 하면서 일부에 집착하지 않고 중요한 요소를 파악하는 융통성을 키운다.
  • PPT 자료가 진짜 좋다
  • 가상환경 만들기
    • 시작 > Anaconda3 > Anaconda Prompt(Anaconda3) > conda create -n tf python=3.7 anaconda
      • 위에서 만든 가상환경은 C:\Users\user\anaconda3\envs 에 위치함
  • 가상환경 사용 및 종료하기
    • GUI
      • 아래처럼 Anaconda Prompt (tf) 를 선택해서 실행
        아나콘다 가상환경 사용하기.png
    • CUI
      • (사용) conda activate tf
      • (종료) conda deactivate
  • Conda 업데이트 하기
    • conda update -n base -c defaults conda
  • TensorFlow 설치하기
    • conda install -c anaconda tensorflow==2.6
    • GPU가 있는 경우 conda install -c anaconda tensorflow-gpu==2.6
      아나콘다 TensorFlow 설치.png
  • TnsorFlow 설치여부 확인하기
    • 아래와 같이 라이브러리를 import 한 후, 버전을 출력한다.
      TensorFlow2 설치여부 확인하기.png
  • TensofrFlow Jupyter Notebook 실행하기
    • 아래처럼 Jupyter Notebook (tf) 를 실행한다.
      TensorFlow Jupyter Notebook 실행.png
  • TensorFlow 이름?
    • tensor = 다차원 배열
    • flow = 흐름
  • 딥러닝의 내부 흐름인 "다차원 배열이 흘러간다" 는 것을 이름에 녹여냈다.
  • MNIST 에서 train set 과 test set 을 255 로 나눈 이유는 정규화(nomalization)를 하기 위함이다.
  • 텐서플로우 MNIST 예제 보기
    TF MNIST 예제.png
    • 훈련 데이터와 테스트 데이터 준비한다.
    • 모델을 설계한다. ← 딥러닝은 모델 설계 과정이 있음. 이게 앞서 학습했던 전통적인 머신러닝과의 차이점
    • 훈련한다.
    • 평가한다.
    • 새로운 데이터를 넣어서 모델을 업데이트 한다.
  • TensorFlow를 Jupyter Notebook 에서 MNIST 데이터세트로 실습했다.

4.6 5일차[편집 | 원본 편집]

4.6.1 초성퀴즈: ㅁㅈㅁ ㅅㅇ[편집 | 원본 편집]

  • 마지막 수업

4.6.2 어제 수업 복습[편집 | 원본 편집]

  • 가상환경 만들기 (왜? 프로젝트마다 Dependency 가 다름)
    • (가상환경 생성) conda create -n 가상환경이름 python=3.7 anaconda
    • (Anaconda 업데이트) conda update -n base -c defaults conda
    • (TensorFlow 설치) conda install -c anaconda tensorflow==2.6
      • 리눅스나 맥은 2.7 이나 2.8 로 됨 (최근에는 항상 리눅스 버전이 먼저 나옴)
  • Jupyter Notebook 사용 시 주의사항
    • KMP_DUPLICATE_LIB_OK 설정 필요
      import os
      os.environ['KMPDUPLICATE_LIB_OK']='True'
      
  • Warning 끄기
    import warnings
    warnings.filterwarnings('ignore')
    
  • 관련 라이브러리 가져오기
    import numpy as np
    import pandas as pd
    import matplotlib.pyplot as plt
    import seaborn as sns
    
  • DL 코딩 5단계
    • 훈련/테스트 데이터 준비 ← Pipeline을 만들어서 자동화 할 필요있음
    • 모델 설계
    • 훈련
      • 모델 학습 방식을 설정하기
        • model.compile(optimizer, loss, metrics)
    • 평가
    • 예측
  • TensorFlow 2.0 에는 Keras 가 포함되어 있음
    • 1.0 때는 TF 코드와 Keras 코드가 별도로 있었으나 Keras가 더 간단해서 Google이 Keras 개발자 영입 후, 2.0 부터 포함시킴
  • 이러한 코드를 실습했다.
    • 뇌,건물 만들고 → model = Sequential()
    • 데이터를 평평하게 1차원으로 만들고 → model.add( Flatten(input_shape=(28, 28))
    • 다음 층에는 128개의 출력 뉴런을 ReLU 활성화 함수와 함께 쌓고 → model.add( Dense(128, activation='relu') )
    • 그 다음 층에는 20%의 출력 뉴런을 끈다 → model.add( Dropout(0.2) )
    • 마지막 층에는 출력방법을 설정한다 → model.add( Dense(10, activation='softmax') )
      • 마지막 activation 함수는 아래와 같이 설정
        • softmax - 다중분류
        • sigmoid - 이진분류
        • X - 회귀

오전수업

  • 사이트 소개 : https://playground.tensorflow.org/
    • 값을 조절해가며 찾아봤다!

      Playground for TensorFlow.png
    • 이렇게 레이어를 많이 추가하면 된다.
      Playground TensorFlow 이렇게.png
  • 차원의 저주
    • 차원이 증가하면서 학습데이터 수가 차원 수보다 적어져서 성능이 저하되는 현상을 일컫는다. 차원이 증가할수록 변수가 증가하고, 개별 차원 내에서 학습할 데이터 수가 적어진다
    • 차원 = 컬럼의 개수
    • 차원이 많아 질수록 경우의 수가 많아져야 하므로 데이터가 기하급수적으로 많아져야 함
    • 그래야 모든 경우에 대해 학습이 가능함
    • 차원이 많아질수록 데이터가 많아지는 현상을 "차원의 저주" 라고 함
  • 머신러닝은 데이터가 적어도 가능하지만 딥러닝은 데이터가 적으면 어렵다.
  • 딥러닝을 하다보면 훈련이 잘 되었을 때, 멈출 필요가 있는데 이를 조기 종료(Early Stopping)하는 방법이 있음 (기준 : 검증 비용)
    • patience parameter 가 중요. 훈련 횟수에 따라서 더 이상 떨어지지 않고 유지가 되거나 올라가는 경우에 몇 번이나 참을 것인지 설정 (=성능이 증가하지 않는 epoch을 몇 번이나 허용할 것인가를 정의한다 - 링크)
  • 타이타닉에 탑승한 디카프리오와 윈슬렛의 생존확률을 딥러닝으로 작성했다.
    TensorFlow 실습 타이타닉 탑승자 생존률 추측.png
  • 딥러닝 대비 머신러닝은 feature_importances 등 좀 더 설명 가능한 요소를 확인할 수 있다.

4.6.3 오후수업[편집 | 원본 편집]

  • 강사님이 커피를 준다고 했는데 안 사왔다!!! 라이어!!!
  • 오후에는 CNN 실습을 한다.
  • VGG를 구현한다.
    VGG 구조.png

제로패딩(Zero-Padding)을 적절히 해주어야 양쪽 끝에 있는 픽셀이 줄어들지 않고 Convolution 계산이 됨

  • model.add ( Conv2D(64, (3,3), activation='relu', padding='same', input_shape=(28, 28)) )
    • same : 필터의 사이즈가 k이면 사방으로 k/2 만큼의 패딩을 준다. (링크)

CNN으로 MNIST 구현을 함

RNN 소개

  • RNN은 activation 함수로 tanh 나 sigmoid를 쓰는 경우가 많음

비트코인 가격 예측 프로그램 작성

  • 어떻게 예측할까? 주어진 데이터를 통해 예측하는데 아래와 같이 하고자 함
    • 1~5일차 데이터로 6일 때 비트코인 가격 예측
    • 2~6일차 데이터로 7일 때 비트코인 가격 예측
    • 3~7일차 데이터로 8일 때 비트코인 가격 예측
    • ...
  • 마지막에는 복습 및 시험관련 설명

4.6.4 복습 및 시험관련 설명[편집 | 원본 편집]

머신러닝 수업정리-01.png

머신러닝 수업-02.png

5 참고자료[편집 | 원본 편집]

6 기타 학습자료[편집 | 원본 편집]