반응형

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

 

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

안녕하세요.

 

오늘은 딥러닝에서 가장 많이 사용되는 ReLU를 통해 비선형함수와 선형함수의 차이점을 알아보겠습니다.

 

ReLU 함수

머신러닝에서 선형함수를 통해 회귀문제를 해결할 수 있게 되었고, 더 복잡한 문제를 풀기 위해 비선형 함수 Sigmoid, Tanh, ReLU를 나오기 시작합니다. 

 

현재까지 복잡한 문제를 딥러닝 분야에서 ReLU를 사용하는 것은 당연시 되고 있습니다. 

 

바로, 본론으로 들어가겠습니다.

 

TesorFlow, Keras, Pytorch를 통해 ReLU를 사용하는 것은 굉장히 간단합니다. 

 

신호 및 시스템의 개념적 이야기로 가보겠습니다.

 

ReLU는 왜 비선형 함수일까요?

 

 

 

선형 시스템비선형 시스템의 차이

 

선형성을 가지고 있으면 선형 시스템이고, 그 외는 비선형 시스템입니다.

 

선형성을 가지는 조건은 무엇일까요?

 

세 가지의 조건을 충족하면 선형성을 가진다고 이야기할 수 있습니다. 그 외에는 비선형 시스템으로 분류할 수 있습니다.

 

 

 

 

1. 선형적인 그래프

x = 0 에서 꺽이는 구간을 제외하고 전 구간이 선형성을 가지지만, (x =0) 부분 때문에 선형성을 가진다고 할 수 없습니다. 

 

부끄럽지만, 저는 꺾이는 부분을 제외한 전 구간이 부분 선형형태를 띄우니 선형 함수가 맞지 않나라는 생각을 해 공부를 해서 찾아보았습니다.

 

2. 동차성 ( f(ax) = a * f(x) )

 

ReLU를 간단히 설명하면, x가 0보다 작으면 f(x) = 0, x가 0보다 크면 f(x) = x 입니다. 이를 f(x) = max(0, x)라 표현하겠습니다.

 

 

① a = 3으로 가정하면, 

 

f(3x) = 3x

3 * f(x) = 3x

 

f(3x) = 3 * f(x)  = 3x

 

② a = -3 으로 가정하면

 

f(-3x) = -3x

-3 * f(x) = -3x

 

f(-3x) = -3 * f(x)  = -3x

 

ReLU는 동차성이 성립함을 알 수 있습니다.

 

 

 

 

3. 가산성 ( f(x1 + x2) = f(x1) + f(x2) )

 

x1 = -1, x2 = 2 라고 가정하면,

 

f(-1+2) = 1

 

f(-1) = 0,

f(2) =2 

f(-1) + f(2) = 2

 

f(-1+2) != f(-1) + f(2)

 

ReLU는 가산성이 성립하지 않음을 알 수 있습니다.

 

ReLU는 동차성은 성립하지만, 가산성이 성립하지 않아 선형성을 가지지 않으므로 비선형 함수임을 알 수 있었습니다. 

728x90
반응형
반응형
type(nums)

pytorch1.ipynb
0.01MB

안녕하세요. 이제 파이토치로 딥러닝할 준비가 다 되었습니다.

이제 딥러닝을 하기 전에 파이토치 문법 구조에 대해서 알아보겠습니다.

 

텐서플로우는 numpyarray를 기본으로 텐서(3차 이상)를 사용한답니다. 

우리들이 공부할 파이토치는 torch를 가지고 놉니다. 

 

그냥 numpy = torch 이렇게 보시면 될 것 같습니다. 

이번 시간에 파이토치의 기본인 torch는 데이터 전처리 과정이라고 볼 수 있습니다. 

 

수천 수만 데이터를 다루기 위해서는 전처리 과정을 거쳐야 합니다. 

모델을 구상하고, 반복, 학습만큼 데이터 전처리 과정은 상당히 중요합니다. 

 

1. 기본 구조

import torch
import numpy as np

nums = torch.arange(9)
nums

 

tensor([0, 1, 2, 3, 4, 5, 6, 7, 8])

 

nums.shape

 

torch.Size([9])

 

type(nums)

 

torch.Tensor

 

 nums.numpy()

 

array([0, 1, 2, 3, 4, 5, 6, 7, 8], dtype=int64)

 

nums.reshape(3,3) # 데이터 전처리하는데 가장 많이 사용

 

tensor([[0, 1, 2],

           [3, 4, 5],

           [6, 7, 8]])

 

randoms = torch.rand((3,3))
randoms

 

tensor([[0.5127, 0.8462, 0.1646],

           [0.1679, 0.7492, 0.1046],

           [0.6169, 0.6014, 0.1144]])

 

zeros = torch.zeros((3,3))
zeros

 

tensor([[0., 0., 0.], [0., 0., 0.], [0., 0., 0.]])

 

ones = torch.ones((3,3))
ones

 

