RNN이란?

 

RNN은 Recurrent Neural Network로 순환신경망이라고 부른다.

 

RNN은 순차적인 데이터를 처리하는데 특화된 신경망 모델이며, 뉴런들이 순환 연결 되어있고, 시간적 순서에 따라 데이터를 처리할 수 있다.

 

RNN 모델

 

 


 

 

삼성전자 주식 데이터 분석하기

 

 

삼성전자 주식 데이터 불러오기

 

FinanceDataReader 라이브러리를 사용하면 삼성전자 주식 정보를 가져올 수 있다.

import FinanceDataReader as fdr
import numpy as np
from matplotlib import pyplot as plt

print(fdr.DataReader(symbol='005930', start='01/01/2016', end='12/23/2020'))

samsung = fdr.DataReader(symbol='005930', start='01/01/2016', end=None)
print(samsung)
print(type(samsung))

 

 

데이터셋 및 자료형

 

위 같이 데이터가 저장되어 있으며 데이터프레임 형태로 저장되어 있음을 확인할 수 있다.

 

 

 

시가(open) 값 추출 및 정규화

 

open_values = samsung[['Open']]
print(open_values)
print(open_values.shape)

from sklearn.preprocessing import MinMaxScaler
scaler = MinMaxScaler(feature_range=(0, 1))
scaled_open_values = scaler.fit_transform(X=open_values)

 

주가 데이터에서 시가 데이터를 추출하고 MinMaxScaler를 사용하여 데이터를 0~1 사이의 값으로 정규화 하였다.

 

 

 

데이터 분할

 

TEST_SIZE = 200
train_data = scaled_open_values[:-TEST_SIZE]
test_data = scaled_open_values[-TEST_SIZE:]

 

훈련 데이터와 테스트 데이터로 분할하였다.

 

마지막 200개의 데이터를 테스트 데이터로 할당하였다.

 

 

 

훈련 데이터 생성을 위한 함수 정의

 

def make_feature(open_values, windowing) -> tuple:
    train = list()
    test = list()
    for i in range(len(open_values) - windowing):
        train.append(open_values[i : i + windowing])
        test.append(open_values[i + windowing])
    print(train)
    print(test)
    return(np.array(train), np.array(test))

(X_train, y_train) = make_feature(open_values=train_data, windowing=30)

 

해당 함수는 주어진 데이터를 윈도우 크기만큼 슬라이딩하며 데이터를 생성한다.

 

 

 

LSTM 모델 생성

 

from keras.models import Sequential
from keras.layers import Dense, LSTM, Input

model = Sequential([], name='LSTM_MODEL')
model.add(Input(shape=(X_train.shape[1], 1), name='INPUT'))
model.add(LSTM(units=32, activation='tanh', name='LAYER1', return_sequences=True))
model.add(LSTM(units=16, activation='tanh', name='LAYER2', return_sequences=False))
model.add(Dense(units=1, name='OUTPUT'))
model.summary()

 

두개의 LSTM 층과 하나의 Dense층으로 구성되었다.

 

 

 

 

모델 학습 및 저장

 

# 모델 학습하기
model.compile(loss='mse', optimizer='adam')
model.fit(x=X_train, y=y_train, epochs=100, batch_size=16, verbose=2)
model.save('LSTM_MODEL.keras')

import tensorflow as tf
model2 = tf.keras.models.load_model('LSTM_MODEL.keras')

 

 

 

데이터 예측하기

 

(X_test, y_test) = make_feature(open_values=test_data, windowing=30)
predictions = model2.predict(x=X_test)
print(predictions)

 

테스트 데이터를 사용하여 모델을 예측하고 윈도우 크기로 나누어 생성한다.

 

 

 

예측 결과 시각화

 

plt.figure(figsize=(10, 8))
plt.plot(y_test, label='STOCK PRICE', color='blue')
plt.plot(predictions, label='Predictions', color='red')
plt.legend()
plt.show()

 

모델 예측결과 시각화

 

