아이펠 2주차는 fundametals주차로 파이썬의 기초 문법을 빠르게 정리하고 데이터 분석, EDA에 대해 공부했다. 이후 sklearn을 사용하여 머신 러닝 실습을 진행하고, 마지막으로 딥러닝에서 사용되는 linear, convolution layer를 포함하여 딥러닝 전반의 이해에 대해 학습하는 시간이 되었다.
리서치 과정은 파이썬을 어느정도 다룰 줄 안다고 가정하고 교육이 이뤄지기 때문에 파이썬 문법에 대해 상세히 다루지는 않는다. 파이썬은 객체지향, 함수형 프로그래밍으로 코드의 간결성, 재사용성 등에 장점을 가지고 있다. 다양한 기초 문법에 대해 복습했지만 개인적으로 느끼기에는 이러한 특성을 잘 나타낼 수 있는 함수, 클래스에 대해 복습하는 시간을 가졌다고 생각한다.
"배운 것을 간단히 요약하기"
1. for문, try-except 예외처리
2. multiprecessing
3.함수식 + 람다 표현식
4.클래스, 모듈 패키지
다른 파트는 어느정도 익숙한 내용인데 multiprocessing이 무엇인지 어색했다.
여기서 multiprecessing은 데이터를 순차처리로 처리하는 것이 아니라 병렬처리 하는 방식을 말한다. 이를 통해 빠르고 효율적으로 데이터를 처리할 수 있다는 장점이 있다. 파이썬에서는 multiprocessing을 지원하는 모듈이 있어 바로 사용할 수 있어 편하다! 예시 코드는 다음과 같다.
import multiprocessing
import time
num_list = ['p1','p2', 'p3', 'p4']
start = time.time()
def count(name):
time.sleep(5)
print("finish:"+name+"\n")
if __name__ == '__main__':
pool = multiprocessing.Pool(processes = 2)
pool.map(count, num_list)
pool.close()
pool.join()
print("time :", time.time() - start)
numpy, pandas, matplotlib, seaborn 등 다양한 파이썬 라이브러리를 활용하여 데이터 시각화, 분석을 하는 방법에 대해 배웠다. 해당 부분은 볼 때마다 기억이 안나서 매일 구글링해서 해결하는 방식이였는데, 이번 기회에 개인적으로 헷갈렸거나 자주 쓸 것 같은 내용을 정리를 해보고자 한다.
"배운 것을 간단히 요약하기"
1. data 표현 - array, table
2. data visualization
data 표현 방식에는 다음의 링크를 참고하여 공부했다.
https://iambeginnerdeveloper.tistory.com/27
파이썬에서 데이터를 시각화할 때 주로 쓰는 라이브러리가 있다. 바로 matplotlib과 seaborn이다. 물론 더욱 다양한 라이브러리가 있지만 두 개만 잘 사용해도 충분히 거의 모든 데이터를 그래프로 시각화 할 수 있다.
이번에 처음 알게된 사실은 matplotlib과 seaborn을 섞어서 쓸 수 있다는 점이였다..(대박 신기)
-matplotlib
matplotlib은 그래프를 그릴 figure객체를 만들고 그 안에 하위 그래프를 추가하는 방식이다.
# 축 그리기
#도화지(그래프) 객체 생성
fig = plt.figure()
#figure()객체에 add_subplot 메서드를 이용해 축을 그려준다.
ax1 = fig.add_subplot(1,1,1)
add_subplot을 통해 축을 그려줄 수 있는데 각각의 인자는 각각 nrows,ncols, index를 의미한다. 가령, 1,1,1은 1 x 1의 축을 그려 1번째 인덱스에 넣겠다는 뜻이다 -> 1개의 도화지에 1개를 그린다. add_subplot 공식문서
<add_subplot(2,2,?)예시.>
이렇게 추가된 도화지에 하나하나 매칭해서 그래프를 그리면 된다.
ax1.bar(x,y)
ax2.scatter(x,y)
위의 과정을 생략하는 모듈도 있다. 바로 plt.plot()이다.
이 함수는 가장 최근의 figure객체와 그 서브 플롯을 그리기 때문이다.
다음은 log(x)의 그래프를 plt.plot()으로 다양한 인자를 사용해서 비교하는 예시 코드이다.
x = np.linspace(1, 10, 100)
y = np.log(x)
plt.plot(x, y + 0, linestyle='solid')
plt.plot(x, y + 1, linestyle='dashed')
plt.plot(x, y + 2, linestyle='dashdot')
plt.plot(x, y + 3, linestyle='dotted')
plt.plot(x, y + 0, '-g') # solid green
plt.plot(x, y + 1, '--c') # dashed cyan
plt.plot(x, y + 2, '-.k') # dashdot black
plt.plot(x, y + 3, ':r'); # dotted red
plt.plot(x, y + 4, linestyle='-') # solid
plt.plot(x, y + 5, linestyle='--') # dashed
plt.plot(x, y + 6, linestyle='-.') # dashdot
plt.plot(x, y + 7, linestyle=':'); # dotted
- seaborn
seaborn과 matplotlib을 활용하면 더욱 쉽고 간단하게 만들 수 있다.
bar 그래프를 예시로 코드를 보면
plt.figure(figsize=(10,6)) # 도화지 사이즈.
sns.barplot(data=df, x='x값', y='y값')
plt.ylim(0, 4) # y값의 범위.
plt.title('제목') # 그래프 제목.
여기서 주의할 점은 df의 데이터를 그대로 x,y값에 넣을 수 없으므로, list 혹은 series를 x에 / y에 list형태로 넣어줘야 한다는 것이다!
"배운 것 간단히 요약하기"
1. 다양한 전처리 기법
2. sklearn으로 구현하는 머신러닝
3. 전설의 포켓몬을 예측하라!
1,2에 대하여 3번으로 실습이 진행됐다!
같이 공부하는 그루분이 정리해준 표가 있었다!
정리하면 다음과 같다.
세부적인 내용이나 코드를 확인하고 싶으면 아래의 링크를 타고 들어가보는 것을 추천한다!
전설의 포켓몬 예측하기
"배운 것 간단하게 요약하기"
1. linear layer
2. convolution layer
3. Embedding, Recurrent
4. Vanilla RNN, LSTM, GRU
- Linear, convolution layer
linear layer는 딥러닝을 공부하면 가장 먼저 배우는 레이어라고 할 수 있다. 입력 노드가 출력 노드와 완전히 연결된 구조를 가진다. 이 때 연결된 선들이 학습해야 할 가중치라고 생각하면 된다. y = w * X + b와 같이 표현할 수 있는데, w가 가중치, b가 편향이다. linear layer는 선형변환의 역할을 수행하기 때문에 데이터를 특정 차원으로 변환하는 기능을 한다고 생각하면 된다. linear layer는 퍼셉트론의 개념에서 파생되었으므로, 해당 내용은 아래 링크에서 확인해보자!
퍼셉트론 설명
convolution layer는 공간적 특징을 보존하면서 학습이 이뤄진다는 점이 특징이다. 도장을 찍듯이 filter가 r,g,b채널별로 convolution을 진행하면서 그 특징이 도출된다고 생각하면 된다. 알아야 할 개념으로는 feature map, filter, padding, pooling 정도가 있다.
이에 대해 정리한 글이 있으므로 아래 링크를 참고할 것!
합성곱 연산 이해하기
이번에 처음 알게 된 것은 receptive field와 transposed convolution이다. receptive field는 수용영역으로 conv - pooling등의 층을 거치면서 얼마나 큰 영역을 참조(수용)하는 지에 관한 것이다.
conv layer만으로는 객체의 특징을 잘 파악하지 못하는 경우가 많다.
Ex)
1. 작은 필터 사이즈는 object detection을 위한 유의미한 정보를 담아내기에는 너무 작은 사이즈이다.
2. 이미 Stride를 어느정도 크게 주고 있다면, 연산량이 줄어드는 효과는 발생했지만 찾고자 하는 object가 필터 경계선에 걸려서 인식하지 못할 우려가 있다.
--> 따라서 수용영역을 늘려주는 것이 필요한 데, 가장 기본적으로는 pooling기법을 사용하여 수용 영역을 늘려주는 것이다.
transposed convolution은 conv의 결과를 역재생해서 원본 데이터와 최대한 유사한 정보를 복원하기 위해 사용되는 layer이다.
Auto Encoder에서 사용되는데 예시코드로 이해하면 편하다.
from tensorflow.keras.layers import Conv2DTranspose
from tensorflow.keras.layers import Conv2DTranspose,Conv2D
import numpy as np
from tensorflow.keras.layers import Input, Dense, Conv2D, MaxPooling2D, UpSampling2D
from tensorflow.keras.models import Model
from tensorflow.keras.datasets import mnist
import json
import matplotlib.pyplot as plt #for plotting
# AutoEncoder 모델 구성 - Decoder 부분
# AutoEncoder 모델 구성 - Input 부분
input_shape = x_train.shape[1:]
input_img = Input(shape=input_shape)
# AutoEncoder 모델 구성 - Encoder 부분
encode_conv_layer_1 = Conv2D(16, (3, 3), activation='relu', padding='same')
encode_pool_layer_1 = MaxPooling2D((2, 2), padding='same')
encode_conv_layer_2 = Conv2D(8, (3, 3), activation='relu', padding='same')
encode_pool_layer_2 = MaxPooling2D((2, 2), padding='same')
encode_conv_layer_3 = Conv2D(4, (3, 3), activation='relu', padding='same')
encode_pool_layer_3 = MaxPooling2D((2, 2), padding='same')
encode_conv_layer_4 = Conv2D(2, (3, 3), activation='relu', padding='same')
encode_pool_layer_4 = MaxPooling2D((2, 2), padding='same')
encoded = encode_conv_layer_1(input_img)
encoded = encode_pool_layer_1(encoded)
encoded = encode_conv_layer_2(encoded)
encoded = encode_pool_layer_2(encoded)
encoded = encode_conv_layer_3(encoded)
encoded = encode_pool_layer_3(encoded)
encoded = encode_conv_layer_4(encoded)
encoded = encode_pool_layer_4(encoded)
# AutoEncoder 모델 구성 - Decoder 부분
decode_conv_layer_1 = Conv2DTranspose(2, (3, 3), activation='relu', padding = 'same')
decode_upsample_layer_1 = UpSampling2D((2, 2))
decode_conv_layer_2 = Conv2DTranspose(4, (3, 3), activation='relu')
decode_upsample_layer_2 = UpSampling2D((2, 2))
decode_conv_layer_3 = Conv2DTranspose(8, (3, 3), activation='relu')
decode_upsample_layer_3 = UpSampling2D((2, 2))
decode_conv_layer_4 = Conv2DTranspose(16, (1, 1), activation='relu')
decode_conv_layer_5 = Conv2DTranspose(1, (3, 3), activation='sigmoid',padding = 'same')
decoded = decode_conv_layer_1(encoded) # Decoder는 Encoder의 출력을 입력으로 받는다.
decoded = decode_upsample_layer_1(decoded)
decoded = decode_conv_layer_2(decoded)
decoded = decode_upsample_layer_2(decoded)
decoded = decode_conv_layer_3(decoded)
decoded = decode_upsample_layer_3(decoded)
decoded = decode_conv_layer_4(decoded)
decoded = decode_conv_layer_5(decoded)
# AutoEncoder 모델 정의
#parameter 확인
autoencoder = Model(input_img, decoded)
autoencoder.summary()
# AutoEncoder 모델 정의하고 optimizer를 'adam'으로 놓고 컴파일->모델 학습
autoencoder.compile(optimizer='adam', loss='binary_crossentropy')
autoencoder.fit(x_train, x_train,
epochs=2,
batch_size=256,
shuffle=True,
validation_data=(x_test, x_test))
해당 내용에 대한 이론적인 내용은 아래 포스팅에서 참고하세요!
up-sampling with transposed conv
-Embedding, recurrent layer
자연어 처리에서 자주 사용되는 layer로 처음 공부하는 파트이다.
아직 이해하지 못한 부분이 있어 해당 부분을 보충하여 따로 포스팅 할 예정이다!
크게 설명을 해보면, embedding layer를 통해 단어, 문장, corpus를 컴퓨터가 이해할 수 있도록 인코딩하고 차원을 축소하여 입력한다. recurrent layer는 그 입력을 되먹임 구조를 통해 이전과 얼마나 유사한지, 어떤 단어가 나와야 할 지 정하는 구조다. 하지만 vanilla RNN에는 장기 의존성(long-term dependency)을 잘 다루지 못하므로 이를 해결하기 위해 LSTM, GRU와 같은 layer가 등장했다.
('장기 의존성' = 입력 데이터가 길어지면 데이터 앞쪽의 정보가 뒤쪽까지 전달되지 않는 현상 -> 기울기 소실의 문제)