반응형

그림 참고 1:

Early Warning Model of Wind Turbine Front Bearing Based on Conv1D and LSTM | IEEE Conference Publication | IEEE Xplore

그림 참고 2:

Understanding 1D and 3D Convolution Neural Network | Keras | by Shiva Verma | Towards Data Science

 


1. 데이터셋 가정

0. 가속도계 데이터셋 가정

Batch size : 100000

Sequence : 10

Feature : 3 (x-axis, y-axis, z-axis)

 

Dataset shape : (100000, 10, 3) = (Batch size, Sequence, Feature) = (B, S, F)

 


2. 모델 구성

1. 모델 구성

1. Conv1D

  CNN은 convolution layer, pooling layer, fully connected layer로 주로 구성된다. 그 중 convolution layer와 pooling layer는 두 개의 특수 신경망 레이어로 주로 유효 특징 추출을 담당한다. 원본 데이터에서 벡터를 추출하고 원본 기능의 공간적 정보를 마이닝할 수 있다. 가속도계와 같은 1차원 데이터를 1차원 컨볼루션 신경망(Conv1D)을 사용하여 서로 다른 변수를 결합하고 변수 간의 공간적 상관 관계를 추출한다.

 

2. Conv1D

  Conv1D는 그림 2와 같이 한 차원에 대해 커널 슬라이딩을 통해 공간적 상관 관계를 추출한다.

 

 

2. LSTM

  LSTM은 시계열 데이터를 처리하기 위한 고전적인 딥 러닝 네트워크이다. 순환 신경망이 긴 시계열을 어느 정도 처리할 때 기울기 소실(Vanishing gradient) 문제를 해결하는 순환 신경망의 변형입니다. 장기 및 단기 기억 네트워크의 셀 구조는 그림 3과 같이 망각 게이트, 입력 게이트 및 출력 게이트가 있다.

3. LSTM

 

  3. Conv1D + LSTM 

  Conv1D + LSTM 모델은 그림 1과 같이 Conv1D 기반의 특징 융합 레이어, LSTM 기반 시계열 예측 레이어, output layer로 구성된다. Input layer에는 그림 0과 같은 시공간적 특성행렬이 입력된다. 각 변수는 CNN에 의해 ​​가중치가 부여되고 변수 간의 정보가 결합된다. 과적합(Overfitting)을 피하기 위해 dropout layer가 네트워크에 추가됩니다. 모델 파라미터는 그림 4와 같이 구성한다.

 

4. 모델 파라미터

 

모델을 구성하게 되면 아래의 코드와 같이 구현할 수 있다. 

import torch.nn as nn


class Conv1d_LSTM(nn.Module):
    def __init__(self, in_channel=3, out_channel=1):
        super(Conv1d_LSTM, self).__init__()
        self.conv1d_1 = nn.Conv1d(in_channels=in_channel,
                                out_channels=16,
                                kernel_size=3,
                                stride=1,
                                padding=1)
        self.conv1d_2 = nn.Conv1d(in_channels=16,
                                out_channels=32,
                                kernel_size=3,
                                stride=1,
                                padding=1)
        
        self.lstm = nn.LSTM(input_size=32,
                            hidden_size=50,
                            num_layers=1,
                            bias=True,
                            bidirectional=False,
                            batch_first=True)
        
        self.dropout = nn.Dropout(0.5)

        self.dense1 = nn.Linear(50, 32)
        self.dense2 = nn.Linear(32, out_channel)

    def forward(self, x):
	# Raw x shape : (B, S, F) => (B, 10, 3)
        
        # Shape : (B, F, S) => (B, 3, 10)
        x = x.transpose(1, 2)
        # Shape : (B, F, S) == (B, C, S) // C = channel => (B, 16, 10)
        x = self.conv1d_1(x)
        # Shape : (B, C, S) => (B, 32, 10)
        x = self.conv1d_2(x)
        # Shape : (B, S, C) == (B, S, F) => (B, 10, 32)
        x = x.transpose(1, 2)
        
        self.lstm.flatten_parameters()
        # Shape : (B, S, H) // H = hidden_size => (B, 10, 50)
        _, (hidden, _) = self.lstm(x)
        # Shape : (B, H) // -1 means the last sequence => (B, 50)
        x = hidden[-1]
        
        # Shape : (B, H) => (B, 50)
        x = self.dropout(x)
        
        # Shape : (B, 32)
        x = self.fc_layer1(x)
        # Shape : (B, O) // O = output => (B, 1)
        x = self.fc_layer2(x)

        return x

 

