티스토리 뷰

728x90
반응형

https://colab.research.google.com/github/tensorflow/docs-l10n/blob/master/site/ko/guide/keras/rnn.ipynb?hl=ko

 

rnn.ipynb

Run, share, and edit Python notebooks

colab.research.google.com

https://blog.naver.com/demian7607/222043724449

 

구글 코랩(colab) GPU 딥러닝 케라스(keras) 돌리기[추가.CPU랑 속도 비교]

1. 데이터 세팅 (불러올 파일 경로 설정을 해줘야해요 : 드라이브 마운트 이용해야 함!) 보기 -> 목차 -...

blog.naver.com

https://official-hacademi.tistory.com/entry/%EA%B5%AC%EA%B8%80-%EC%BD%94%EB%9E%A9%EC%97%90%EC%84%9C-%ED%8C%8C%EC%9D%BC-%EC%9D%BD%EA%B3%A0-%EC%93%B0%EA%B3%A0-%EC%A0%80%EC%9E%A5%ED%95%98

 

코랩과 구글 드라이브 연동(파일 불러오기, 읽고, 쓰고, 저장하기)

1. 현재 위치 확인하기 구글 드라이브에서 코랩 노트북을 열고 코드 셀에 'pwd'를 입력한다. 실행 후 '/content'라는 경로에 있음을 확인할 수 있다. 빨간 동그라미 속 아이콘을 클릭하면 파일 탐색을

official-hacademi.tistory.com

하루 체온 변화의 리듬이 항상성을 가진다면 체온으로 시간을 예측할 수 있지 않을까

[1]

C. Harding, F. Pompei, S. F. Bordonaro, D. C. McGillicuddy, D. Burmistrov, and L. D. Sanchez, “The daily, weekly, and seasonal cycles of body temperature analyzed at large scale,” Chronobiology International, vol. 36, no. 12, pp. 1646–1657, Dec. 2019, doi: 10.1080/07420528.2019.1663863.


데이터

data

temp_data.csv

time [UTC-OFS=+0100]: UTC+0100 시간대를 기준으로 한 시간 정보입니다.
timestamp [us]: 마이크로초 단위의 타임스탬프입니다.
hf_a0 [counts], hf_a1 [counts]: 높은 빈도 센서 데이터의 카운트입니다 (해당 센서의 세부 사항은 명시되지 않았습니다).
temp_a0 [mC], temp_a1 [mC]: 밀리도 (mC) 단위의 온도 측정값입니다.
ax, ay, az: 아마도 가속도계에서 측정된 x, y, z 축의 가속도 데이터일 것입니다.
battery_voltage [mV]: 밀리볼트(mV) 단위의 배터리 전압입니다.
cbt [mC]: 밀리도(mC) 단위의 중심체온입니다.

목표는 특정 체온을 측정했을 때의 시간을 예측하는 것이므로, temp_a0 [mC] 또는 temp_a1 [mC], 혹은 cbt [mC] 중에서 체온 데이터로 가장 적합한 열을 사용할 수 있습니다. 시간 예측에는 time [UTC-OFS=+0100] 열의 데이터를 사용할 수 있습니다.


드라이브 연동

from google.colab import drive
drive.mount('/content/drive')
%tensorflow_version 2.x
import tensorflow as tf
device_name = tf.test.gpu_device_name()
if device_name != '/device:GPU:0':
  raise SystemError('GPU device not found')
print('Found GPU at: {}'.format(device_name))
from tensorflow.keras import Sequential
from tensorflow.keras import layers
from tensorflow.keras.optimizers import RMSprop

 

1.data

import keras
data_dir = './datasets/jena_climate/'
fname = os.path.join(data_dir,'jena_climate_2009_2016.csv')

f = open(fname)
data = f.read() #data에 읽어옴
f.close()

lines = data.split('\n')
header = lines[0].split(',') #헤더만 넣음
lines = lines[1:] #로우들(데이터들)

print(header)
print("데이터의 수" ,len(lines))

컬럼들

['time [UTC-OFS=+0100]', 'timestamp [us]', 'hf_a0 [counts]', 'temp_a0 [mC]', 'hf_a1 [counts]', 'temp_a1 [mC]', 'ax', 'ay', 'az', 'battery_voltage [mV]', 'cbt [mC]', '', '', '', '', '', '', '', '', '', '', '', '']

데이터의 수 248930

 

​2. 넘파이 차원형태로 만들어주기+ '정규화' + '차트분석'

(zeros로 원하는 np 차원 형태 만들어 준후 거기다 넣어주는 방식입니다.)

원하는 데이터 테이블 만들어주기

import pandas as pd

# 데이터 파일 로드
file_path = '/content/drive/MyDrive/SRC/temp_data.csv'  # 실제 파일 경로로 변경해주세요
data = pd.read_csv(file_path)

# 'Unnamed' 열 제거
data = data.loc[:, ~data.columns.str.contains('^Unnamed')]

# 'time [UTC-OFS=+0100]' 열을 datetime 형식으로 변환
data['time [UTC-OFS=+0100]'] = pd.to_datetime(data['time [UTC-OFS=+0100]'])

# 'cbt [mC]'를 섭씨 온도(°C)로 변환 (밀리도 -> 도)
data['cbt [°C]'] = data['cbt [mC]'] / 1000

