7JeY world
[Keras] ANN (인공신경망) - 1 본문
ANN
생체 신경망 구조와 유사하게 은닉 계층을 포함하는 인공 신경망 기술
필기체를 구분하는 분류 ANN 구현
- 1단계 : 케라스 패키지 2가지 모듈을 불러온다
from keras import layers, models
layer: 각 계층을 만드는 모듈
models : layer들을 연결하여 신경망 모델을 만든 후 컴파일, 학습시키는 역할
2단계 : 분류 ANN에 필요한 파라미터를 설정
Nin, Nh, number_of_class, Nout
입력 계층의 노드 수, 은닉 계층의 노드 수, 출력 값일 가질 클래스 수, 출력 노드 수
실제 정의는 main()안에서 진행 / 전역변수로 지정할 필요가 없다면 파라미터들을 시작 함수인 main()에 넣어준다.
3단계 : 모델링
분산방식 함수형 구현
x= layers.Input(shape=(Nin,))
입력 계층은 layers.Input()함수로 지정
원소를 Nin개 가지는 입력 신호 벡터는 입력 노드에 따른 계층의 shape을(Nin,)으로 지정한다.
은닉 계층의 노드
h = layers.Activation('relu')(layers.Dense(Nh)(x)
layers.Dense()로 지정
노드가 Nh개인 경우 은닉 계층을 layers.Dense(Nh)로 구성한다.
x를 입력으로 받아들이도록 layers.Dense(Nh)(x)로 지정한다.
Layers.Dense(Nh)는 layers.Dense 객체의 인스턴스이다.
객체를 함수처럼 사용할 수 있기 때문에 ()를 사용해 호출이 가능하다.
python은 객체를 만든 후에 함수처럼 사용할 수 있다.
def call(self,...)라는 멤버함수 사용하면 된다.
clasee Dense: def __call__(self, x): print(x)
>>> Dense()(1) 1
활성화 함수를 layers.Activation('relu')로 지정한다.
ReLU는 최근에 많이 사용되는 활성화 함수로 f(x) = max(x,0)과 같다.
입력 벡터인 x를 완전히 연결된 은닉 계층의 노드들로 모두 보내고 은닉 계층의 각 노드들은 ReLU로 활성화 처리 한 뒤에 다음 계층으로 내보낸다.
마지막은 출력 계층
y = layers.Activation('softmax')(layers.Dense(Nout)(h))
다중 클래스 분류를 ANN으로 구현하고 있으므로 출력 노드 수는 클래스 수(Nout)로 지정한다.
이때 출력 노드에 입력되는 정보는 은닉 노드의 출력값이다.
모델은 입력과 출력을 지정하여 만든다. 중간 계층들은 앞서 정의한 계층 간 신호의 연결 관계대로 자동 설정된다.
여기서 Model은 딥러닝 구조가 여러가지 딥러닝에 필요한 함수와 연계되도록 만드는 역할을 한다.
model.compile(loss='categorical_crossentropy',optimizer='adam',metrics=['accuracy'])
loss : 손실 함수를 지정하는 아규먼트
optimizer : 최적화 함수를 지정하는 아규먼트
metrix : 학습이나 예측이 진행될 때 성능 검증을 위해 정확도를 측정하라는 의미(손실 뿐만 아니라)
- 현재까지 작성된 코드
from keras import layers, models
def ANN_models_func(Nin, Nh, Nout):
x = layers.Input(shape=(Nin,))
h = layers.Activation('relu')(layers.Dense(Nh)(x))
y = layers.Activation('softmax')(layers.Dense(Nout)(h))
model = models.Model(x, y)
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
return model
케라스는 인공지능 모델을 연쇄 방식, 분산 방식으로 구현 할 수 있다.
- 분산 모델링 함수형
- 연쇄 모델링 함수형
- 분산 모델링 객체지향형
- 연쇄 모델링 객체지향형
다음은 분산방식 모델링 함수 구현을 하겠다!