RNN이란?
RNN은 Recurrent Neural Network로 순환신경망이라고 부른다.
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)의 임계값을 설정해주었다.
데이터셋 안의 클래스 이름들은 위 사진과 같다.
테스트 이미지 파일들 목록
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()
위 같은 과정을 통해 이미지를 감지하고 처리과정을 통해 시각화할 수 있다.
이미지에서 객체를 정확히 감지하여 표시하였다.
'Python > 데이터분석(ABC 부트캠프)' 카테고리의 다른 글
[27일차] ABC 부트캠프 / NVIDIA 트랜스포머 기반 자연어 처리 애플리케이션 구축 과정 (0) | 2024.08.04 |
---|---|
[26일차] ABC 부트캠프 / NVIDIA 딥러닝 기초 과정 (0) | 2024.08.04 |
[24일차] ABC 부트캠프 / OpenCV 실습 (0) | 2024.07.28 |
[23일차] ABC 부트캠프 / CNN 모델 (0) | 2024.07.28 |
[22일차] ABC 부트캠프 / MNIST 숫자 이미지 분류 및 Keras 기본 개념 (0) | 2024.07.28 |