# AI 이론 36

TensorFlow Protocol Buffer

Protocol Buffer CSV,XML,JSON등 여러 직렬화 방식 중 하나로 구글에서 개발한 이진 직렬화 방식 직렬화(Serialization)란 직렬화란 시스템 내부에서 사용하는 개체를 다른 시스템에서도 사용할 수 있도록 바이트 형태로 데이터를 변환하는 기술을 뜻한다. 예를들면 Java,Python에서 사용하던 객체 방식과 Node.js에서는 형식이 다르기 때문에 모두가 같은 데이터를 사용하도록 공통화 작업을 한다고 생각하면 된다 ProtoBuf 사용순서 protoBuf 포맷으로 데이터 구조를 정의 컴파일하기(각 타겟 언어별 protoc 컴파일러 사용) 컴파일된 모듈 각 언어에서 코드레벨로 로드하기 ProtoBuf 파일 생성 %%writefile person.proto syntax = "proto..

규제를 사용해 과대적합 피하기

l1,l2규제 드롭아웃 앞선 글에서 배치 정규화를 통해 불안정한 그레이디언트 문제를 해결방안을 제시했습니다 이번 글에서는 신경망에서 널리 사용되는 다른 규제방법을 알아보겠습니다 L1,L2 규제 https://peaco.tistory.com/26?category=1253919 선형회귀(GD,Ridge,Lasso,ElasticNet) 선형회귀 및 경사하강법(배치 경사하강법, 미니배치 경사하강법, 경사하강법) 다항회귀 규제가 있는 선형 모델 선형회귀 입력 특성의 가중치 합과 편향 이라는 상수를 더해 예측을 만든다. y는 peaco.tistory.com 선형회귀에서 다루었던 것처럼 신경망의 연결 가중치를 제한하기위해 l2 규제를 사용하거나 (많은 가중치가 0인)희소모델을 만들기 위해 l1 규제를 사용했습니다. ..

배치 정규화

그래디언트 소실과 폭주 배치 정규화 그레이디언트 소실과 폭주문제 역전파 알고리즘은 출력층에서 입력층으로 오차 그레이디언틀르 전파하면서 진행합니다. 이때 알고리즘이 신경망의 모든 파라미터에 대한 오차 함수의 그레이디언트를 계산하면 경사 하강법 단계에서 이 그레이디언트를 사용하여 각 파라미터를 수정하게 됩니다. 그런데 알고리즘이 하위층으로 진행될수록 그레이디언트가 점점 작아지는 경우가 많아지는데, 경사 하강법이 하위층의 연결 가중치를 변경되지 않은 채로 둔다면 안타깝게도 훈련이 좋은 솔루션으로 수렴되지 않을 것 입니다. 이 문제를 그레이디언트 소실(vanishing gradient) 라고합니다. 위와 반대로 그레이디언트가 점점 커져서 여러 층이 비정상적으로 큰 가중치로 갱신되면 알고리즘은 발산합니다. 이 문..

케라스를 이용한 인공 신경망 만들기(하이퍼파라미터 튜닝)

신경망은 유연하다는 장점과 동시에 단점이 존재한다. 신경망의 유연성은 조정할 하이퍼파라미터가 많아진다는 단점이 존재한다. 아주 복잡한 네트워크 구조에서뿐만 아니라 간단한 다층 퍼셉트론에서도 조차 층의 개수, 층마다있는 뉴런의 개수, 각 층에서 사용하는 활성화 함수, 가중치 초기화 전략등 바꿀수 있는것이 매우많습니다.이때 어떤 하이퍼파라미터 조합이 문제의 최적인지 알수 있을까요? 이때 한가지 방법은 많은 하이퍼파라미터 조합을 시도해보고 어떤것이 검증 세트에서 가장 좋은 점수를 내는지 확인 해보는것입니다. GridSearchCV , RandomizedSearchCV를 통해 하이퍼 파라미터 공간을 탐색할 수 있습니다 이때, 케라스 모델을 사이킷런 추정기 처럼 보이도록 꾸며야 하는데, keras.wrappers..

케라스를 이용한 이미지 분류기 만들기

케라스란? 케라스는 모든 종류의 신경망을 손쉽게 만들고 훈련, 평가, 실행할 수 있는 고수준 딥러닝 API import tensorflow as tf import tensorflow import keras import numpy as np import pandas as pd import matplotlib.pyplot as plt 데이터셋을 적재(픽셀 강도는 0~255 바이트로 표현되어있습니다) (X_train_full, y_train_full), (X_test,y_test) = keras.datasets.mnist.load_data() X_train_full.shape # (60000,28,28) X_train_full.dtype # dtype('uint8') 전체 훈련 세트를 검증 세트와 더 작은 훈..

