본문 바로가기

프로그래밍19

넘파이(numpy)에서 행렬 모양 바꾸기, 자르기, 확장하기 먼저 \(2 \times 3\) 행렬 \(A\)를 생성해 보자. \[ A = \begin{bmatrix} 1 & 2 & 3 \\ 4 & 5 & 6 \end{bmatrix} \] import numpy as np A = np.array([[1,2,3], [4,5,6]]) 이 행렬을 \(3 \times 2\) 로 바꾼 행렬 \(B\)를 만들려면 ndarray.reshape 라는 함수를 사용한다. \[ B = \begin{bmatrix} 1 & 2 \\ 3 & 4 \\ 5 & 6 \end{bmatrix} \] B = A.reshape((3,2)) print("A=",A, "\nB=",B) 소괄호가 두 개가 있음에 주의해야 한다. 성분의 배치 순서는 행렬 \(A\)의 첫 행의 처음부터 시작하여 오른쪽으로 가면서.. 2021. 3. 11.
넘파이(numpy)에서 행렬 생성 매트랩에 익숙한 사용자가 파이썬을 사용하게 되면 불편한 점이 몇 가지가 있는데 그 중에서도 가장 불편한 것이 행렬에 관한 것이 아닐까 싶다. 행렬 생성부터 시작하여, 부분 선택, 성분 바꾸기, 행렬 확장, 행렬 연산에 이르기까지 다 불편한 것 같다. 하지만 파이썬을 쓰려면 넘파이 스타일의 행렬에 익숙해져야 한다. 넘파이에서는 행렬을 어레이(array)로 부른다. 넘파이의 어레이 클래스는 ndarray이다. n-dimensional array란 뜻이다. 고차원 어레이가 기본인 모양이다. 차원(dimension)은 우리가 일반적으로 얘기하는 행렬의 차원이다. 예를 들어서 2차원 어레이는 \(N\)행과 \(M\)열로 이루어진 \(N \times M\) 행렬이다. 3차원 어레이는 행과 열, 그리고 깊이가 있는 .. 2021. 3. 11.
텐서와 변수 - 3 Tensorflow의 변수와 텐서와의 결정적인 차이는 가변성(mutability)이다. 변수는 값을 업데이트할 수 있지만, 텐서는 값을 변경할 수 없으며 새로운 텐서를 생성할 수 있을 뿐이다. 가변성이 무엇을 말하는지 구체적으로 알아보자. 다음 코드를 보자. a0 = tf.constant(2) a1 = a0 print(a0) print(a1) 이렇게 하면 a0라는 이름은 2라는 텐서 객체가 저장된 메모리의 위치를 가리킨다. a1도 a0와 동일한 메모리의 위치를 가리킨다. Output: tf.Tensor(2, shape=(), dtype=int32) tf.Tensor(2, shape=(), dtype=int32) 그런데 a1에 덧셈 연산을 하면 a1은 연산 결과인 3을 저장한 다른 메모리 위치를 가리킨다... 2021. 2. 11.
텐서와 변수 - 2 Tensorflow의 텐서는 일정한 데이터 타입(dtype이라고 함)을 가진 다차원 배열이다. numpy의 ndarray과 매우 유사하지만 변경이 불가능하다. 즉, 텐서는 생성된 후에는 변경할 수 없는 상수(constant)다. 모델에서 텐서를 추출할 수도 있지만 모델에 관계없이 직접 텐서를 생성할 수도 있다. 먼저 몇 가지 Tensorflow 함수를 이용해서 텐서를 생성해 보자. 다음은 tf.constant를 이용한 텐서의 생성 예다. a0 = tf.constant(2) a1 = tf.constant([1.0, 2.0]) a2 = tf.constant([[1, 2, 3], [4, 5, 6]]) a3 = tf.constant([ [ [1.0], [2.0] ], [ [3.0], [4.0] ], [ [5.0.. 2021. 2. 10.
텐서와 변수 - 1 신경망은 일종의 수학 함수다. 입력 데이터를 신경망에 주면 각 레이어를 거치면서 여러가지 연산을 거쳐서 출력 데이터가 산출된다. 신경망 모델에 입력과 출력이 있듯이 모델 내부의 각 레이어에도 입력과 출력이 있다. 각 레이어의 입력은 신경망의 가중치(weight) 또는 파라미터와 벡터/행렬 연산을 거쳐서 출력을 산출하게 된다. 신경망의 파라미터는 학습을 시작하면 최적화 알고리즘에 의해서 그 값이 변경되고 반복적으로 업데이트 된다. 이와 같은 반복적인 업데이트를 통해서 목적함수를 최적화하도록 신경망의 파라미터를 계산하는 것이 딥러닝의 핵심이다. 텐서(tensor)는 Tensorflow에서 사용하는 데이터 구조로서 다차원 배열(n-dimensional array)이다. Tensorflow 프로그램에서는 모든 .. 2021. 2. 9.
GradientTape로 간단한 CNN 학습하기 Sequential API와 Functional API 그리고 Model Subclassing API를 이용하여 CNN을 구현해 보았다. 이번에는 model.compile 로 모델을 컴파일하고 model.fit 로 학습하는 대신에 모델에 손실함수와 옵티마이저를 직접 엮어 넣고, tf.GradientTape 를 사용하여 CNN을 학습해 보도록 하겠다. 전과 똑같이 데이터셋은 Fashion_MNIST이고 CNN모델도 전과 똑같으며 Model Subclassing API로 구축한 것이다. model.compile 로 모델을 컴파일하는 부분은 다음과 같았다. model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accu.. 2021. 1. 11.
Model Subclassing API로 간단한 CNN 구현해 보기 Sequential API와 Functional API에 이어서 이번에는 Model Subclassing API를 이용하여 CNN을 구현해 보자. Model Subclassing API는 자유도가 제일 높은 모델 구축 방법으로서 사용자 자신의 방법으로 신경망을 학습시킬 수도 있다. 딥러닝을 깊게 공부하려면 반드시 알아야 할 API다. MNIST 숫자 분류 대신에 Fashion_MNIST 데이터셋을 이용해 보기로 한다. MNIST는 손글씨였지만 Fashion_MNIST는 신발, 가방, 옷 등의 흑백 그림을 모아 놓은 데이터셋이다. 텐서플로2에서는 Fashion_MNIST 데이터셋도 쉽게 다운로드할 수 있다. fashion_mnist = tf.keras.datasets.fashion_mnist (x_trai.. 2021. 1. 11.
Functional API로 간단한 CNN 구현해 보기 Functional API는 여러 개의 입력과 출력이 있는 모델을 포함하여 보다 유연한 모델을 구축할 때 사용하며 ResNet과 같이 순차적이지 않은 모델도 구축할 수 있다. 또한 Functional API에서는 모델 내부의 특정 레이어(layrer)에 접근하여 웨이트(weight)과 바이어스, 그리고 레이어의 입출력 텐서 등을 쉽게 추출할 수 있다. 만들고자 하는 CNN 모델은 Sequential API로 만든 것과 똑같다. Functional API에서는 첫번째 레이어가 tf.keras.layers.Input 이어야 한다. 맨 마지막에 tf.keras.Model 을 호출하여 모델의 입력 레이어와 출력 레이어를 인수로 넣어주면 모델이 완성된다. input_shape = (28,28,1) img_inpu.. 2021. 1. 11.
Sequential API로 간단한 CNN 구현해 보기 TensorFlow2에서 제공하는 모델 구현 API는 크게 3가지 종류가 있다. 신경망 레이어를 순차적으로 쌓아 나가는 방식의 Sequential API, 레이어를 함수형태로 정의하는 Functional API, 그리고 클래스 형으로 모델을 만들 수 있는 Model Subclassing API다. Sequential API는 간단한 모델을 쉽게 구축할 수 있으며, 빈 깡통 모델을 만들어 놓고 순차적으로 레이어를 추가하거나 한꺼번에 순차적인 모델을 구축할 수 있다. Functional API는 복잡한 모델을 구축할 때 유리하며 ResNet과 같이 순차적이지 않은 모델도 구축할 수 있다. Model Subclassing API는 자유도가 제일 높은 모델 구축 방법으로서 사용자 자신의 방법으로 신경망을 만들고.. 2020. 7. 17.