728x90
반응형
반응형

오늘은 자신이 직접 디자인한 딥러닝 모델을 시각화하는 작업을 해보겠습니다. 

 

우선, Pytorch로 구현된 모델을 ONNX로 저장해야 합니다. 

 

Pytorch로 ONNX로 저장하기 위해서 아래 명령어를 통해 설치합니다.

pip install onnx-pytorch

설치를 완료 후, 자신이 구현한 모델의 객체가 있다면, 아래 코드를 통해 모델을 저장합니다. 

import torch.onnx


input_names = ['Time series data']
output_names = ['Output']

x = torch.zeros(1, 10, 6).to(device)
torch.onnx.export(model, x, 'regression_mode.onnx', input_names=input_names, output_names=output_names)

 

이제 모델 시각화 프로그램인 Netron을 git을 통해 설치합니다. 

https://github.com/lutzroeder/netron

 

GitHub - lutzroeder/netron: Visualizer for neural network, deep learning, and machine learning models

Visualizer for neural network, deep learning, and machine learning models - GitHub - lutzroeder/netron: Visualizer for neural network, deep learning, and machine learning models

github.com

설치를 하게 되면, 방금 저장한 모델이 아래와 같이 보입니다.

위 ONNX파일을 들어가게 되면, 시각화된 모델 아키텍처를 확인할 수 있습니다. export를 통해 쉽게 이미지 파일로 불러올 수 있고, 기본은 Vertical이라 세로로 길지만, Horizontal을 통해 가로로 시각화 할 수 있습니다.

Vertical
Horizontal

 

728x90
반응형
반응형

올바른 분류 모델을 학습시키기 위해 데이터셋을 골고루 분할하는 것이 중요하다. 

 

https://github.com/ewine-project/UWB-LOS-NLOS-Data-Set

 

GitHub - ewine-project/UWB-LOS-NLOS-Data-Set: Repository with UWB data traces representing LOS and NLOS channel conditions in 7

Repository with UWB data traces representing LOS and NLOS channel conditions in 7 different indoor locations. - GitHub - ewine-project/UWB-LOS-NLOS-Data-Set: Repository with UWB data traces represe...

github.com

 

예를 위해 위 Github에서 0과 1로 이루이진 이진 클래스 데이터 셋이 있다. 이 글은 데이터를 라벨에 맞게 골고루 분리하는 것이므로 데이터 분석은 따로 하지 않는다. 

 

csv 파일은 7개이며, 총 데이터의 개수는 42000개이다.  

sklearn 라이브러리에서 train_test_split을 사용하면 간단히 데이터를 분할할 수 있다. 아래 코드에서 간단히 데이터셋을 불러올 수 있다. 이 데이터셋의 경우 nlos가 클래스(혹은 정답 데이터)이다. 아래의 그림을 보게 되면 0, 1, 0, 1, 1...로 무작위로 정렬돼었다. 각 클래스의 개수를 출력하면, 21000개를 확인할 수 있다.

import uwb_dataset
import pandas as pd


columns, data = uwb_dataset.import_from_files()

for item in data:
	item[15:] = item[15:]/float(item[2])

print("\nColumns :", columns.shape, sep=" ")
print("Data :", data.shape, sep=" ")
print(type(data))

df_uwb = pd.DataFrame(data=data, columns=columns)
print(df_uwb.head(10))

los_count = df_uwb.query("NLOS == 0")["NLOS"].count()
nlos_count = df_uwb.query("NLOS == 1")["NLOS"].count()

print("Line of Sight Count :", los_count)
print("Non Line of Sight Count :", nlos_count)

"""
결과
./dataset/uwb_dataset_part5.csv
./dataset/uwb_dataset_part7.csv
./dataset/uwb_dataset_part2.csv
./dataset/uwb_dataset_part3.csv
./dataset/uwb_dataset_part4.csv
./dataset/uwb_dataset_part1.csv
./dataset/uwb_dataset_part6.csv

Columns : (1031,)
Data : (42000, 1031)
<class 'numpy.ndarray'>

Line of Sight Count : 21000
Non Line of Sight Count : 21000
"""

 

결과