K-Means Clustering(K 평균 군집화) 정리

오늘날 대부분의 머신러닝 애플리케이션이 지도학습 기반이지만, 사용할 수 있는 데이터는 대부분 레이블이 존재하지 않습니다. 이러한 레이블이 없는 데이터에 숨겨진 패턴을 찾아내고 구조화하는 머신러닝 기법을 비지도학습(Unsupervised Learning)이라고 하는데, 비지도학습 알고리즘 중 가장 널리알려진 K-Means Clustering 알고리즘에 대해서 알아보겠습니다. 군집은 다음과 같은 다양한 애플리케이션에서 사용됩니다. 고객분류 데이터분석 차원 축소 기법 이상치 탐색 준지도 학습 검색 엔진 이미지 분할 등.. K-Means Clustering "K"는 주어진 데이터로부터 그룹화 할 그룹의 개수, 즉 클러스터의 개수 "Means"는 각 클러스터의 중심과 데이터들의 평균거리를 의미 센트로이드(cent..

주성분 분석(PCA)란?

차원의 저주란? 많은 경우 머신러닝 문제는 훈련 샘플이 각각 수천 심지어 수백만 개의 특성(Feature)을 가지고 있습니다. 이런 많은 특성은 훈련을 느리게 할 뿐만 아니라, 좋은 솔루션을 찾기 어렵게 만듭니다. 이런 문제를 차원의 저주(curse of dimensionality) 라고합니다. 이러한 문제를 해결하기 위해서는 차원을 줄여줘야 하는데, 이때 사용하는 방식이 PCA라는 차원축소 알고리즘 입니다. PCA는 비지도 변수 추출(Principal Component analysis) 비지도이므로 target 값 y는 사용되지 않는다. ▷ PCA,주성분 분석 분산을 최대로 유지하자! 가 핵심입니다. 사진을 보면 데이터 x1,x2의 분포 사진에 2개의 축이있습니다.(c1,c2) c1에 데이터를 사영(P..

선형회귀(GD,Ridge,Lasso,ElasticNet)

선형회귀 및 경사하강법(배치 경사하강법, 미니배치 경사하강법, 경사하강법) 다항회귀 규제가 있는 선형 모델 선형회귀 입력 특성의 가중치 합과 편향 이라는 상수를 더해 예측을 만든다. y는 예측값 n은 특성의 수 xi 는 i 번째 특성값 세타는 j번째 모델 파라미터 와 같이 표현이 가능하다. ▷ 선형 회귀 모델의 MSE 비용 함수 𝜽 값의 MSE(𝜽) 는 다음과 같이 표현할 수 있다. 이때 비용함수의 값을 최소화 하는 𝜽 를 얻을 수 있는 공식이 있는데, 다음과 같다. 경사 하강법 경사하강법 이란? 여러 종류의 문제에서 최적의 해법을 찾을 수 있는 일반적인 최적화 알고리즘 비용 함수를 최소화 하기 위해 반복해서 파라미터를 조정해 가는것 학습률이 너무 작으면 알고리즘이 수렴하기 위해 반복 횟수가 증가하므로 ..

밑바닥부터 시작하는 딥러닝3 내용정리

Class(Variable, Function) 전체 코드를 가져오기에는 길기 때문에 일부 부분씩을 캡쳐하여 정리함 ●Variable Variable 클래스 생성(params : 데이터,변수명,기울기,함수,현재의 세대) data : isinstance 메서드를 통해서 cupy,ndarray 인스턴스만을 받음 name : 이후 Layer 계층에서의 params.__dict__[name]의 형태로 호출 grad : gradient 로, Backpropagation 시 기울기를 저장 creator : input Data ----- Function ------ output Data 에서 , output Data는 Function에서 만들어진 것처럼, 자기자신의 생성자를 저장(해당 함수를 저장함) 데코레이터(@)를..

밑바닥부터 딥러닝3 - 고차 미분

Tanh(x) - 하이퍼볼릭 탄젠트의 고차미분 y = tanh(x) = (exp(x)+ exp(-x)) / (exp(x) + exp(-x)) 함수를 예시로 살펴보자. 이 함수의 미분형태를 살펴보면 ,1-y^2 으로 표현이 가능하다는 것을 알 수 있다. 이 함수를 간단하게 구현해보면, 이와 같은 코드가 된다. class Tanh(Function): def forward(self,x) : y = np.tanh(x) return y def backward(self,gy) : y = self.outputs[0]() gx = gy * (1- y*y) return gx def tanh(x): return Tanh()(x) 이때, 1차 미분 계산 그래프를 그려보면, import numpy as np from deze..

1 2 3 4