# 'cbt [mC]'가 0인 행 제거
data = data[data['cbt [mC]'] != 0]

# 필요한 열만 선택
cleaned_data = data[['time [UTC-OFS=+0100]', 'cbt [°C]']]

# 데이터 확인
print(cleaned_data.head())

 

 

시간을 다루는데.. 분으로 다 바꿔보자.


import pandas as pd
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import LSTM, Dense
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import MinMaxScaler
from tensorflow.keras.optimizers import Adam
import numpy as np
import matplotlib.pyplot as plt


# 데이터 파일 로드
file_path = '/content/drive/MyDrive/SRC/temp_data.csv'  # 실제 파일 경로로 변경해주세요
data = pd.read_csv(file_path)

# 'Unnamed' 열 제거
data = data.loc[:, ~data.columns.str.contains('^Unnamed')]

# 'time [UTC-OFS=+0100]' 열을 datetime 형식으로 변환
data['time [UTC-OFS=+0100]'] = pd.to_datetime(data['time [UTC-OFS=+0100]'])

# 'cbt [mC]'를 섭씨 온도(°C)로 변환 (밀리도 -> 도) 및 0이 아닌 행만 선택
cleaned_data = data[data['cbt [mC]'] != 0]
cleaned_data['cbt [°C]'] = cleaned_data['cbt [mC]'] / 1000

# 정규화를 위한 Scaler 생성
scaler = MinMaxScaler()
cleaned_data['cbt_normalized'] = scaler.fit_transform(cleaned_data[['cbt [°C]']])

# # 시간 데이터를 시, 분, 초로 변환
# cleaned_data['hour'] = cleaned_data['time [UTC-OFS=+0100]'].dt.hour
# cleaned_data['minute'] = cleaned_data['time [UTC-OFS=+0100]'].dt.minute
# cleaned_data['second'] = cleaned_data['time [UTC-OFS=+0100]'].dt.second

# # 시간 데이터를 초 단위로 변환 (예: 전체 날짜와 시간을 초로 변환)
# cleaned_data['time_seconds'] = cleaned_data['time [UTC-OFS=+0100]'].dt.hour * 3600 + cleaned_data['time [UTC-OFS=+0100]'].dt.minute * 60 + cleaned_data['time [UTC-OFS=+0100]'].dt.second


# 시간 데이터를 분 단위로 변환
cleaned_data['time_minutes'] = cleaned_data['time [UTC-OFS=+0100]'].dt.hour * 60 + cleaned_data['time [UTC-OFS=+0100]'].dt.minute

 

 

시퀀스를 만들자. 데이터 묶음을 의미하는데

몇개씩할건가.. 

# 시퀀스 데이터 생성 함수
def create_sequences(data, sequence_length):
    sequences = []
    labels = []
    for i in range(len(data) - sequence_length):
        sequences.append(data.iloc[i:i+sequence_length]['cbt_normalized'].values.reshape((sequence_length, 1)))
        labels.append(data.iloc[i+sequence_length]['time_minutes'])
    return np.array(sequences), np.array(labels)

# 시퀀스 길이 정의 및 데이터 생성
sequence_length = 60
X, y = create_sequences(cleaned_data, sequence_length)

# 데이터 분할
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

 

LSTM 레이어를.. 만든다고 나아질까.

from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import LSTM, Dense, Dropout
from tensorflow.keras.optimizers import Adam

# 모델 구성
model = Sequential()
# 첫 번째 LSTM 층
model.add(LSTM(128, input_shape=(sequence_length, 1), return_sequences=True))  # return_sequences=True는 다음 LSTM 층을 위해 필요
model.add(Dropout(0.2))  # Dropout 층 추가

# 두 번째 LSTM 층
model.add(LSTM(64, return_sequences=False))  # 두 번째 LSTM 층은 마지막 층이므로 return_sequences=False
model.add(Dropout(0.2))  # Dropout 층 추가

# 출력 층
model.add(Dense(1))

# 모델 컴파일
optimizer = Adam(lr=0.001)
model.compile(optimizer=optimizer, loss='mse')

# 모델 요약 출력
model.summary()

# 모델 훈련
history = model.fit(X_train, y_train, epochs=20, batch_size=32, validation_split=0.1)

# 학습 과정 시각화
plt.plot(history.history['loss'], label='train')
plt.plot(history.history['val_loss'], label='validation')
plt.title('Model Loss')
plt.ylabel('Loss')
plt.xlabel('Epoch')
plt.legend(['Train', 'Validation'], loc='upper left')
plt.show()

음...

평가해볼까..

# 모델 평가
y_pred = model.predict(X_test).flatten()
mae = mean_absolute_error(y_test, y_pred)
mse = mean_squared_error(y_test, y_pred)
r2 = r2_score(y_test, y_pred)
print(f"MAE: {mae}, MSE: {mse}, R^2: {r2}")

후.. 31.7 퍼센트 맞음..

+++

다음 과제

조도센서 데이터를 갖는 다면? 

실내. 실외.. 밝기가 영향을 미칠듯 흠......

 

model_path = '/content/drive/My Drive/SRC/my_model.h5'  # 'your_model_directory'는 실제 모델을 저장할 폴더명으로 변경
model.save(model_path)

 

모델..만들어서 TouchDesigner에서 활용해보자..

728x90
반응형
250x250
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/02   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28
글 보관함
반응형