본문 바로가기
네이버클라우드/AI

AI 1일차 (2023-05-08) 인공지능 기초 - 딥러닝 기본 코드 실습

by prometedor 2023. 5. 8.

딥러닝 기본 코드 실습

tf01_study

# 1. 데이터
import numpy as np
x = np.array([1, 2, 3])
y = np.array([1, 2, 3])

# 2. 모델구성
from keras.models import Sequential
from keras.layers import Dense

model = Sequential()
model.add(Dense(10, input_dim=1))		# 입력층
model.add(Dense(5))				# 히든 레이어 1
model.add(Dense(7))                		# 히든 레이어 2
model.add(Dense(5))                		# 히든 레이어 3
model.add(Dense(1))                 		# 출력층

# 3. 컴파일, 훈련
model.compile(loss='mse', optimizer='adam')
model.fit(x, y, epochs=1000)        		# epochs(훈련량) 높이면 시간은 늘어남

# 4. 예측, 평가
loss = model.evaluate(x, y)         		# 평가
print('loss : ', loss)              		# loss :  8.05281744607235e-14

result = model.predict([4])			# 예측 (4 를 예측해보자. 4는 x result 는 y)
print('4의 예측값 : ', result)			# 4의 예측값 :  [[4.]]

 
 

손실함수 (Loss Function)

ㄴ 값이 낮을수록 학습이 잘 된 것
ㄴ 정답과 알고리즘 출력을 비교할 때 사용
ㄴ 최적의 매개변수(가중치 : w, 편향 : b)을 탐색할 때 손실함수를 가능한 작게 하는 값을 찾음
 
ㄴ MSE (Mean Squared Error) : 평균 제곱 오류 --> 출력 결과와 데이터 차이 제곱의 평균으로 정답과 오답의 모든 확률 고려
ㄴ CEE (Cross Entropy Error) : 교차 엔트로피 오차  --> 실제 정답의 확률만을 고려한 손실함수 (훈련데이터의 정답 혹은 확률이 0 or 1)
 
 
tf02.py

import numpy as np
from keras.models import Sequential     	# Keras 패키지에서 Sequential 모델을 가져옴
from keras.layers import Dense			# Keras 패키지에서 Dense 레이어 클래스를 가져옴

# 1. 데이터
x = np.array([1, 2, 3, 5, 4])
y = np.array([1, 2, 3, 4, 5])

# 2. 모델구성
model = Sequential()				# 새로운 Sequential 모델을 생성
model.add(Dense(7, input_dim=1))		# 입력층으로 뉴런 7개를 가진 Dense 레이어를 추가하고, 입력 차원이 1차원임을 명시
model.add(Dense(10))				# 은닉층으로 뉴런 10개를 가진 Dense 레이어를 추가
model.add(Dense(7))				# 은닉층으로 뉴런 7개를 가진 Dense 레이어를 추가
model.add(Dense(1))				# 출력층으로 뉴런 1개를 가진 Dense 레이어를 추가

# 3. 컴파일, 훈련
model.compile(loss='mae', optimizer='adam') 	# w값이 (-)일 경우 'mae' 사용(loss, 예측값 모두 좋아짐)
						# mse --> (y - y')^2  /  mae(-값이 나올만 할 경우) --> |y - y'| 
model.fit(x, y, epochs=1000)			# 데이터 학습량

# 4. 예측, 평가
loss = model.evaluate(x, y)			# 평가
print('loss : ', loss)				# loss :  0.40052375197410583

result = model.predict([6])			# 예측
print('6의 예측값 : ', result)			# 6의 예측값 :  [[5.9980288]]

ㄴ MSE : 예측값과 실제값의 차이를 제곱한 후 평균을 구한 것으로, 예측값과 실제값의 차이가 클수록 오차가 크게 반영됨
ㄴ MAE : 예측값과 실제값의 차이의 절댓값을 평균한 것으로, 예측값과 실제값의 차이가 클수록 오차가 크게 반영됨
--> w 값이 (-) 일 경우에 사용

 

 
 

배치 사이즈(batch size)

ㄴ 한 번의 업데이트에 사용되는 샘플의 개수
ㄴ 배치 사이즈가 32인 경우, 32개의 샘플을 모아서 한 번의 업데이트를 수행
 
ㄴ 작은 배치 사이즈는 모델이 더 자주 업데이트되므로 노이즈가 많은 경향이 있으며, 더 많은 학습 반복이 필요
안정적인 경향이 있으나 메모리 문제와 학습 시간이 길어지는 문제가 발생할 수 있음
 
ㄴ 딥러닝에서 배치 사이즈는 학습시에 지정되며 일반적으로 32, 64, 128 등 2의 거듭제곱 수를 사용
 
ㄴ 배치 사이즈는 모델의 크기와 데이터 셋의 크기에 따라 적절하게 조정되어야 함
 
tf02_batch.py

import numpy as np
from keras.models import Sequential     	# Keras 패키지에서 Sequential 모델을 가져옴
from keras.layers import Dense          	# Keras 패키지에서 Dense 레이어 클래스를 가져옴