예측값이 생각보다 정확하게 나온것을 확인할 수 있다.

 

 


 

 

YOLO3 모델을 사용한 객체 감지

 

YOLO3 모델을 사용하면 사진에서 객체를 감지하고 감지된 객체를 이미지에 그려주는 과정을 수행할 수 있다.

 

 

 

라이브러리 호출 및 모델, 설정 파일 불러오기

 

import cv2
import numpy as np

model = "yolov3.weights"
config = "yolov3.cfg"
class_labels = "coco.names"
confThreshold = 0.5
nmsThreshold = 0.4

 

모델의 가중치 및 설정, 클래스 이름들에 대한 파일은 사전에 미리 공유된 파일로 다운받았다.

 

그리고 감지 신뢰도의 임계값과 Non-Maximum Suppression(NMS)의 임계값을 설정해주었다.

coco.names 파일 속 데이터들

 

데이터셋 안의 클래스 이름들은 위 사진과 같다.

 

 

 

테스트 이미지 파일들 목록

 

img_files = ['bicycle.jpg', 'car.jpg', 'dog.jpg', 'kite.jpg', 'person.jpg', 'sheep.jpg']

 

감지 테스트를 위한 이미지 파일 이름들이다.

 

 

 

모델 불러오기

 

net = cv2.dnn.readNet(model=model, config=config)

 

 

 

클래스 이름 출력

classes = []
with open(file=class_labels, mode='rt') as f:
    classes = f.read().split('\n')
print(classes)

 

coco.names 안 이름들을 불러와 리스트에 저장하였다.

 

 

 

랜덤 색상 생성

 

colors = np.random.uniform(low=0, high=255, size=(len(classes), 3))

 

감지된 객체를 표시할 박스의 컬러를 랜덤하게 생성한다.

 

 

 

출력 레이어 설정

 

layers_names = net.getLayerNames()
output_layers = [layers_names[i - 1] for i in net.getUnconnectedOutLayers()]

 

 

 

 

이미지 처리 과정

for f in img_files:
    img = cv2.imread(f)
    blob = cv2.dnn.blobFromImage(image=img, scalefactor=1/255., size=(416, 416), swapRB=True)
    net.setInput(blob)
    outs = net.forward(output_layers)

    (h, w) = img.shape[:2]
    class_ids = list()
    confidences = []
    boxes = []

    for out in outs:
        for detection in out:
            scores = detection[5:]
            class_id = np.argmax(scores)
            confidence = scores[class_id]
            if confidence > confThreshold:
                cx = int(detection[0] * w)
                cy = int(detection[1] * h)
                bw = int(detection[2] * w)
                bh = int(detection[3] * h)

                sx = int(cx - bw / 2)
                sy = int(cy - bh / 2)
                boxes.append([sx, sy, bw, bh])
                confidences.append(float(confidence))
                class_ids.append(int(class_id))
    indices = cv2.dnn.NMSBoxes(boxes, confidences, confThreshold, nmsThreshold)

    for i in indices:
        (sx, sy, bw, bh) = boxes[i]
        label = f'{classes[class_ids[i]]} : {confidences[i]:.2}'
        color = colors[class_ids[i]]
        cv2.rectangle(img, (sx, sy, bw, bh), color, 2)
        cv2.putText(img, label, (sx, sy - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.7, color, 2, cv2.LINE_AA)
    (t, _) = net.getPerfProfile()
    label = "Inference time : %2.f ms" % (t * 1000.0 / cv2.getTickFrequency())
    cv2.putText(img, label, (10, 30), cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 0, 255), 1, cv2.LINE_AA)
    cv2.imshow(winname='IMAGE', mat=img)
    cv2.waitKey()
cv2.destroyAllWindows()

 

위 같은 과정을 통해 이미지를 감지하고 처리과정을 통해 시각화할 수 있다.

 

 

이미지 감지 결과

 

이미지에서 객체를 정확히 감지하여 표시하였다.