반응형

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

 

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

안녕하세요. 

 

만약 여기까지 따라 오셨다면 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
반응형
반응형

안녕하세요.

 

주피터 노트북 개인 딥러닝 서버 만들기 2편입니다.

이번 글은 주피터 노트북을 좀 더 유용하고 보기 좋게 만들기 위한 편입니다. 굳이 안 하시고 넘어가셔도 무방합니다.

 

~ 1. 주피터 노트북 테마 ~

저는 주피터 노트북 기본 테마를 별로 좋아하지 않습니다. 현재 제가 다니고 있는 연구실은 정부에서 지원하는 딥러닝 서버를 주피터 노트북으로 이용하고 있습니다. 저만 사용하는 것이 아니기 때문에, 기본 테마로 뒀습니다. 

 

하지만 이 딥러닝 서버는 오로지 저만을 위한 서버이기 때문에 테마를 바꾸겠습니다. 

 

anaconda prompt를 들어가 pip install jupyterthemes 를 입력해 테마 패키지를 설치합니다.

pip install jupyterthemes # 주피터 노트북 테마 패키지 설치
jt -l # 테마 목록 출력

"""
Available Themes:
   chesterish
   grade3
   gruvboxd
   gruvboxl
   monokai
   oceans16
   onedork
   solarizedd
   solarizedl
"""

저는 테마 grade3이 제일 좋아합니다. 

jt -t grade3 -T -N
-T : 툴바 보이게 설정
-N : 제목 보이게 설정

 

툴바는 무조건 있는게 편합니다. 제목은 내가 현재 어떤 파일을 편집하는지 알기 편하고, 제목을 누르면 수정할 수 있어 편합니다. 이 정도 설정하시면 문제없습니다. 폰트 사이즈나 다양한 설정이 있지만 그건 구글에 치면 많은 블로그가 있습니다.

툴바
제목
jt -t grade3 -T -N

 

~ 2. 주피터 노트북 확장 프로그램 ~

확장프로그램은 사람들이 추천하는 것을 사용하면 편합니다. 아래 블로그 분께서 추천하시는 것들을 하시면 편합니다. 

https://www.rlee.ai/jupyter/jupyter-notebook-exntesions

 

주피터 노트북 확장 프로그램 사용하기

jupyter_contrib_nbextensions는 몇십 가지의 확장 프로그램을 모아둔 패키지입니다. 그 중에서 특히 많이 찾으실 만한 확장 프로그램들은 다음과 같습니다.

www.rlee.ai

개인적으로 몇 개를 더 추천드립니다.

2.1. Code prettify

제목 그대로 코드를 이쁘게 정리하는 툴입니다. 동작에는 영향을 끼치진 않습니다. 

2.2. Variable Inspector

매트랩의 작업 공간처럼, 변수들을 전체적으로 확인할 수 있습니다.

2.3. Execute Time

실행된 셀의 걸린 시간을 알려줍니다. 

executed in 15ms, finished 23:14:02 2021-07-16

 

그 외에 많은 툴이 있으니 찾아보시길 바랍니다. 설명도 자세히 나와 있기 때문에 커스터마이징 하기 좋습니다.

Nbextensions 클릭
설정

 

~ 3. DDNS ~

아래 블로그 분께서 DDNS에 대해 잘 설명해주셨습니다. ( ipTIME 공유기는 무료로 가능합니다. )

IP를 외우고 다니는 사람은 없습니다. DNS라 하여 IP의 또 다른 이름이라고 생각하시면 좋습니다. 

ex) www. naver. com

우리도 IP 대신 DNS를 사용하는 것입니다. 

https://luckygg.tistory.com/271

 

[ipTIME] DDNS 설정으로 외부에서 쉽게 공유기에 접속하기

DDNS(Dynamic DNS)란? 우선 DDNS를 이해하기 전에 DNS(Domain Name system)를 이해해야 합니다. 우리는 웹 브라우저에서 네이버나 구글에 접속하기 위해 www.naver.com 또는 www.google.com이라는 주소로 접속합니..

luckygg.tistory.com

 

 

ipTIME일 경우...

{사용자 지정}.iptime.org:{포트번호}

 

그런데 하나 이상한 부분이 있지 않나요?

 

보통 Naver나 Google을 브라우저에 입력할 때, 포트 번호를 적으시나요?

Naver를 접속할 때, 우리는 브라우저에 www.naver.com 입력합니다. 포트 번호는 어디 갔을까요?

이유는 간단합니다. http 포트번호는 80번으로, Well Known Port 번호입니다. 말 그대로 잘 알려진 포트번호입니다. 브라우저 내에서 생략되어 알아서 80번으로 접근합니다. 그렇기 때문에 www.naver.com:80 으로 들어가도 잘 동작합니다.

 

참고로 알아도 좋고, 몰라도 좋습니다.

 

~ 4. WoL ~

