반응형

그림 참고 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
반응형
반응형

안녕하세요. 

 

요즘 LoRa에서 End Device에서 바이트형식으로 오는 데이터를 파싱하기 위해 bytearray로 골머리를 썩고 있는데, 연구실 형님이 Python Struct을 추천해서 알게 되었습니다.

 

Python이 굉장히 잘 만든 언어이지만, 바이트나 비트를 처리하기에는 너무 까다롭습니다. 

 

bytearray를 이용해 데이터를 파싱하거나 checksum 계산을 수행할 때 PTSD가 왔는데, Python Struct는 정말 신세계에 가까웠습니다.

checksum
bytearray

 


파이썬 Struct는 C언어 Struct와 비슷합니다. 자세한 내용은 공식문서를 통해 참고하시면 됩니다.

https://docs.python.org/3/library/struct.html

 

struct — Interpret bytes as packed binary data — Python 3.9.7 documentation

struct — Interpret bytes as packed binary data Source code: Lib/struct.py This module performs conversions between Python values and C structs represented as Python bytes objects. This can be used in handling binary data stored in files or from network c

docs.python.org

 

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

 

[C] UNION 공용체와 Struct 구조체를 이용해 간단한 패킷 만들기

안녕하세요. 오늘은 UNION과 STRUCT에 대해 이야기 하겠습니다. coding-yoon.tistory.com/119 [C] 구조체 포인터 접근과 최적화 요즘 기본기가 중요함을 느끼고 C를 공부하고 있습니다. 1. 구조체 단순히접근

coding-yoon.tistory.com

 

위 내용을 이해할 수 있다면, 저 말이 무슨 말인지 쉽게 이해할 수 있습니다. 

 

아래와 같은 하나의 14바이트의 packet을 전송했다고 가정합니다. ( 아래 코드는 실제 패킷 중 하나이다. 쉬운 이해를 위해 그림으로)

위 union을 설명하는 블로그에서는 __attribute__에 대해 이야기하지 않았습니다. __attribute__는 패딩 비트가 생기지 않도록 합니다. 그러므로 16바이트가 아닌 14바이트로 메모리가 할당됩니다. 

Packet

파이썬에서 위 같은 바이트로 이루어진 패킷을 받을려면 어떻게 해야하나? bytearray를 쓰려고 하면 정신이 혼미해지지만,  Python Struct를 사용하면 머리의 두통이 사라진다.

 

사용법은 간단하다. 한 줄이면 위 데이터를 쉽게 파싱할 수 있다.

 

from struct import *

"""
Do Something
"""

data = "14바이트패킷" # stirng 아님 # <class 'bytes'>

payload = unpack('<Hfff',data)

u_cnt = payload[0]
lat = payload[1]
long_ = payload[2]
alt = payload[3]

unpack 명령어 한 줄로 파싱이 가능하다.

 

'<Hfff' 의 foramt 형식만 사용할 줄 알면 된다. 간단하다. 위 python 공식 문서에 나와 있는 내용이다. 

 

1. 맨 처음쓰는 것은 바이트 정렬이다. 위 사진의 패킷은 litte endian이므로 '<' 를 추가한다. 

byteorder

2. 바이트 정렬을 적었다면, 데이터의 타입이 나오게 된다. 패킷의 구성은 unsigned int(2), float(4), float(4), float(4)의 순서로 아래 표의 C Type을 보고 해당하는 format을 적으면된다.  'HFF'

결과적으로 unpack은 list 형태로 payload를 반환하게 된다. 

 

 

728x90
반응형

+ Recent posts