-
Data in TensorFlow | Advanced Learning AlgorithmMachine Learning/Stanford ML Specialization 2024. 2. 9. 10:59
NumPy와 TensorFlow에서 데이터가 어떻게 표현되는지 단계별로 설명해보자. 최근 코드가 처리되는 방식의 안타까운 점 하나는 NumPy가 수년전 처음 생성된 이후 Linear Algibra등의 Python 표준 라이브러리가 되었다. 이후 Andrew Ng과 구글 브레인팀이 TensorFlow를 만들었는데, 안타깝게도 NumPy와 텐서플로우에서 데이터가 표현되는 방식에는 약가느이 불일치가 있다. 그렇기 때문에 올바른 코드를 구현하고 Neural Network에서 실행되도록 하려면 이런 규칙을 숙지하는것이 좋다.
TensorFlow는 어떻게 데이터를 나타낼까? 이전에 Inference예시에서 쓰였던 커피 로스팅 예제에 다음과 같은 데이터셋이 있다고 가정해보자.
Temperature Duration Good Coffee? (1/0) 200.0 17.0 1 425.0 18.5 0 ... ... ... 이것을 데이터로 표현하려면 다음과 같이 생성해야한다.
x = np.array([[200.0, 17.0]])
왜 여기서 두개의 '[' 를 해주어야할까? 이것을 이해하기 위해 행렬(Matrix)을 살펴보자.
다음은 행(row) 2개, 열(column) 3개로 구성된 행렬이다. 이것을 우리는 2x3 Matrix라고 부른다.
1 2 3 4 5 6
이것을 저장하기 위해 다음과 같이 쓸 수 있다.
x = np.array([[1, 2, 3], [4, 5, 6]])
다른 예시를 보자. 행(row) 4개, 열(column) 2개로 된 행렬이다. 이는 4x2 행렬이다.
0.1 0.2 -3.0 -4.0 -0.5 -0.6 7 8
이 행렬은 NumPy로 아래와 같이 나타낼 수 있다.
x = np.array([[0.1, 0.2], [-3.0, -4.0], [-0.5, -0.6], [7.0, 8.0]])
다음과 같이 1D 또는 2D로 표현할 수 있다.
Linear Regresssion(선형 회귀)와 Logistic Regression(로지스틱 회귀)를 다룰 때는 1D 벡터를 사용해서 Feature를 표현하지만, TensorFlow에서는 Matrix, 즉 행렬을 사용해서 데이터를 표현하는 것이 관례이다. 왜 이런 규칙이 있을까? TensorFlow는 아주 큰 데이터 세트를 처리하도록 설계 되었는데, 데이터를 1D Array 대신 Matrix로 표현함으로, TensorFlow 내부에서 계산 효율이 더 높아진다.
Temperature Duration Good Coffee? (1/0) 200.0 17.0 1 다시 17분동안 200도로 로스팅한 원두 샘플 예시로 돌아가서, 이 것을 Matrix로 표현하면 다음과 같다.
x = np.array([[200.0, 17.0]])
하나의 예시임에도 불구하고, 1x2의 행렬을 이용했다. 다시 코드로 돌아가보자.
3개의 뉴런에 어레이를 넣어서 통과시킬 때, 다음과 같이 코드를 작성해서 layer2로 값을 보내게 된다.
x = np.array([[200.0, 17.0]]) layer_1 = Dense(units=3, activation='sigmoid') a1 = layer_1(x)
이렇게 생성된 a1에는 어떤 값이 포함되어있을까? 1x3 matrix가 아웃풋으로 생성되게 된다.
[[0.2, 0.7, 0.3]]
여기서 a1 값을 프린트 해보면, 다음과 같이 나오게 된다.
tf.Tensor([[0.2, 0.7, 0.3]], shape=(1, 3), dtype=float32)
즉, [[0.2, 0.7, 0.3]] 라는 행렬이 포함되어 있는데, 이것은 1 x 3 matrix이고, dtype은 어떤식의 데이터인지를 표현해준다. 여기서 Tensor란 무엇일까? TensorFlow에서 데이터를 효율적으로 관리하기 위해 생성한 데이터의 유형이다. 즉, 텐서를 볼때마다 이런 Matrix를 생각하면 된다. 그렇다면 NumPy 방식으로 이 데이터를 확인하면 어떨까?
a1.numpy()
array([[0.2, 0.7, 0.3]], dtype=float32)
NumPy 방식으로는 위와 같이 표현될 수 있다. 이 함수를 이용해서 Tensor Matrix를 Numpy 방식으로 변환할 수 있다.
자, 이제 a1 값을 갖고 두번째 레이어를 통과해보자.
layer_2 = Dense(units=1, activation='sigmoid') # Layer 2에 Tensor Array를 인풋으로 넣어주었다. a2 = layer_2(a1)
이 a2를 살펴보면 [[0.8]] 의 값이 들어가있다.
tf.Tensor([[0.8]], shape=(1, 1), dtype=float32)
이 Tensor Array를 numpy로 변환해보자.
a2.numpy()
array([[0.8]], dtype=float32)
이렇게 하면 다시 NumPy Array로 변환된다. NumPy로 데이터를 로드하고 데이터를 조작하는것에 익숙하다면 다행이지만, Tensor는 Tensor를 사용해야 효율적으로 작동한다. 두 라이브러리가 함께 잘 작동은 하지만, 추가 작업들을 해줘야하는점들이 있어서 유의해야 한다. 앞으로 NumPy 배열을 사용하든 Tensor를 사용하든, 서로 변환 할 때, 주의해야 한다.
Reference
Advanced Learning Algorithms
In the second course of the Machine Learning Specialization, you will: • Build and train a neural network with TensorFlow to perform multi-class ... 무료로 등록하십시오.
www.coursera.org
'Machine Learning > Stanford ML Specialization' 카테고리의 다른 글