Low Pass Filtering(LPF) 을 직접 사용하는 예로서 Brokking의 오픈소스형 DIY 아두이노 Flight Controller 적용을 들 수 있다.
http://www.brokking.net/ymfc-3d_v2_main.html
필자도 실제로 Brokking 의 YMFC-AL 모델 아두이노 오픈소스를 다운받아 DIY 드론을 제작하여 시험비행을 해본 경험이 있으며 동호회 전문가로부터 Brokking 의 소스 코드에 들어 있는 Low Pass Filtering 에 관해 실제 배우는 계기가 있었다. 그 원리에 따른 아두이노 코딩과 설명은 필자의 아래 url 주소를 참조하도록 하자.
LPF 효과를 줄 수 있는 Recursive 공식은 다음과 같이 주어진다.
자이로센서로 MPU 6050을 사용하는 DIY 아두이노 드론에서는 센서로부터 입력 S(n) 이 주변으로부터 쉽게 노이즈를 타게 된다. 따라서 직접 S(n) 값을 읽어서 feed back control 에 적용하기에는 리스크가 많아지므로 위 공식에서처럼 Recursive 하게 바로 앞 스텝의 데이터의 α만큼에 지금 입력된 신호로부터 (1-α) 만큼을 취하여 합하면 위 그림의 예에서처럼 높은 주파수 성분의 노이즈를 제거하고 저주파 성분만을 얻어낼 수 있게 된다. 구체적으로 두 계수의 합이 1.0 이 됨에 유의하자.
실제 DIY 아두이노 드론에서 드론기체를 조종기를 사용하여 회전(Yaw) 시킬 때에 기체가 아주 천천히 회전함을 볼 수 있는데 이때의 주파수는 1Hz 보다 더 낮다고 볼 수 있다. 따라서 LPF 코드가 아주 유용하게 쓰일 수 있다.
RNN 코드를 사용하는 머신 러닝 방식의 필터링 작업은 노이즈가 포함되어 있는 입력 신호 데이터와 함께 필터링 된 결과 신호 데이터를 미리 생성해서 학습시킨 후 계속해서 입력 데이터를 공급해 주면 되는 것이다.
실제로 1000개의 데이터를 사용하여 필터링 작업을 하는 경우 20%를 학습에 사용하게 되면 나머지 80% 입력 데이터에 대해서 테스트 해보고 알고 있는 필터링 된 결과 신호와 비교해 보면 된다. CSV 데이터 파일을 만들기 위한 위의 엑셀 작업을 참조하자. 엑셀에서 신호데이타와 학습을 위한 LPF 데이터가 준비되면 두 줄의 셀을 복사하여 숫자 값 1,2,3 방식으로 붙이기(paste)하여 데이터 파일을 생성한다.
한편 필터링 작업을 위해서 RNN 코드 자체를 수정할 필요는 전혀 없다. 어떤 식으로 필터링 했으면 좋겠다는 취지에 따라서 사용자가 학습 시킬 데이터를 생성하여 RNN 코드에 제공해 주면 되는 것이다. 입력하는 데이터가 단순한 Sine 파형이든 LPF이든 관계없이 RNN 에서의 처리는 동일하다. 지도학습의 특징이 그대로 유지되어야 한다는 의미이다. 하지만 주파수 밴드를 주고 입력 신호로부터 필터 처리된 신호를 뽑아내기 위해서는 현재의 코드와 학습용 데이터 생성을 중심으로 알고리듬 연구가 필요하리라고 본다.
파이선 rnn 코드는 바로 앞에 게시한 블로그의 rnn_low_pass_filtering.py에서 입력 데이터 파일명을 확인하고 그대로 사용하면 된다.
아래 걔산 결과는 1000개의 데이터 중 400개를 학습에 사용하였으며 나머지 600개의 데이터를 예측하여 정답과 비교하였다. RNN 필터링을 실제 사용할 경우에는 학습만 시키고 나머지는 그대로 사용해야 한다.
#rnn_low_pass_filtering.py
import tensorflow as tf
import numpy as np
import matplotlib
import os
tf.reset_default_graph()
tf.set_random_seed(777) #reproducibility
#if "DISPLAY" not in os.environ:
#remove Travis CI Error
#matplotlib.use('Agg')
import matplotlib.pyplot as plt
#train Parameters
seq_length = 7
iterations = 500
data_dim = 2
hidden_dim = 10
output_dim = 1
learning_rate = 0.01
xy = np.loadtxt('data_dualsine_04.csv', delimiter=',')
x = xy
y = xy[:, [-1]] #Low pass signal as label
plt.plot(x)
plt.show()
#build a dataset
dataX = []
dataY = []
for i in range(0, len(y) - seq_length):
_x = x[i:i + seq_length]
_y = y[i + seq_length] #Next signal
#print(_x, "->", _y)
dataX.append(_x)
dataY.append(_y)
#train/test split
train_size = int(len(dataY) * 0.4)
test_size = len(dataY) - train_size
trainX, testX = np.array(dataX[0:train_size]), np.array(
dataX[train_size:len(dataX)])
trainY, testY = np.array(dataY[0:train_size]), np.array(
dataY[train_size:len(dataY)])
#input place holders
X = tf.placeholder(tf.float32, [None, seq_length, data_dim])
Y = tf.placeholder(tf.float32, [None, 1])
#build a LSTM network
cell = tf.contrib.rnn.BasicLSTMCell(
num_units=hidden_dim, state_is_tuple=True, activation=tf.tanh)
outputs, _states = tf.nn.dynamic_rnn(cell, X, dtype=tf.float32)
Y_pred = tf.contrib.layers.fully_connected(
outputs[:, -1], output_dim, activation_fn=None)
#cost/loss
loss = tf.reduce_sum(tf.square(Y_pred - Y)) #sum of the squares
#optimizer
optimizer = tf.train.AdamOptimizer(learning_rate)
train = optimizer.minimize(loss)
#RMSE
targets = tf.placeholder(tf.float32, [None, 1])
predictions = tf.placeholder(tf.float32, [None, 1])
rmse = tf.sqrt(tf.reduce_mean(tf.square(targets - predictions)))
with tf.Session() as sess:
init = tf.global_variables_initializer()
sess.run(init)
#Training step
for i in range(iterations):
_, step_loss = sess.run([train, loss], feed_dict={
X: trainX, Y: trainY})
#print("[step: {}] loss: {}".format(i, step_loss))
#Test step
test_predict = sess.run(Y_pred, feed_dict={X: testX})
rmse_val = sess.run(rmse, feed_dict={
targets: testY, predictions: test_predict})
#print("RMSE: {}".format(rmse_val))
#Plot predictions
plt.plot(testY)
plt.plot(test_predict)
plt.xlabel("x")
plt.ylabel("Sin(x)")
plt.show()
__________________________________________________________________________________________________________________________Commercial
파이선 코딩을 배우는 초보자도 머신 러닝에 한번 도전해 보자. 머신 러닝을 배우려는 초보자들이 가지게
될 의문점들을 쪽집게로 찾아내어 실제 내용과 결과를 확인해볼 수 있도록 완전히 뒷문으로 들어가
시작하는 머신 러닝! 우선 아래 url 을 방문하여 url 로 구성된 본 서의 목차 파일을 무료로 다운로드 받아
펼쳐서 살펴보시기 바랍니다. 파이선 코딩 초보자를 위한 톈서플로우∙OpenCV 머신러닝 머리말과 url
목차 파일 다운로드
https://steemit.com/kr/@codingart/pryx1-opencv
450페이지 19900원 교모문고 퍼플에서 도서주문판매로만 판매중입니다.
_____________________________________________________________________________________________________
'머신러닝' 카테고리의 다른 글
PyTorch의 정체와 자동미분 알고리듬(Automatic Differentiation) (0) | 2019.06.15 |
---|---|
PyTorch의 정체와 사용법 튜토리얼 소개 (0) | 2019.06.14 |
LSTM RNN 머신 러닝에 의한 Low Pass Filtering (0) | 2019.06.11 |
PCA처리한 Wine 데이터 Logistic Regression 및 정밀도 (0) | 2019.06.10 |
Wine 데이터와 PCA(Principal Component Analysis) 처리 (0) | 2019.06.09 |