생활코딩 - Tensorflow 101 강의를 듣고 요약, 필기한 내용입니다.
뉴럴 네트워크: 사람의 두뇌(뉴런)가 동작하는 방법을 모방한, 머신러닝 구현을 위한 알고리즘 중 하나. (= 인공 신경망, 딥러닝)
텐서플로우: 딥러닝 이론을 코드를 통해 이용할 수 있게 해주는 라이브러리 중 하나. 지도 학습 영역의 회귀 문제, 분류 문제를 해결 가능.
Google Colaboratory: 구글 드라이브에서 사용할 수 있는 데이터 분석 & 머신 러닝 프로그램.
판다스: 파이썬에서 표를 다루기 위한 라이브러리. csv
파일을 읽어서 독립/종속 변수로 분리 가능
csv: 콤마(,)를 통해 컬럼을 구분한 데이터. 엑셀로 읽으면 표 형태로 보여줌.
pd.read_csv(파일경로)
: 파일을 읽어서 DataFrame 타입 객체로 반환DataFrame.shape
: 데이터의 행 개수와 열 개수를 튜플 객체로 반환, 형태 확인 시 사용DataFrame.columns
: 데이터의 컬럼 목록을 Index([컬럼명1, ...])
형태로 반환DataFrame[[컬럼명1, ...]]
: 데이터를 컬럼별로 분리, 독립/종속 변수 분리 시 사용DataFrame.head()
: 데이터의 상위 5개 데이터까지만 출력레모네이드 = pd.read_csv('lemonade.csv')
독립 = 레모네이드[['온도']]
종속 = 레모네이드[['판매량']]
X = tf.keras.layers.Input(shape=[독립변수 개수])
Y = tf.keras.layers.Dense(종속변수 개수)(X)
model = tf.keras.models.Model(X, Y)
model.compile(loss='mse')
model.fit(독립, 종속, epochs=1000)
# epochs: 전체 데이터를 몇 번 반복하여 학습할 것인지
verbose=0
을 넣어주면 학습 과정 출력을 생략함print(model.predict([[15]]))
# 입력값 15에 대한 예측값을 출력
(예측 - 결과)^2
의 평균. 0에 가까울수록 정답에 근접한 것!모델의 정체는 '수식'
모델을 생성할 때 가장 먼저 입력(독립변수 + 상수)의 개수와 출력(종속변수)의 개수를 받아 대응되는 수식을 만듦.
y = w1x1 + w2x2 + ... + w13x13 + b
w
는 가중치, b
는 편향(바이어스)이라 부름Model.get_weights()
로 현재 모델이 학습한 가중치와 편항을 확인 가능퍼셉트론은 이러한 수식에 대한 모형이며, 학습의 목적은 이 수식에서 종속변수에 가장 근접하기 위한 적절한 w와 b를 찾는 것.
0.001
은 dt
가 아닌 임의의 Learning Rate 값임에 유의종속변수가 범주형 데이터일 때는 회귀 대신 분류 방식을 이용해야 함.
원핫-인코딩(onehot-encoding): 범주형 데이터를 수식에서 사용할 수 있는 숫자 형태로 변환하는 방법.
A
, B
, C
중 하나의 값을 갖는 종속변수 X
0
또는 1
을 값으로 갖는 3개의 종속변수 A
, B
, C
로 변환pd.get_dummies(데이터)
: 원본 데이터에서 범주형 변수들만 골라서 원핫-인코딩된 결과로 반환함.활성화 함수(Activation): 퍼셉트론의 출력이 어떤 형태로 나가야 하는지 조절하는 역할을 하는 함수.
tf.keras.layers.Dense(3, activation='softmax')(X)
# Softmax 방식으로 확률 표현
분류 모델에서의 loss는 MSE(Mean Squared Error) 대신 Cross Entropy를 사용함.
model.compile(loss='categorical_crossentropy')
# loss로 Cross Entropy 방식을 사용
compile()
의 매개변수로 metrics='accuracy'
를 추가하면 결과에서 0과 1 사이의 값을 가지는 정확도를 추가로 표시함딥 러닝: '깊은 신경망', 즉 여러 층의 퍼셉트론으로 구성된 인공 신경망의 학습.
히든 레이어: 입력층과 출력층 사이에 끼어들어가는 층. 각 노드의 입력은 이전 층의 모든 노드임.
X = tf.keras.layers.Input(shape=[13])
# 히든 레이어 추가, 활성화 함수로 swich 사용
H = tf.keras.layers.Dense(5, activation='swish')(X)
# 2개 이상의 히든 레이어도 추가 가능!
H = tf.keras.layers.Dense(3, activation='swish')(H)
H = tf.keras.layers.Dense(3, activation='swish')(H)
# 최종 출력 Y의 입력이 X가 아닌 H임에 유의
Y = tf.keras.layers.Dense(1)(H)
model = tf.keras.models.Model(X, Y)
model.compile(loss='mse')
Model.summary()
: 모델의 각 층과 출력 형태 등의 정보를 출력Param #
: 가중치 및 바이어스의 개수범주형 데이터의 값이 숫자로 표현된 경우, get_dummies()
를 통한 원핫 인코딩이 불가능함. (양적 데이터로 인식하기 때문)
데이터.dtypes
: 각 컬럼들의 타입을 출력함.category
및 object
타입인 경우에만 get_dummies()
를 통해 원핫 인코딩 가능.데이터[컬럼명].astype('category')
이용!데이터에 N/A 값이 존재할 때에도 문제가 생길 수 있음.
데이터.isna().sum()
: 컬럼별로 N/A 값이 있는지 체크함.mean = 데이터[컬럼명].mean()
데이터[컬럼명] = 데이터[컬럼명].fillna(mean)
Activation은 Dense Layer로부터 분리하여 작성 가능함.
H = tf.keras.layers.Dense(8, activation='swish')(X)
# 위, 아래 코드는 동일한 코드
H = tf.keras.layers.Dense(8)(X)
H = tf.keras.layers.Activation('swish')(H)
이때 Dense와 Activation 사이에 BatchNormalization 삽입 가능.
H = tf.keras.layers.Dense(8)(X)
H = tf.keras.layers.BatchNormalization()(H)
H = tf.keras.layers.Activation('swish')(H)
=> loss가 훨씬 더 빨리, 많이 떨어짐! (자세한 원리는 이후에...)
기계학습 중 지도학습은 '과거의 데이터를 분석해서 미래의 데이터를 예측하는 것'이라 했다.
입력과 출력, 원인과 결과, 독립변수와 종속변수로 구분되는 데이터를 이미 갖고 있다면, 이를 바탕으로 새로운 입력이 등장하더라도 그에 대한 결과를 예측하여 내놓는 기계를 만들 수 있다.
여러 개의 입력(xn)이 어떤 식으로 출력(y)을 만들어 내는지는 수식으로 표현할 수 있다:
그리고 학습이란 위 수식이 주어진 과거의 데이터(예시)와 최대한 가까운 결과를 내놓도록 적절한 와 를 찾아가는 과정이다.
초기 w
와 b
로부터, 주어진 입력값을 대입한 결과가 실제 예시와 얼마나 비슷한지 비교하고, 오차를 줄이기 위해 w
와 b
를 알맞은 방향으로 키우거나 줄이는 작업을 반복한다. 주어진 데이터가 많을수록, 학습을 많이 반복할수록 정확도는 높아지고 실제와 가까운 수식(모델)을 얻을 수 있게 된다.
기계학습의 정체를 알기 전까진 완전히 마법처럼 느껴지는 기술이었지만, 사실은 인간도 할 수 있는 계산 과정을 '매우 빠르고 효율적으로' 기계가 대신 해주는 것이라는 걸 알게 되었다.
다음 강의에서는 조금 더 깊은 부분에 대해 배울 것 같다.