# 1. 데이터
x = np.array([1, 2, 3, 5, 4])
y = np.array([1, 2, 3, 4, 5])

# 2. 모델구성
model = Sequential()
model.add(Dense(7, input_dim=1))
model.add(Dense(20))
model.add(Dense(10))
model.add(Dense(7))
model.add(Dense(1))

# 3. 컴파일, 훈련
model.compile(loss='mae', optimizer='adam') 	# w값이 (-)일 경우 'mae' 사용(loss, 예측값 모두 좋아짐)
						# mse --> (y - y')^2 , |y - y'| --> mae(-값이 나올만 할 경우)
model.fit(x, y, epochs=1000, batch_size=1)	# batch_size => 한 번의 업데이트에 사용되는 샘플의 개수

# 4. 예측, 평가
loss = model.evaluate(x, y)
print('loss : ', loss)

result = model.predict([6])
print('6의 예측값 : ', result)

 
 

Numpy 의 다차원 배열 연산 - transpose()

ㄴNumpy 의 다차원 배열 연산의 transpose() 함수를 사용하여 행렬을 바꾼 결과 확인
 
tf03_mlp01.py

import numpy as np
from keras.models import Sequential
from keras.layers import Dense

# 1. 데이터
x = np.array([[1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 
              [1, 2, 1, 1, 2, 1.1, 1.2, 1.4, 1.5, 1.6]])
y = np.array([11, 12, 13, 14, 15, 16, 17, 18, 19, 20])

print(x.shape)  			# 데이터 형태 확인 : (2, 10)
print(y.shape)  			# 데이터 형태 확인 : (10,)  --> 위 아래 행 맞추기(행과 열이 맞아야 함)

x = x.transpose()
# x = x.T --> 위와 같은 의미

print(x.shape)  			# 데이터 형태 확인 : (10, 2)

# 2. 모델구성
model = Sequential()
model.add(Dense(10, input_dim=2))
model.add(Dense(100))
model.add(Dense(50))
model.add(Dense(10))
model.add(Dense(15))
model.add(Dense(1))

# 3. 컴파일, 훈련
model.compile(loss='mse', optimizer="adam")
model.fit(x, y, epochs=1000, batch_size=5)

# 4. 평가, 예측
loss = model.evaluate(x, y) # loss :  1.273292560798056e-12
print('loss : ', loss)

result = model.predict([[10, 1.6]])
print('[10]과 [1.6]의 예측값 : ', result)   # [10]과 [1.6]의 예측값 :  [[20.]]

 

Numpy 의 다차원 배열 연산 - reshape()

ㄴNumpy 의 다차원 배열 연산의 reshape() 함수를 사용하여 행렬을 바꾼 결과 확인
ㄴ transpose() 와의 차이 확인

import numpy as np  			# NumPy 라이브러리를 불러와서 사용할 수 있도록 함(np는 numpy 축약)

a = np.array([[1, 2, 3], [4, 5, 6]])
print("Original(안바꾼거) :\n", a)     	# \n --> 줄바꿈, \t --> 띄어쓰기

a_transpose = np.transpose(a)           # 행렬을 바꿔주는 함수
print("Transpose(바꾼거) :\n", a_transpose)
#  [[1 4]
#  [2 5]
#  [3 6]]

a_reshape = np.reshape(a, (3,2))        # 행렬을 바꿔주는 함수
print("Reshape(바꾼거) :\n", a_reshape)
#  [[1 2]
#  [3 4]
#  [5 6]]

# transpose() 와 reshape() 의 차이점 :
# transpose() --> 데이터의 순서대로 바뀜
# reshape()  --> 데이터를 변형해서 바뀜

 
 
 

과제 - 모델구성부터 평가예측까지 완성하기

import numpy as np
from keras.models import Sequential
from keras.layers import Dense

# 1. 데이터
x = np.array([[1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 
              [1, 2, 1, 1, 2, 1.1, 1.2, 1.4, 1.5, 1.6],
              [10, 9, 8, 7, 6, 5, 4, 3, 2, 1]])
y = np.array([11, 12, 13, 14, 15, 16, 17, 18, 19, 20])

print(x.shape)
print(y.shape)
x = x.transpose()

# 모델구성부터 평가예측까지 완성하기
# 예측값 : [[10, 1.6, 1]]

# 2. 모델구성
model = Sequential()
model.add(Dense(10, input_dim=3))
model.add(Dense(100))
model.add(Dense(1))
model.add(Dense(1))

# 3. 컴파일, 훈련
model.compile(loss='mse', optimizer='adam')
model.fit(x, y, epochs=100, batch_size=5)

# 4. 평가, 예측
loss = model.evaluate(x, y) # loss :  0.0020495078060775995
print('loss : ', loss)

result = model.predict([[10, 1.6, 1]])  # [10]과 [1.6]과 [1]의 예측값 :  [[19.986025]]
print('[10]과 [1.6]과 [1]의 예측값 : ', result)