1D CNN을 구성하는 방법에 대한 설명을 제공하는 기사는 거의 없고, 마침 내가 쓰려는 코드에 1D conv가 적용되어 정리 겸 글을 올린다.
CNN은 데이터 내의 간단한 패턴을 식별하는데 적합하고 이는 상위 계층으로 적용되어 복잡한 패턴을 형성하는데 도움이 된다.
1D CNN는 언제 사용해야 할까?
A 1D CNN is very effective when you expect to derive interesting features from shorter (fixed-length) segments of the overall data set and where the location of the feature within the segment is not of high relevance.
1D CNN은 전체적인 데이터셋의 고정된 길이의 조각으로 부터 흥미로운 특징을 도출할거로 예상하고 세그먼트내 피쳐의 위치가 관련성이 높지않을때???
아직은 잘 모르겠어서 계속 보자
1D CNN과 2D CNN의 차이점은 무엇인가?
CNN은 1D, 2D 또는 3D에 관계없이 동일한 특성을 공유하고 동일한 접근 방식을 따른다. 주요 차이점은 입력 데이터의 차원과 feature detector(또는 필터)가 데이터에서 이동하는 방식이 다르다.
예를 들어보자,
허리에 메고 다니는 스마트폰에서 나오는 시간 분할 가속도계 센서 데이터에 초점을 맞출 것이며, x,y 및 z 축의 가속도계 데이터를 기반으로 1D CNN은 걷기, 조깅, 서있음 등을 예측해야한다.
model_m = Sequential()
model_m.add(Reshape((TIME_PERIODS, num_sensors), input_shape=(input_shape,)))
model_m.add(Conv1D(100, 10, activation='relu', input_shape=(TIME_PERIODS, num_sensors)))
model_m.add(Conv1D(100, 10, activation='relu'))
model_m.add(MaxPooling1D(3))
model_m.add(Conv1D(160, 10, activation='relu'))
model_m.add(Conv1D(160, 10, activation='relu'))
model_m.add(GlobalAveragePooling1D())
model_m.add(Dropout(0.5))
model_m.add(Dense(num_classes, activation='softmax'))
print(model_m.summary())
최종 예측하려는 class 6개의 클래스("조깅", "앉기", "걷기", "서기", " 위층","아랫층") 6개
연산량 6*160 + 6(bias) -> 출력값은 6개 클래스 각각에 대한 확률
이렇게 뽑은 것으로 학습하고 테스트를 하면 된다.
핵심은 1D conv는 2D conv와 동일한 접근 방식을 가지며, 다만 필터를 이동시킬 수 있는 축이 한개밖에 없고(x,y 가아닌 x 또는 y)고정된 길이에서 피쳐를 뽑지만 거리간의 관계(거리정보)가 그렇게 중요하지 않을 때 사용한다.