WoL은 Wake on LAN의 약자입니다. 말 그대로 원격으로 LAN을 통해 내 컴퓨터에 신호를 주어 깨운다는 뜻입니다. 항상 PC를 켜놓을 수 없기 때문에, 필요할 때 모바일로 내 컴퓨터를 켤 수 있습니다. 

WoL 같은 경우는 메인보드, 랜 카드 지원 호환성을 알아야 합니다. ( 보통 요즘 PC들은 거의 지원합니다. ) 

 

아래 블로그 분께서 깔끔히 정리해놓은 것이 있으니, 아래 것을 참고하시길 바랍니다.

https://luckygg.tistory.com/277

 

[ipTIME] WOL 어플로 어디서든 내 컴퓨터 전원 켜기

WOL이란? WOL은 Wake On Lan의 약자로, 특정 네트워크에 연결되어 있는 컴퓨터의 전원을 LAN을 통해 원격으로 켜는 기능입니다. WOL 설정만 되어 있다면 스마트폰으로 언제 어디서든 쉽게 집 또는 회사

luckygg.tistory.com

 

저처럼 ASUS 메인보드라면, 아래 블로그 참고하시길 바랍니다. 

https://intunknown.tistory.com/576

 

asus 메인보드 wol 설정 [bios]

asus 메인보드 wol 설정 [bios] 안녕하세요. 오늘은 wol을 하기 위해 바이오스를 설정해보려고 합니다. wol에 대한 간단한 설명. asus 메인보드 바이오스 설정. wol에 대한 간단한 설명. 이거 검색해서 올

intunknown.tistory.com

 

 

다음 글은 Pytorch GPU 버전을 설치하고, 딥러닝 SeNet 가볍게 하나 돌려 보겠습니다. 

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

안녕하세요. 

 

Plain Network(단순히 Layer을 깊게 쌓음)에서 발생하는 Vanishing Gradient(기울기 소실), Overfitting(과적합) 등의 문제를 해결하기 위해 ReLU, Batch Nomalization 등 많은 기법이 있습니다. 

 

ILSVRC Challenge
2021년 3월 24일 기준 인용

ILSVRC 대회에서 2015년, 처음으로 Human Recognition보다 높은 성능을 보인 것이 ResNet입니다.

그 위용은 무지막지한 논문 인용 수로 확인할 수 있습니다. 

 

그렇기 때문에 ResNet은 딥러닝 이미지 분야에서 바이블로 통하고 있습니다. 

 

Plain Netwrok Vs ResNet

Plain Network는 단순히 Convolution 연산을 단순히 쌓는다면, ResNet은 Block단위로 Parameter을 전달하기 전에 이전의 값을 더하는 방식입니다. 

 

Residual Block

F(x) : weight layer => relu => weight layer 

x : identity

 

weight layer들을 통과한 F(x)와 weight layer들을 통과하지 않은 x의 합을 논문에서는 Residual Mapping 이라 하고, 그림의 구조를 Residual Block이라 하고, Residual Block이 쌓이면 Residual  Network(ResNet)이라고 합니다.

Residual Mapping은 간단하지만, Overfitting, Vanishing Gradient 문제가 해결되어 성능이 향상됐습니다.

그리고 다양한 네트워크 구조에서 사용되며, 2017년 ILSVRC을 우승한 SeNet에서 사용됩니다. ( 이 글을 쓴 이유이기도 합니다. ) 

 

Plain Network VS ResNet (Error)

 

Residual Block

class Residual_Block(nn.Module):
    def __init__(self, in_dim, mid_dim, out_dim):
        super(Residual_Block,self).__init__()
        # Residual Block
        self.residual_block = nn.Sequential(
                nn.Conv2d(in_dim, mid_dim, kernel_size=3, padding=1),
                nn.ReLU,
                nn.Conv2d(mid_dim, out_dim, kernel_size=3, padding=1),
            )            
        self.relu = nn.ReLU()
                  
    def forward(self, x):
       out = self. residual_block(x)  # F(x)
        out = out + x  # F(x) + x
        out = self.relu(out)
        return out
    

 

그리고 Residual Block 소개 후 BottleNeck이 나옵니다. 아래 글을 참고하시면 좋을 것 같습니다. 

coding-yoon.tistory.com/116?category=825914

 

[딥러닝] DeepLearning CNN BottleNeck 원리(Pytorch 구현)

안녕하세요. 오늘은 Deep Learning 분야에서 CNN의 BottleNeck구조에 대해 알아보겠습니다. 대표적으로 ResNet에서 BottleNeck을 사용했습니다. ResNet에서 왼쪽은 BottleNeck 구조를 사용하지 않았고, 오른쪽은..

coding-yoon.tistory.com

ResNet 원문

arxiv.org/abs/1512.03385

 

Deep Residual Learning for Image Recognition

Deeper neural networks are more difficult to train. We present a residual learning framework to ease the training of networks that are substantially deeper than those used previously. We explicitly reformulate the layers as learning residual functions with

arxiv.org

 

728x90
반응형

+ Recent posts