파이썬으로 개발을 하면서 느낀 것은 최대한 반복문을 지양하고 라이브러리를 사용하는 것이다. 파이썬은 빠르게 데모 프로그램 구현에 많이 사용하는데 라이브러리가 이를 가능케 한다. 그리고 가장 큰 이유는 내가 만든 코드는 절대 라이브러리를 이길 수 없다는 것이다.  이번에 사용하고자 하는 train_test_split은 sklearn 라이브러리의 함수이다. sklearn는 머신러닝 대표 라이브러리이지만 딥러닝 사용에 있어 문제가 없다.   

 

train_test_split : 배열 또는 행렬을 무작위 학습 및 테스트 하위 집합으로 분할.

 

 -test_size : 0~1 사이의 값으로, 기본 test size는 0.25로 자동으로 train size는 0.75이다. 아래의 그림처럼 데이터를 분할.

- random_state : shuffle 제어하는 인자이다. 모델의 성능을 향상시키기 위해 다양한 방법으로 모델을 디자인한다. 하지만 공정한 검증을 위해 똑같은 데이터셋을 필요로 한다. 그 때 사용하는 인자이다. 

- shuffle : 분리하기 전에 데이터를 섞을지 여부. 

- stratify : 가장 중요한 파라미터. 클래스에 맞게 골고루 분할할지 여부. 

from sklearn.model_selection import train_test_split


x_train, x_test, y_train, y_test = train_test_split(
    df_uwb[["CIR"+str(i) for i in range(cir_n)]].values,
    df_uwb['NLOS'].values,
    test_size=0.2,
    random_state=42,
    shuffle=True,
    stratify=df_uwb['NLOS'].values)
    
print("x_train shape :", x_train.shape, y_train.shape)
print("x_test shape :", x_test.shape, y_test.shape)

print("Train NLOS 0 count :", len(y_train[y_train==0]))
print("Train NLOS 1 count :", len(y_train[y_train==1]))
print("Test NLOS 0 count :", len(y_test[y_test==0]))
print("Test NLOS 0 count :", len(y_test[y_test==1]))

"""
x_train shape : (33600, 1016) (33600,)
x_test shape : (8400, 1016) (8400,)

Train NLOS 0 count : 16800
Train NLOS 1 count : 16800
Test NLOS 0 count : 4200
Test NLOS 0 count : 4200
"""

728x90
반응형
반응형

안녕하세요.

 

전 글은 주피터 노트북을 이용하여 딥러닝 서버를 만드는 글을 올렸습니다.

 

그 과정에서 주피터 노트북의 테마를 변경하였고, 확장 프로그램을 이용하여 이것저것 패키지를 추가했습니다.

하지만 주피터 노트북 테마의 툴바와 확장 프로그램에서 Table of Contents이 겹쳐서 오류는 아니지만 아래의 사진과 같이 됩니다. 

 

툴바에 가려 위 글이 가려 집니다. 

 

위 문제를 해결하기 위해서 주피터 노트북의 CSS를 건들여야 합니다. 어렵지 않으니 그대로 따라하시면 됩니다. 

 

C:\Users\{"사용자 이름"}\.jupyter\custom

 

주피터 노트북 테마를 설치했다면, .jupyter 디렉토리에 custom 폴더가 생성되있습니다.

 

custom 폴더에 custom.css가 있습니다.

custom

custom.css를 열어 아래처럼 주석 처리합니다. ( div의 maintoolbar )

/* 
div#maintoolbar {
 position: absolute;
 width: 90%;
 margin-left: -10%;
 padding-right: 8%;
 float: left;
 background: transparent !important;
}
#maintoolbar {
 margin-bottom: -3px;
 margin-top: 0px;
 border: 0px;
 min-height: 27px;
 padding-top: 2px;
 padding-bottom: 0px;
}
#maintoolbar .container {
 width: 75%;
 margin-right: auto;
 margin-left: auto;
}
*/

주피터 노트북을 다시 실행시킵니다.

위 처럼 툴바가 고정되어 더 이상 윗 부분을 가리지 않습니다. 

 

만약 저와 같이 따라 하셨다면, 참고하시면 좋을 것 같습니다. 

 

https://coding-yoon.tistory.com/152

 

주피터 노트북 개인 딥러닝 서버 만들기 ! (1) with Window10, Pytorch

