본문 바로가기
인공지능 개발하기/Machine Learning

[Tensorflow] 6. 입출력 데이터 수 변경

by 선의공 2024. 1. 3.
반응형

 
 
안녕하세요. 학원에서 
저는 텐서플로우 기초를 배우고 있습니다.
학습 및 공유를 위해
하루하루 배운 내용을
복기해서
포스팅 하고 있습니다.
 
 
 
저번 포스팅에 이어 데이터 2탄입니다.
저번엔 x의 데이터를 (2,10)로 생성하고
(10,2) 로 변경해서 딥러닝을 돌려봤는데요~
https://aigaeddo.tistory.com/8

 

5. 데이터) 스칼라, 벡터, 행렬, 텐서

저희가 사용하고 있는 Tensorflow API 이름의 뜻을 알고 계신가요?? Tensor의 flow, 텐서(Tensor)의 흐름이라고 합니다. 그럼 이 Tensor가 뭘까요? 어려운 주제지만 해당 포스트는 딥하지 않습니다. 아직 딥

aigaeddo.tistory.com

 
 
오늘은
입력 데이터 추가하기
출력 데이터 추가하기
를 해보겠습니다.
특별할 것 없습니다!
 
 


 

1) 입력데이터 추가하기

 
 
x데이터의 종류를 하나 더 추가해보겠습니다.
(10,2) -> (10,3)으로
데이터를 변경하겠습니다.
일단 전체 코드 보시죠.

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, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.5, 1.4, 1.3],
       [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
    ]  
)

y = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])

print(x.shape)  # (3,10)
print(y.shape)  # (10,)
x = x.T #전치. 행과 열을 바꿔줌.
# x = x.transpose()
# x = x.swapaxes(0,1) # [1,1], [2, 1.1], [3, 1.2]... [10, 1.3]

print(x.shape)  # (10, 3)

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

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

#4.평가, 예측
loss = model.evaluate(x,y)
results = model.predict([[10, 1.3, 0]]) #!!!!입력과 같은 열을 맞춰줘야함

print("로스 : ", loss)
print("예측값 : ", results)

 
 
코드의 변경된 점을 보면
입력데이터인 x의 데이터의 개수를
하나 더 추가해주었습니다.
마지막
[9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
데이터가 추가되었죠??
 
이전 포스팅과 마찬가지로
임시 데이터를 집어넣어주게 되었고
이를 전치(행과 열을 바꿈)해서 사용해주었습니다.
이번에는 전치를 하는 아래 세가지 방법 중
nparray.T 
nparray.transpose()
nparray.swapaxes(0,1)
 
nparray.T 방식를 사용해주었습니다.

# 1. 데이터
x = np.array(
    [
       [1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
       [1, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.5, 1.4, 1.3],
       [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
    ]  
)

y = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])

print(x.shape)  # (3,10)
print(y.shape)  # (10,)
x = x.T #전치. 행과 열을 바꿔줌.

 
 
입력 데이터를 2->3개로 추가해주었으므로
input_dim의 값을 3으로 변경해주었습니다.
 
노드 개수나 레이어는 계속 변경될 수 있습니다..ㅜㅜ
참고해주세요.

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

 
 
 
 
입력데이터의 구조를 확인할 수 있는 방법아시죠?
nparray.shape이요!
전치 후에 shape를 찍어보면
x 의 구조는 (10,3) 인 것을 확인할 수 있습니다.
10개의 벡터이고
벡터 안에는 3개의 스칼라가 있죠.
 
아래 코드에 예측값을 넣어주는 코드도
벡터에 스칼라가 세개 들어간걸 볼 수 있습니다.
[[10, 1.3, 0]]
여기서 예측 값은
x의 열(스칼라 개수)과 같은
(n,3)형태로 와야합니다!
이게 안되면 오류가 나게 됩니다!!중요중요
특히나 대괄호를 안씌워주게 되면
[10, 1.3, 0]의 벡터가 되고
이 데이터 구조는 (3,)이 되므로
반드시 대괄호를 씌워줍시다.
 
(1,3) 형태의 데이터를 예측값으로 넣어줬습니다.

#4.평가, 예측
loss = model.evaluate(x,y)
results = model.predict([[10, 1.3, 0]]) #!!!!입력과 같은 열을 맞춰줘야함

 
 
동그란걸 노드, 한 줄이 레이어라고 한다면
입력의 개수가3, 출력의 개수가 1인

0  0  0
0
0 0 0 0
0

이런 딥러닝 모델 형태가 완성되었습니다.
 


 

 

2. 출력 데이터 추가하기 

 
 
 
 
다음은 출력 데이터를 추가해볼건데요.
일단 전체 코드는 아래와 같습니다.

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, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.5, 1.4, 1.3],
        	[9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
        ]
)
print(x)
print(x.shape) #(3, 10)

