정구리의 우주정복

[tensorflow] 텐서의 형 변환 (cast) , 슬라이싱 , concat , stack 본문

PYTHON/A.I

[tensorflow] 텐서의 형 변환 (cast) , 슬라이싱 , concat , stack

Jungry_ 2020. 9. 23. 16:40
반응형

1.  텐서의 형을 변환하는 Cast

import tensorflow as tf

#cast 를 써서 데이터의 형을 변환
a1 = tf.constant([[1.1,2,3],[4,5,6]]) #2*3
b1 = tf.constant([[10,11],[20,21],[30,31]])
#c1 = tf.cast(a1,tf.int32) #a1을 int32로 바꿔준다
d1 = tf.cast(b1,tf.float32)
print(d1)
print(tf.matmul(a1,d1))

a1 은 float32 형이고 b1 은 int32 형이다 이때 cast 를 사용해서 각 tensor 의 형을 바꿔 matmul 을 해보자 ( 형이 다르면 matmul 을 사용할 수 없기 때문에 꼭 형을 맞춰주도록 하자)

 

cast 의 사용 방법

tf.cast(변환할 텐서 , 바꾸고 싶은 자료형)

ex ) c1 = tf.cast(a1,tf.int32)  a1 을 int32 형으로 바꿔준다

 

>> tf.Tensor( [[10. 11.] [20. 21.] [30. 31.]], shape=(3, 2), dtype=float32)

tf.Tensor( [[141. 147.1] [320. 335. ]], shape=(2, 2), dtype=float32)

 

2. slicing

문자열을 잘라내는 것이 아니라 '일부만 복사한다' 라고 생각하는게 좋다 (원본은 남아있음) 

#tensorflow 의 slicing
#일부만 복사하기 : slice(원본 값은 있음) , 텐서들 합치기 : concat , stack
e1 = tf.constant([[10,11],[20,21],[30,31]])
g1 = tf.constant([[1,1],[2,2],[3,3]]) #e1 이랑 합쳐야징
f1 = tf.slice(e1,[1,0],[2,2])#(변수,시작지점(행렬)->시작 0부터인거 잊지 않기,사이즈(행렬)(두 행의 열 두개)) 
print(e1) #원본도 유지되는걸 알 수 있음
print(f1)

slicing 의 사용 방법 : 

- tf.slice(변수 , 시작지점(행렬) , 사이즈(행렬))

- 주의 해야할것은 시작지점은 0부터 시작한다는 것임

 

ex) f1 = tf.slice(e1,[1,0],[2,2])  

-> e1 을 1열 0행부터 2열 2행만큼 짜른다

e1 = tf.constant([[10,11],[20,21],[30,31]]) 일때 1열 0행은 '20' 을 시작으로 2열 2행만큼 잘랐으니 [20,21],[30,31] 이 된다

#이때 원본이 훼손되는 것이 아니라 그대로 남아있기 때문에 slicing 을 잘라내기 보다는 자른걸 복사해 놓는 다고 생각하는게 좋다

 

>>tf.Tensor( [[10 11] [20 21] [30 31]], shape=(3, 2), dtype=int32)

tf.Tensor( [[20 21] [30 31]], shape=(2, 2), dtype=int32)

 

3. concat 텐서 합치기

#텐서 합치기 concat,stack ,축 이라는 개념 등장
h1 = tf.concat([e1,g1],0)#(value , axis(축),name)  0 : 행을 기준으로 합침 1: 열을 기준으로 합침
i1 = tf.concat([e1,g1],1)
print(h1)
print(i1)

여기선 axis (축) 이라는 개념이 등장하는데 0은 행을 기준으로 합치는거고 1은 열을 기준으로 합치는거다

 

>>tf.Tensor( [[10 11] [20 21] [30 31] [ 1 1] [ 2 2] [ 3 3]], shape=(6, 2), dtype=int32)

tf.Tensor( [[10 11 1 1] [20 21 2 2] [30 31 3 3]], shape=(3, 4), dtype=int32)

4. stack 

얘도 행렬을 합쳐주는건데 차원을 하나 더 만들어준다 

 

#stack : 합치는건데 차원을 하나를 더 만들어 준다 
j1 = tf.stack([e1,g1],0)#(value,axis,)
k1 = tf.stack([e1,g1],1)
print(j1)
print(k1)

>>tf.Tensor( [[[10 11] [20 21] [30 31]] [[ 1 1] [ 2 2] [ 3 3]]], shape=(2, 3, 2), dtype=int32)

tf.Tensor( [[[10 11] [ 1 1]] [[20 21] [ 2 2]] [[30 31] [ 3 3]]], shape=(3, 2, 2), dtype=int32)

 

shape 가 (3,2,2) 가 된걸 확인할 수 있다

반응형
Comments