티스토리 뷰

 

 

 

 

Simple ID array and slicing

In [5]:
# https://www.tensorflow.org/api_guides/python/array_ops
import tensorflow as tf
import numpy as np
import pprint
tf.set_random_seed(777)  # for reproducibility

pp = pprint.PrettyPrinter(indent=4)
sess = tf.InteractiveSession()
In [2]:
from PIL import Image
Image.open('kimbab.png')
Out[2]:
In [6]:
t = np.array([0., 1., 2., 3., 4., 5., 6])
 

1차원 array를 생성시킬 수 있다. 김밥을 보고 1차원 array라고 생각할 수 있다.
김밥 각 한덩이를 element라고 할 수 있고, 맨 왼쪽부터 0번째, 1번째,...라고 번호를 매길 수 있다.

In [7]:
pp.pprint(t)
print(t.ndim) # rank 몇 차원 array냐
print(t.shape) # shape 어떤 모양이냐
print(t[0], t[1], t[-1]) # 어떤 특정한 자리의 김밥을 먹고 싶다
print(t[2:5], t[4:-1]) # 김밥을 여러개 먹고싶다
print(t[:2], t[3:]) 
 
array([0., 1., 2., 3., 4., 5., 6.])
1
(7,)
0.0 1.0 6.0
[2. 3. 4.] [4. 5.]
[0. 1.] [3. 4. 5. 6.]
 

2D Array

In [9]:
t = np.array([[1., 2., 3.], [4., 5., 6.], [7., 8., 9.], [10., 11., 12.]])
pp.pprint(t)
print(t.ndim) # rank
print(t.shape) # shape
 
array([[ 1.,  2.,  3.],
       [ 4.,  5.,  6.],
       [ 7.,  8.,  9.],
       [10., 11., 12.]])
2
(4, 3)
 

Shape, Rank, Axis

In [10]:
t = tf.constant([1, 2, 3, 4])
tf.shape(t).eval()
Out[10]:
array([4])
In [14]:
t = tf.constant([[1, 2], 
                 [3, 4]])
tf.shape(t).eval()
Out[14]:
array([2, 2])
In [15]:
t = tf.constant([[[[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]], 
                  [[13, 14, 15, 16], [17, 18, 19, 20], [21, 22, 23, 24]]]])
tf.shape(t).eval()
Out[15]:
array([1, 2, 3, 4])
 

Matmul VS multiply

In [18]:
matrix1 = tf.constant([[1., 2.], [3., 4.]])
matrix2 = tf.constant([[1.],[2.]])
print("Metrix 1 shape", matrix1.shape)
print("Metrix 2 shape", matrix2.shape)
tf.matmul(matrix1, matrix2).eval()
 
Metrix 1 shape (2, 2)
Metrix 2 shape (2, 1)
Out[18]:
array([[ 5.],
       [11.]], dtype=float32)
In [19]:
(matrix1 * matrix2).eval() # 이런식으로 곱하면 잘못된 결과가 나옴
Out[19]:
array([[1., 2.],
       [6., 8.]], dtype=float32)
 

Broadcasting

 

유용한 기능이지만 잘못사용하면 독이 된다.

In [22]:
# Operations between the same shapes
matrix1 = tf.constant([[3., 3.]])
matrix2 = tf.constant([[2., 2.]])
(matrix1 + matrix2).eval()
Out[22]:
array([[5., 5.]], dtype=float32)
 

shape이 다르더라도 계산기 가능

In [23]:
matrix1 = tf.constant([[1., 2.]])
matrix2 = tf.constant(3.)
(matrix1+matrix2).eval()
Out[23]:
array([[4., 5.]], dtype=float32)
In [24]:
matrix1 = tf.constant([[1., 2.]])
matrix2 = tf.constant([3., 4.])
(matrix1 + matrix2).eval()
Out[24]:
array([[4., 6.]], dtype=float32)
In [25]:
matrix1 = tf.constant([[1., 2.]])
matrix2 = tf.constant([[3.],[4.]])
(matrix1+matrix2).eval()
Out[25]:
array([[4., 5.],
       [5., 6.]], dtype=float32)
 

Reduce mean

In [26]:
tf.reduce_mean([1,2], axis=0).eval()
Out[26]:
1
In [27]:
x = [[1., 2.],
     [3., 4.]]

tf.reduce_mean(x).eval()
Out[27]:
2.5
In [28]:
tf.reduce_mean(x, axis=0).eval()
Out[28]:
array([2., 3.], dtype=float32)
In [29]:
tf.reduce_mean(x, axis=1).eval()
Out[29]:
array([1.5, 3.5], dtype=float32)
In [30]:
tf.reduce_mean(x, axis=-1).eval() # 가장 안쪽에 대괄호 속에 있는 값의 평균
Out[30]:
array([1.5, 3.5], dtype=float32)
 