# x = x.T
#x = x.swapaxes(0,1)
x = x.transpose() #다 같은 목적의 함수 (행과 열 변환/ 전치)

print(x)
print(x.shape)

# []안에 들어간 값: list (두개 이상은 리스트)
y = np.array([[1, 2, 3, 4, 5, 6, 7, 8, 9, 10], [1, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 1.8, 1.9]])
y = y.T
print(y.shape)

#예측 : [10, 31, 0]

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

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

#평가, 예측
loss = model.evaluate(x,y)

result = model.predict([[10,31,0]])

print("로스 값: " , loss)
print("예측값: " , result)

 
 
 

 
 
이전 코드에
출력 데이터인 y데이터를 추가해주었습니다.
마찬가지로 임시데이터로..
numpy의 전치함수을 이용해서 (10,3) 형태를 만들어주었습니다.

y = np.array([[1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 
              [1, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 1.8, 1.9],
              [9,8,7,6,5,4,3,2,1,0]
              ])
y = y.T

 
 
 
 

출력 데이터 개수가 변경되면
출력 노드의 개수도 변경되어야 겠죠?
마지막 Dense을 3으로 세팅해줍니다.
원래 Dense(output개수, input_dim= input개수)
이런 형태고
이걸 줄여써서
Dense(output) 개수라고 쓴다고 했었죠?
그래서 Dense의 값을 3으로 정해준거에요.

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

 
 

평가, 예측의 데이터형은 변하는게 없습니다.
예측에 넣어주는 데이터는
x의 데이터에 해당되기 때문이죠.

#평가, 예측
loss = model.evaluate(x,y)

result = model.predict([[10,31,0]])

 
 
 

이 코드는 x의 데이터와 y 의 데이터를 넣어줘서
 
0 0 0 0
0
0 0 0 0 0
0 0 0
 
위 구조의
레이어는 4개며
각 레이어마다
4 - 1 - 5- 3의 노드를 갖는
립러닝 모델을 만들고
이 모델을 학습시키게 됩니다.
 
 


 
조금 더 나가서 
딥러닝 모델이 학습하는 원리가 궁금하지 않으신가요?
 
지금도 극초반이지만(학원 4일차...)
막 이론설명을 할때 들은 내용으로는
 
y = wx + b
(bias는 지금은 0으로 치부하겠습니다...) 
 
이라는 함수 선이 있고,
y와 x에 데이터를 넣고
모델 자신이 예측한 값이랑 비교하며
(처음에는 랜덤데이터를 넣어줍니다.)
로스 차이를 줄여가며
w라는 가중치를 구한다고 합니다.
 
그럼 입출력 값이 달라지면 함수는
어떻게 달라질까요?
 
x의 값이 입력값이죠?
입력값이 2개면 x의 값도 2개가 되어
y = w ₁ x₁ w₂x₂ + b
가 되게 되고
 
입력값이 3개면
y = w₁x₁ w₂x₂ + w₃x₃ + b
이 되게 됩니다.
 
그렇다면 
출력값의 개수가 변경되면 어떻게 될까요??!
 
입력값이 3이라고 가정하고,
y의 출력데이터가 2개라면
 
y₁ = w₁x₁ w₂x₂ + w₃x₃ + b₁ 
y₂ = w₄x₁ w_5x₂ + w_6x₃ + b₂
(아래첨자 5,6,이 없어서 _5, _6으로 적었습니다.)
입력값은 동일하지만.
이렇게 각 출력값에 대한
가중치가 별개라는 것을 알 수 있습니다.
 
 
 
 
 

반응형