tensor([[1., 1., 1.], [1., 1., 1.], [1., 1., 1.]])

 

torch.zeros_like(ones)

 

tensor([[0., 0., 0.], [0., 0., 0.], [0., 0., 0.]])

 

 

2. 연산

import torch
import numpy as np

nums = torch.arange(9)
nums * 3

 

tensor([ 0, 3, 6, 9, 12, 15, 18, 21, 24])

 

nums = nums.reshape((3,3))
nums + nums

 

tensor([[ 0, 2, 4],

          [ 6, 8, 10],

          [12, 14, 16]])

 

result = torch.add(nums, 10)

 

array([[10, 11, 12],

        [13, 14, 15],

        [16, 17, 18]], dtype=int64)

 

 

그 외 사칙연산은 이 방법과 전부 일치합니다. 

 

하지만 조금 연산에 주의해야 하는 부분은 곱셈 쪽입니다.

torch는 하나의 행렬(1, 2차)이며, 텐서(3차, dim = 3, rank = 3)로 볼 수 있습니다.

 

  • * : 스칼라 곱
  • dot : 벡터 내적
  • mv : 행렬과 벡터의 곱
  • mm : 행렬과 행렬의 곱
  • matmul : 인수의 종류에 따라서 자동으로 dot, mv, mm을 선택

곱셈의 종류가 상당합니다. 

스칼라 곱, 행렬 곱은 우리들이 공부했던 고등수학에 나오는 것과 일치합니다.

 

하지만 dot은 어떻게 할까요?

dot은 2차에서는 행렬의 곱과 똑같으나 3차 이상에서는 계산이 많이 달라집니다. 

 

수학적인 부분도 중요하나, 저는 코딩 쪽에 비중을 두면서 공부하도록 하겠습니다.  

 

좀 정리하고 보니 별로네요..

코드블럭을 처음 써봤는데 이상하기도 하고,

다음 글은 좀 더 필요하고 유용한 필요한 부분만 써야할 것 같습니다.

728x90
반응형
반응형

안녕하세요. 딥러닝 2번째 시간입니다. 딥러닝 공부를 하는데 와... 상당히 어렵더라구요.

 

천천히 공부하고 있는데, 아무리 쉽다 쉽다 하지만 어렵습니다.

 

하지만 포기하지 않고, 조금씩 공부하다 보면 1년 뒤에는 어느정도 할 수 있지 않을까요?

 

오늘은 파이토치를 설치를 해보겠습니다.

 

https://pytorch.org/

 

PyTorch

An open source deep learning platform that provides a seamless path from research prototyping to production deployment.

pytorch.org

들어가줍니다.

 

요렇게 나오죠?? 이제 자신에게 맞는 것을 선택해줍니다. 저는 일단 GPU가 없기 때문에 CUDA는 NONE으로 하겠습니다.

만약 GPU로 하고 싶으시다면 

https://tutorials.pytorch.kr/beginner/blitz/tensor_tutorial.html#sphx-glr-beginner-blitz-tensor-tutorial-py

 

PyTorch가 무엇인가요? — PyTorch Tutorials 1.3.1 documentation

Note Click here to download the full example code PyTorch가 무엇인가요? Python 기반의 과학 연산 패키지로 다음과 같은 두 집단을 대상으로 합니다: NumPy를 대체하면서 GPU를 이용한 연산이 필요한 경우 최대한의 유연성과 속도를 제공하는 딥러닝 연구 플랫폼이 필요한 경우 시작하기 Tensors Tensor는 NumPy의 ndarray와 유사하며, 추가로 GPU를 사용한 연산 가속도 가능합니다. from

tutorials.pytorch.kr

여기에 들어가셔서 쭉 내려보시면 있습니다. 전 일단 GPU가 없으니 ㅜㅜ...

 

저에게 맞게 설정 했다면 Run this Command에 드래그해서 복사해줍니다. 

 

저건 pytorch 경로에 들어가 다운로드하겠다는 겁니다.

 

anaconda prompt에 들어가줍니다. 

 

복사한 경로를 그대로 붙여넣기 해줍니다. 

 

the following packages will be downloaded  

다운로드 될 품명들인가봐요.

conda-4.8.1

머 등등 

pytorch 1.4.0 이네요.

torchvision은 데이터셋이나 유용한 함수들이 다양하게 있는거라고 하네요. 옛날에는 없었는데 이제 파이토치를 설치하면서 자동적으로 깔리나봐요.

 

계속 진행할까요??

 

당연히 Y겟죠?

 

설치되고 있네요. 노트북에 와이파이라 그런지 조금 느리네요. 많이 느리네요? 

5분이 지났는데요. 생각보다 오래 걸리네요. 

 

어찌저찌 다운로드까지 완료가 되었네요. 그렇다면 이제 import 한번 시켜볼까요.

 

네 잘되었네요. 오늘은 우선 여기까지만 하고, 본격적으로 딥러닝에 대해 들어가도록 하겠습니다.

