Recurrent Neural Network기법을 사용하여 저주파 필터링 작업을 수행해 보자. 저주파 필터링을 위해 사용되는 RNN 기법은 랜덤한 증권가격 예측과 마찬가지로 Many To one 모델을 사용하기로 한다.
신호의 필터링은 통신 분야에서 이미 엄청난 응용이 이루어지고 있는 분야로서 저주파 필터링이란 저주파와 고주파가 섞여 있는 신호에서 고주파를 배제하고 저주파만 뽑아내는 작업을 뜻한다. 일반적으로 디지털 필터링에 관한 문헌에 의하면 특정한 주파수 범위의 신호만을 뽑아내는 작업은 상당한 복잡성이 요구된다.
하지만 머신 러닝 방식에 의한 필터링 작업에서는 다양한 주파수가 섞여 있는 신호에 대해서 필터링 된 결과를 일부 신호 구간에 대해서 학습을 시켜주기만 하면 나머지 테스트 구간의 신호에 대해서 깔끔하게 필터링 된 결과를 얻어낼 수 있다.
RNN 머신 러닝의 필터링 능력을 파악하기 위해서 아래와 같이 2가지 파형 즉 저주파인 Sin(2.0 t) 와 상대적으로 고주파인 0.5 Sin(50 t)를 호합한 파형을 엑셀에서 생성하여 CSV 포맷으로 저장해서 데이터 파일로 사용하자. 엑셀에서 시간 이 증가함에 따라 생성한 엑셀파일에서 B 와 C 컬럼 데이터를 복사하여 다시 숫자로 저장해서 데이터 파일을 준비하여 RNN 코드와 같은 폴더에 두도록 한다.
저주파 필터링 작업을 위한 파이선 코드 rnn_low_pass_filter_prediction.py 의 파라메터 설정 부분을 살펴보자. 문자 예측 RNN 예제에서와 그다지 차이가 없어 보이지만 이번에는 신호 처리이므로 아래에서처럼 중요 파라메터만 확인해 보자.
엑셀 데이터 파일에서 2개의 컬럼 데이터로 구성되어 있으므로 many 조건에 해당하는 data_dim = 2 로 설정한다. 반면에 one 조건에 해당하는 output_dim = 1 설정한다. iterations 는 필터링 된 신호가 학습을 위해 가르쳐 준 신호와 차이가 많이 나도록 가급적이면 낮은 횟수를 설정했다가 점차 높여 보면 된다. hidden_dim 은 7∼10 이면 무난하다.
신호 필터링 결과를 분석해 보자. 오른 쪽 그림이 학습시킨 주파수 와 필터링된 결과가 함께 작도 되었다. train 사이즈 설정에서 10% 만 학습 시킬때의 결과 이다. 현재의 파라메터 조건하에서 20% 로 설정하면 prediction 파형과 학습 파형과 차이를 구분하기가 힘들어진다. 바둑에서 알파고가 이세돌 기사를 압도했듯이 놀라운 필터링 능력이다.
엑셀 데이터 준비는 사용자가 스스로 하도록 하고 첨부된 파이선 코드를 다운받아 indfentation을 확인 후 실행해 보자.
#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_02.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.2)
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의 정체와 사용법 튜토리얼 소개 (0) | 2019.06.14 |
---|---|
Low Pass Filtering 알고리듬을 사용한 학습 데이터 생성 및 RNN 필터링 (0) | 2019.06.12 |
PCA처리한 Wine 데이터 Logistic Regression 및 정밀도 (0) | 2019.06.10 |
Wine 데이터와 PCA(Principal Component Analysis) 처리 (0) | 2019.06.09 |
PyTorch Transfer Learning Tutorial 구글 Colabo GPU 처리 (0) | 2019.06.03 |