[Tensorflow] 5. 스칼라, 벡터, 행렬, 텐서
저희가 사용하고 있는
Tensorflow API 이름의 뜻을 알고 계신가요??
Tensor의 flow, 텐서(Tensor)의 흐름이라고 합니다.
그럼 이 Tensor가 뭘까요?
어려운 주제지만
해당 포스트는 딥하지 않습니다.
아직 딥하게 배우지는 않았거든요...
(더 들어갔으면 포기할뻔했습니다...)
텐서플로우에서 실습한
오늘 배운 내용을 개념 위주로
데이터에 대해
간단히
정리해보겠습니다.
0. shape
일단 데이터의 구조를
확인하기 위해서
numpy의 shape라는 함수를 이용할 것입니다.
아래와 같이 numpy를 Import 해서 사용할 수 있습니다.
import numpy as np
np.array([1,2,3]).shape
1. 스칼라
스칼라가 모여 벡터가 되고,
벡터가 모여 행렬이 되고,
배열이 모여 텐서가 된다고 합니다.
이들 데이터 중 가장 작은 단위입니다.
수학에서는 상수라고 보시면 되겠네요.
얘는 0차원 데이터입니다.
우선 "1" 이라는 값을 생각해주세요.
numpy의 shape 이용해서 구조를 살펴보면
() <<가 찍힙니다.
아무 구조를 갖지 못하는
0차원이라는 거죠.
import numpy as np
x0 = np.array(1)
print('x0: ', x0.shape) #x0: ()
2. 벡터
아까 스칼라를 0차원 데이터라고 했죠?
벡터는 1차원 데이터입니다.
아까 스칼라가 "1" 이라고 했다면
이 "1" 이 두개 모여
[1,1] 이 될 수도 있고
4개 모여
[1,1,1,1]이 될 수도 있겠네요.
스칼라가 모인 것이 바로 벡터입니다.
마찬가지로 numpy를 이용해서
shape상수로 찍어보면
스칼라가 3개 모인 벡터는
(3,) 이라고 찍히네요.
1차원 데이터의 출력 모습입니다.
x1 = np.array([1,2,3])
print('x1: ', x1.shape) #x1: (3,)
3. 행렬
스칼라 "1"이 두개가 모여 벡터 [1,1]이 되었고
다른 벡터 [1,1]을 만나면 행렬이 됩니다.
벡터의 모임 = 행렬입니다.
차원으로는 2차원이에요.
열은 쉽게 말해 엑셀에서 분류 개수
(어렵게 말해서 한 벡터 내의 스칼라의 개수)
이구요,
행은 쉽게 말해 엑셀에서 줄 개수
(어렵게 말해서, 벡터의 개수)
가 됩니다.
(저는 이렇게 이해했숩니다......)
마찬가지로 shape함수로 찍어보면
요렇게 행과 열을 확인할 수 있습니다.
x2 = np.array([[1,2,3]])
print('x2: ', x2.shape) #x2: (1, 3)
x3 = np.array([[1,2],[3,4]])
print('x3: ', x3.shape) #x3: (2, 2)
x4 = np.array([[1,2],[3,4],[5,6]])
print('x4: ', x4.shape) #x4: (3, 2)
4. 텐서
이제 아시겠죠?
텐서플로우의 텐서는 행렬의 모임입니다.
2차원 데이터가 모여 만든
3차원...이후 데이터
4차원 데이터도 되며
5차원 데이터도 되는
3차원 이상의 n차원 데이터가 되겠습니다.
저희는 이제 이 다차원의 데이터를 활용해서
인공지능 학습을 진행하게 되는거죠.
이제 shape함수의 진면모가 발동하는데요~~
아래와 같이 복잡한 차원의 데이터 구조를
깔끔하게 볼 수 있게 해주네요.
numpy.... 사랑합니다...
(텐서,배열, 행, 열) ==> 텐서 형식으로 출력이 잘 됩니다.
x5 = np.array([[[1,2],[3,4],[5,6]]])
print('x5: ', x5.shape) #x5: (1, 3, 2)
x6 = np.array([[[1,2],[3,4]],[[5,6],[7,8]]])
print('x6: ', x6.shape) #x6: (2, 2, 2)
x7 = np.array([[[[1,2,3,4,5,],[6,7,8,9,10]]]])
print('x7: ', x7.shape) #x7: (1, 1, 2, 5)
x8 = np.array([[[[1]]],[[[2]]]])
print('x8: ', x8.shape) #x8: (2, 1, 1, 1)
numpy를 사용해 스칼라, 백터, 행렬, 텐서를 찍어본
전체 코드입니다.
import numpy as np
x0 = np.array(1)
print('x0: ', x0.shape) #x0: ()
x1 = np.array([1,2,3])
print('x1: ', x1.shape) #x1: (3,)
x2 = np.array([[1,2,3]])
print('x2: ', x2.shape) #x2: (1, 3)
x3 = np.array([[1,2],[3,4]])
print('x3: ', x3.shape) #x3: (2, 2)
x4 = np.array([[1,2],[3,4],[5,6]])
print('x4: ', x4.shape) #x4: (3, 2)
x5 = np.array([[[1,2],[3,4],[5,6]]])
print('x5: ', x5.shape) #x5: (1, 3, 2)
x6 = np.array([[[1,2],[3,4]],[[5,6],[7,8]]])
print('x6: ', x6.shape) #x6: (2, 2, 2)
x7 = np.array([[[[1,2,3,4,5,],[6,7,8,9,10]]]])
print('x7: ', x7.shape) #x7: (1, 1, 2, 5)
x8 = np.array([[1,2,3],[4,5,6]])
print('x8: ', x8.shape) #x8: (2, 3)
x9 = np.array([[[[1]]],[[[2]]]])
print('x9: ', x9.shape) #x9: (2, 1, 1, 1)
그럼 여기 계속해서 살을 붙이고 있는
딥러닝 코드에
차원 데이터를 넣어준 모습은 어떻게 될까요?
https://aigaeddo.tistory.com/7
4) 모델 구조, batch_size 바꿔보기
저는 학원에서 tensorflow를 배우고 있습니다. 학습 내용을 기록하고 학습하고 공유해보려고 합니다. 저번 포스팅에서는 초급 딥러닝 코드를 작성해 보았습니다만 아직 배울 개념들이 엄청나게 쌓
aigaeddo.tistory.com
전체 코드 첨부 먼저하겠습니다!
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]
]
)
y = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
print(x.shape) # (2,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, 2)
# 2. 모델 구성
model = Sequential()
model.add(Dense(1, input_dim = 2)) #input 데이터는 2차원.
model.add(Dense(64))
model.add(Dense(128))
model.add(Dense(64))
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]]) #!!!!입력과 같은 열을 맞춰줘야함
print("[10, 1.3]의 예측값 : ", results)
원래는 (10,2),,,
즉 데이터의 종류가 2개고 각 데이터의 개수가 10개인
행렬 데이터를 넣어줘야 맞는데요,
이게 가상으로 데이터를 넣다보니
(2,10)의 포멧의 행렬 데이터를 일단 넣게 되었습니다..
그리고 이 데이터를 행과 열을 바꿔주는
전치작업을 해주었습니다.
전치 방식은 총 3가지입니다.
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]
]
)
y = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
print(x.shape) # (2,10)
print(y.shape) # (10,)
# x = x.T #전치. 행과 열을 바꿔줌.
# x = x.transpose()
x = x.swapaxes(0,1)
2차원 배열을 데이터로 설정해줘서
입력값을 2로 설정해주었습니다.
# 2. 모델 구성
model = Sequential()
model.add(Dense(1, input_dim = 2)) #input 데이터는 2차원.
model.add(Dense(64))
model.add(Dense(128))
model.add(Dense(64))
model.add(Dense(1))
여기서 조심 또 조심할게
predict 즉, 예측값을 입력할 때
입력과 같은 열(컬럼, 차원...등등)으로 맞춰줘야 한다는 겁니다!
아니면 에러가 나게 됩니다.
#4.평가, 예측
loss = model.evaluate(x,y)
results = model.predict([[10, 1.3]]) #!!!!입력과 같은 열을 맞춰줘야함
이번 포스팅에서는 데이터 구성에 대해서
미미하게나마 학습해보았습니다.
혹시 틀린점이 있다면 말씀해주세요!
궁금하신점도 언제나 환영입니다~