이번에 컴퓨터를 맞추면서 그래픽카드 RTX 2060 super를 구매했습니다. 저만의 딥러닝 서버를 만들어 놓으면 어디서든 야외에서 노트북으로 가볍게 작업할 수 있습니다. ( 얼마나 작업을 할지 모르

coding-yoon.tistory.com

https://coding-yoon.tistory.com/153

 

주피터 노트북 개인 딥러닝 서버 만들기 ! (2) with Window10, Pytorch

안녕하세요. 주피터 노트북 개인 딥러닝 서버 만들기 2편입니다. 이번 글은 주피터 노트북을 좀 더 유용하고 보기 좋게 만들기 위한 편입니다. 굳이 안 하시고 넘어가셔도 무방합니다. ~ 1. 주피

coding-yoon.tistory.com

https://coding-yoon.tistory.com/154

 

주피터 노트북 개인 딥러닝 서버 만들기 ! (3) with Window10, Pytorch

안녕하세요. 만약 여기까지 따라 오셨다면 90% 정도 성공입니다. 나머지 10%는 Pytorch만 설치하면 됩니다. 굉장히 간단합니다. 아래 Pytorch 공식 사이트를 들어 갑니다. https://pytorch.org/ PyTorch An open s.

coding-yoon.tistory.com

 

728x90
반응형
반응형

안녕하세요. 

 

만약 여기까지 따라 오셨다면 90% 정도 성공입니다. 나머지 10%는 Pytorch만 설치하면 됩니다. 굉장히 간단합니다. 

 

아래 Pytorch 공식 사이트를 들어 갑니다. 

https://pytorch.org/

 

PyTorch

An open source machine learning framework that accelerates the path from research prototyping to production deployment.

pytorch.org

아래로 쭉 내리시면,

위 사진처럼 있습니다. 

 

그런데 Run this Command를 그대로 복붙해서 설치하면 됩니다. 

 

Pytorch : 1.9

OS : Window10

Package : Anaconda

Language : Python

Compute Platform : CUDA 10.2

 

왜 CUDA 최신 버전을 사용하지 않고, CUDA 10.2로 사용하는지 의문이 들 수 있습니다. 

 

CUDA 11.1을 사용하기 위해서 CUDA TOOLKIT이 필요합니다. CUDA TOOLKIT을 설치하고 경로 설정하는 것이 굉장히 귀찮은 일이기 때문에, CUDA 10.2를 사용하면 TOOLKIT을 설치하지 않고 바로 사용할 수 있습니다.

import torch

# torch version
torch.__version__
#  1.9

#  Returns a bool indicating if CUDA is currently available.
torch.cuda.is_available()
#  True
 
#  Returns the index of a currently selected device.
torch.cuda.current_device()
#  0
 
#  Returns the number of GPUs available.
torch.cuda.device_count()
#  1
 
#  Gets the name of a device.
torch.cuda.get_device_name(0)
#  NVIDIA GeForce RTX 2060 SUPER
 
#  Context-manager that changes the selected device.
#  device (torch.device or int) – device index to select. 
torch.cuda.device(0)

 

 

Pytorch GPU가 준비 되었으니, 전에 만들어 둔 Se-ResNet을 이용하여 CIFAR-10 데이터 셋을 분류했습니다.

간단히 epoch 200번 정도 돌려 봤는데 괜찮은 결과가 나온 것 같습니다. 

 

이제 야외에서도 딥러닝을 돌려야할 때, 바로 사용할 수 있습니다. ( 해커톤 같은 경우 ...? )

 

https://coding-yoon.tistory.com/152

 

주피터 노트북 개인 딥러닝 서버 만들기 ! (1) with Window10, Pytorch

이번에 컴퓨터를 맞추면서 그래픽카드 RTX 2060 super를 구매했습니다. 저만의 딥러닝 서버를 만들어 놓으면 어디서든 야외에서 노트북으로 가볍게 작업할 수 있습니다. ( 얼마나 작업을 할지 모르

coding-yoon.tistory.com

https://coding-yoon.tistory.com/153

 

주피터 노트북 개인 딥러닝 서버 만들기 ! (2) with Window10, Pytorch

안녕하세요. 주피터 노트북 개인 딥러닝 서버 만들기 2편입니다. 이번 글은 주피터 노트북을 좀 더 유용하고 보기 좋게 만들기 위한 편입니다. 굳이 안 하시고 넘어가셔도 무방합니다. ~ 1. 주피

coding-yoon.tistory.com

 

728x90
반응형

+ Recent posts