Reduce sum

In [31]:
x=[[1., 2.],
   [3., 4.]]
In [32]:
tf.reduce_sum(x).eval()
Out[32]:
10.0
In [33]:
tf.reduce_sum(x, axis=0).eval()
Out[33]:
array([4., 6.], dtype=float32)
In [34]:
tf.reduce_sum(x, axis=-1).eval()
Out[34]:
array([3., 7.], dtype=float32)
In [35]:
tf.reduce_mean(tf.reduce_sum(x, axis=-1)).eval()
Out[35]:
5.0
 

Argmax

 

가장 큰 것의 위치가 나온다.

In [36]:
x = [[0, 1, 2],
     [2, 1, 0]]
tf.argmax(x, axis=0).eval()
Out[36]:
array([1, 0, 0], dtype=int64)
In [37]:
tf.argmax(x, axis=1).eval()
Out[37]:
array([2, 0], dtype=int64)
In [38]:
tf.argmax(x, axis=-1).eval()
Out[38]:
array([2, 0], dtype=int64)
 

Reshape

 

가장 안쪽에 있는 3은 잘 안건든다.

In [39]:
t = np.array([[[0, 1, 2],
               [3, 4, 5]],
              [[6, 7, 8],
               [9, 10, 11]]])
t.shape
Out[39]:
(2, 2, 3)
In [40]:
tf.reshape(t, shape=[-1, 3]).eval()
Out[40]:
array([[ 0,  1,  2],
       [ 3,  4,  5],
       [ 6,  7,  8],
       [ 9, 10, 11]])
In [42]:
tf.reshape(t, shape=[-1, 1, 3]).eval() #랭크를 늘리고 싶다.
Out[42]:
array([[[ 0,  1,  2]],

       [[ 3,  4,  5]],

       [[ 6,  7,  8]],

       [[ 9, 10, 11]]])
 

Reshape(squeeze, expand)

In [43]:
tf.squeeze([[0], [1], [2]]).eval() # 안에 있는 값을 쭉 펼쳐준다.
Out[43]:
array([0, 1, 2])
In [44]:
tf.expand_dims([0, 1, 2], 1). eval() # 스퀴즈와 반대 기능, tensor의 shape을 변경하는 기능
Out[44]:
array([[0],
       [1],
       [2]])
 

One hot

In [45]:
tf.one_hot([[0], [1], [2], [0]], depth=3).eval()
Out[45]:
array([[[1., 0., 0.]],

       [[0., 1., 0.]],

       [[0., 0., 1.]],

       [[1., 0., 0.]]], dtype=float32)
In [46]:
t = tf.one_hot([[0], [1], [2], [0]], depth=3)
tf.reshape(t, shape=[-1, 3]).eval()
Out[46]:
array([[1., 0., 0.],
       [0., 1., 0.],
       [0., 0., 1.],
       [1., 0., 0.]], dtype=float32)
 

Casting

In [47]:
tf.cast([1.8, 2.2, 3.3, 4.9], tf.int32).eval() # float을 integer로 바꿈
Out[47]:
array([1, 2, 3, 4])
In [49]:
tf.cast([True, False, 1 == 1, 0 == 1], tf.int32).eval() # True, False를 1이나 0으로 바꿈
Out[49]:
array([1, 0, 1, 0])
 

Stack

 

축을 바꾼다

In [50]:
x = [1, 4]
y = [2, 5]
z = [3, 6]

# pack along first dim.
tf.stack([x, y, z]).eval()
Out[50]:
array([[1, 4],
       [2, 5],
       [3, 6]])
In [51]:
tf.stack([x, y, z], axis=1).eval()
Out[51]:
array([[1, 2, 3],
       [4, 5, 6]])
 

Ones and Zeros like

 

똑같은 shape의 0이나 1로 차있는 matrix를 만들 수 있다.

In [52]:
x = [[0, 1, 2],
     [2, 1, 0]]

tf.ones_like(x).eval()
Out[52]:
array([[1, 1, 1],
       [1, 1, 1]])
In [53]:
tf.zeros_like(x).eval()
Out[53]:
array([[0, 0, 0],
       [0, 0, 0]])
 

Zip

 

복수개의 tensor를 한번에 처리하고 싶다.

In [55]:
for x, y in zip([1, 2, 3], [4, 5, 6]):
    print(x, y)
 
1 4
2 5
3 6
In [56]:
for x, y, z in zip([1, 2, 3], [4, 5, 6], [7, 8, 9]):
    print(x, y, z)
 
1 4 7
2 5 8
3 6 9
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함