728x90
반응형
반응형

안녕하세요. 2020년 2월입니다. 

1월에 기사준비도 하고, 공부도 이것저것 한 것 같은데 나는 이것을 이루었다!

라고 자신있게 말할 만한게 없는 것 같습니다.

 

요즘 머신러닝이 너무 핫합니다.

구글, 페이스북에서 텐서플로우, 파이토치 등 무섭게 업데이트되고 있습니다.

좀 더 쉽게, 직관적으로 변하고 있습니다. 쉽게? 직관적? 코드 길이?

귀찮음을 매우 싫어하는 저에게 이건 기회가 아닐까? 생각했습니다.

 

평소에 관심이 있었던 인공지능이지만, 너무 막연한 벽 때문에 엄두조차 못내고 있었습니다.

4학년이고 맘편히 공부할 수 있는 시간도 없다는 불안함이 저를 부추겼습니다.

그래서 2월에는 인공지능에 한 번 힘을 쏟아볼 생각입니다.

 

그렇다면 머신러닝을 할 준비를 해야겠죠?

 

https://www.anaconda.com/distribution/

 

Anaconda | The World's Most Popular Data Science Platform

Anaconda is the standard platform for Python data science, leading in open source innovation for machine learning. Develop, manage, collaborate, and govern at scale with our enterprise platform.

www.anaconda.com

올려둔 사이트에 들어가서 3.7을 다운로드 해줍니다.

next 버튼을 누르다보면 아래의 문장이 나옵니다.

 

Add Anaconda to the system PATH environment variable 

체크해줍니다. 안해줘도 상관없습니다만, 그냥 해줍시다.

 

저는 아나콘다를 설치, 주피터 노트북에서 파이토치를 돌릴 생각입니다. 

페이스북의 파이토치와 구글의 텐서플로우에 대한 비교 글을 다음 글에서 보기로 하고, 어서 아나콘다를 준비합시다.

 

원래부터 파이썬을 썼을 때, 주피터 노트북을 애용했습니다. 

그 이유는 너무 귀찮기 때문입니다. visual code, 파이참은 설정하는게 어후... 귀찮습니다. 그냥 맘편히 아나콘다를 

사용하는게 좋습니다. 

만약 저처럼 귀찮음을 가지신 분이라면 아나콘다를 굉장히 추천 추천합니다. 

 

아나콘다는 웹서버에 올린다는 특징이 있어, 인터넷이 안되면 아마 안될겁니다. ㅜ 

(저희 랩실은 가끔 인터넷이 느려져서ㅠ)

 

아나콘다의 좋은점!

1. 아나콘다를 깔면 파이썬 등 라이브러리(numpy, matplotlib) 등이 자동 적으로 깔립니다. 와우!

2. 그리고 부분실행이 가능해서 중간 점검이 가능하다고 해야하나?

제가 친구랑 파이썬 공부한다고 만든 롤전적 프로그램 기회가 되면 보여드리겠습니다.

pandas로 데이터를 처리하고, matplotlib로 그래프를 그릴 때, 그 줄에 해당한 부분만 실행이 가능하니 

바로바로 확인이 가능했어서 굉장히 편했습니다.

 

 

 

anaconda powershell, anaconda prompt, jupyter notebook 깔린게 보이죠?

 

바탕화면에 새 파일 하나 만들어줍시다.

 

어디에 만들든 상관없습니다. 

 

요렇게 들어가 줍시다. 

 

 

복사 ctrl+c 아시죠?? 해줍니다.

 

이제 anaconda prompt에 들어가줍니다. 

 

cmd 창처럼 검은색 창이 떳죠?? 

 

cd + 자신이 복사한 경로 이렇게 써줍시다.

 

무슨 뜻이냐면, change directory 라는 뜻으로 경로를 바꿔준다는 뜻입니다. 어디로? 자기가 복사한 경로에.

 

그래서 아까 Add Anaconda to the system PATH environment variable 해도 되고 안해도 된다는게 이것 때문이였습니다.

 

엔터 눌러줍시다.

 

이제 주피터 노트북을 실행합시다.

 

jupyter notebook 이렇게 적어줍시다.

 

실행!

 

짜잔! 

 

그럼 한번 되는지 확인해볼까요?

 

New 버튼 보이시죠? 

python 3를 누르고 생성해줍니다. 

 

실행은 RUN!!!

잘되네용??

 

저희가 설정해둔 경로에 파일은 방금 저희가 만든 untitled.ipynb 파일이 있네요!

 

다음시간에는 파이토치를 깔고 어떻게 공부를 할건지 방향을 말하도록 하겠습니다. 

저 또한 딥러닝, 인공지능 정말 아예 처음입니다. 

그렇다고 영어를 잘하느냐. 그것도 아닙니다. 그냥 깡으로 레퍼런스를 찾아보고 구글링해서 공부를 할 생각입니다. 

파이팅@!

728x90
반응형

+ Recent posts