반응형

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

 

우선, 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
반응형
반응형

안녕하세요. 

 

요즘 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
반응형
반응형

안녕하세요.

 

제가 통신 전공으로 프로토콜 등도 중요하지만 정확한 센서 데이터 수집하는 것도 굉장히 중요하다고 요즘 느낍니다.

 

정확한 데이터를 기반으로 머신러닝, 딥러닝, 필터링이 가능하기 때문에 정확한 데이터를 모으는 것은 가장 중요합니다. 

 

UART Serial 통신(9600, 115200bps)을 통해 가장 심플한 CSV형식이 현재 구글에서 가장 돌고 있습니다. 

 

매번 데이터  수집을 위해 데이터 짜는 것이 귀찮기 때문에 저를 위해 메모장 느낌으로 코딩을 기록했습니다. 

 

파이썬 공식 문서를 보면 쉽게 알 수 있지만, 번역기에 돌린 한국말이 약간 이상합니다. 

https://docs.python.org/ko/3/library/csv.html

 

csv — CSV 파일 읽기와 쓰기 — Python 3.9.7 문서

소위 CSV (Comma Separated Values – 쉼표로 구분된 값) 형식은 스프레드시트와 데이터베이스에 대한 가장 일반적인 가져오기 및 내보내기 형식입니다. CSV 형식은 RFC 4180에서 표준화된 방식으로 형식을

docs.python.org

 

import os

path_ = './data/test.csv'
fieldnames = ['device_name','f_port', 'ucnt', 'dr', 'rssi', 'snr', 'channel', 'lat', 'long_', 'alt']


if __name__ == '__main__':
	file_exists = os.path.isfile(path_)
	
    while(1):
    """
    Do something ex) serial.read, post, parsing...
    """
        with open(file_name, 'a', newline='\n') as csvfile:
            wr = csv.DictWriter(csvfile, delimiter=',', fieldnames=fieldnames)
            if not file_exists: wr.writeheader()
            wr.writerow({
                'device_name' :device_name,
                'f_port':f_port,
                'ucnt' : ucnt, 
                'dr' :dr, 
                'rssi':rssi, 
                'snr':snr, 
                'channel':channel, 
                'lat':lat, 
                'long_': long_, 
                'alt': alt})

 

1. with문을 사용한 이유 :

우선 파이썬 공식문서는 with문을 쓰기 권장한다. 파일 쓰기 위해선 파일을 열어야 합니다. 그리고 쓰기가 완료되면 닫아야 합니다. 하지만 파일 쓰기가 완료되었지만, 파일이 열려 있으면 파일이 깨지거나, 제대로 된 데이터가 아닐 수 있습니다. with문은 이를 방지 위해 파일 열기, 닫기를 자동으로 해줍니다. 

 

2. 위 csv 저장하는 코드는 데이터를 이어 저장하는 형식이며, 만약 파일 이름(path_)이 지정한 경로(./data/) 내에 이름이 같은 파일이 없다면, csv header(fieldnames)를 추가한다. 파일 이름이 지정한 경로 내에 이름이 같은 파일이 있다면, csv header를 추가하지 않고, 데이터를 그대로 이어 저장한다.

    

csv 형태를 잘 만들어 놓으면 나중에 pandas 혹은 matlab가지고 놀기 편합니다. 

 

이런 느낌의 코드를 전에 짜놓고 또 못찾아서 새로 짜고를 3번 정도 반복할쯤 그냥 블로그에 올리기로 했습니다.

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
반응형

+ Recent posts