본문 바로가기
프로그램

[파이썬] 1차원 데이터의 CNN(Conv1D) 딥러닝

by 오디세이99 2023. 5. 24.
728x90
반응형

보통 CNN 분류가 이미지데이터를 사용하는데, 다음과 같이 시계열 데이터로 학습하는 코드를 만듬.

 

데이터 만들기

import matplotlib.pyplot as plt
import numpy as np

# 데이터 생성
# 시간 간격을 만듭니다.
t = np.linspace(0, 6 * np.pi, 1000)
t2 = np.linspace(0, 3 * np.pi, 1000)

# 임의의 곡선을 계산합니다.
y = np.sin(t) + np.cos(2 * t) + np.sin(3 * t) + np.sin(2 * t)
y2 = np.sin(t2) + np.cos(4 * t) + np.sin(9 * t)
y3 = np.sin(t2) + np.cos(6 * t)
y_sum = (y + y2) / 7  # 데이터의 고저 차를 줄임
y_sum += abs(min(y_sum))

data = y_sum * 50 + 60
# data = np.round(data, 0)
data = np.int32(data)

plt.plot(data)

데이터는 다음과 같이 있습니다.

50개 요소씩 묶어서 X 학습 데이터로 만듭니다.

y (target) 데이터는 다음 값이 전 데이터보다 낮은지 높은지 0, 1 로 만듭니다.

length = 50
X = [data[i-length: i+1] for i in range(length, len(data)-1)]
y = [1 if data[i+1] - data[i] > 0 else 0 for i in range(length, len(data)-1)]
split_len = int(len(X) * 0.8)
X_train = np.array(X[:split_len])
y_train = np.array(y[:split_len])
X_test = np.array(X[split_len:])
y_test = np.array(y[split_len:])

X_train[:5], y_train[:5]             # X, y 데이터 확인(5개만)

import numpy as np
from keras.models import Sequential
from keras.layers import Dense, Flatten, Conv1D, MaxPooling1D
# from keras.applications import VGG16

# 데이터 생성
t = np.linspace(0, 6 * np.pi, 1000)
t2 = np.linspace(0, 3 * np.pi, 1000)

y = np.sin(t) + np.cos(2 * t) + np.sin(3 * t) + np.sin(2 * t)
y2 = np.sin(t2) + np.cos(4 * t) + np.sin(9 * t)
y3 = np.sin(t2) + np.cos(6 * t)
y_sum = (y + y2) / 7
y_sum += abs(min(y_sum))

data = y_sum * 50 + 60
# data = np.int32(data)
length = 50
X = [data[i-length: i+1] for i in range(length, len(data)-1)]
y = [1 if data[i+1] - data[i] > 0 else 0 for i in range(length, len(data)-1)]
split_len = int(len(X) * 0.8)
X_train = np.array(X[:split_len])
y_train = np.array(y[:split_len])
X_test = np.array(X[split_len:])
y_test = np.array(y[split_len:])

model = Sequential()
model.add(Conv1D(64, kernel_size=3, activation='relu', input_shape=(length+1, 1)))
model.add(MaxPooling1D(pool_size=2))
model.add(Conv1D(128, kernel_size=3, activation='relu'))
model.add(MaxPooling1D(pool_size=2))
model.add(Conv1D(64, kernel_size=3, activation='relu'))
model.add(Flatten())
model.add(Dense(256, activation='relu'))
model.add(Dense(1, activation='sigmoid'))

model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])

model.fit(X_train, y_train, batch_size=32, epochs=100, validation_split=0.2)

loss, accuracy = model.evaluate(X_test, y_test)
print('Test Loss:', loss)
print('Test Accuracy:', accuracy)

 

실행하면 다음과 같습니다.

19/19 [==============================] - 3s 9ms/step - loss: 1.6411 - accuracy: 0.5750 - val_loss: 0.5990 - val_accuracy: 0.7237
Epoch 2/100
19/19 [==============================] - 0s 3ms/step - loss: 0.5941 - accuracy: 0.6969 - val_loss: 0.6195 - val_accuracy: 0.6382
Epoch 3/100
19/19 [==============================] - 0s 3ms/step - loss: 0.5334 - accuracy: 0.7199 - val_loss: 0.5280 - val_accuracy: 0.7434
Epoch 4/100
19/19 [==============================] - 0s 3ms/step - loss: 0.5123 - accuracy: 0.7216 - val_loss: 0.5085 - val_accuracy: 0.7500
Epoch 5/100
19/19 [==============================] - 0s 3ms/step - loss: 0.5097 - accuracy: 0.7348 - val_loss: 0.5451 - val_accuracy: 0.6382
Epoch 6/100
19/19 [==============================] - 0s 3ms/step - loss: 0.4938 - accuracy: 0.7348 - val_loss: 0.4871 - val_accuracy: 0.7171
Epoch 7/100
19/19 [==============================] - 0s 3ms/step - loss: 0.4669 - accuracy: 0.7825 - val_loss: 0.4387 - val_accuracy: 0.7895
Epoch 8/100
19/19 [==============================] - 0s 3ms/step - loss: 0.4430 - accuracy: 0.7924 - val_loss: 0.4158 - val_accuracy: 0.8092
Epoch 9/100
19/19 [==============================] - 0s 3ms/step - loss: 0.4483 - accuracy: 0.7858 - val_loss: 0.4351 - val_accuracy: 0.7566
Epoch 10/100
19/19 [==============================] - 0s 3ms/step - loss: 0.4213 - accuracy: 0.8072 - val_loss: 0.3922 - val_accuracy: 0.8092
Epoch 11/100
19/19 [==============================] - 0s 3ms/step - loss: 0.3909 - accuracy: 0.8270 - val_loss: 0.3746 - val_accuracy: 0.8158
Epoch 12/100
19/19 [==============================] - 0s 3ms/step - loss: 0.3748 - accuracy: 0.8320 - val_loss: 0.3417 - val_accuracy: 0.8421
Epoch 13/100
19/19 [==============================] - 0s 3ms/step - loss: 0.3840 - accuracy: 0.8171 - val_loss: 0.3275 - val_accuracy: 0.8618
Epoch 14/100
19/19 [==============================] - 0s 3ms/step - loss: 0.3402 - accuracy: 0.8484 - val_loss: 0.3873 - val_accuracy: 0.8026
Epoch 15/100
19/19 [==============================] - 0s 3ms/step - loss: 0.3328 - accuracy: 0.8402 - val_loss: 0.2741 - val_accuracy: 0.8750
Epoch 16/100
19/19 [==============================] - 0s 3ms/step - loss: 0.2998 - accuracy: 0.8731 - val_loss: 0.2821 - val_accuracy: 0.8750
Epoch 17/100
19/19 [==============================] - 0s 3ms/step - loss: 0.2986 - accuracy: 0.8682 - val_loss: 0.2836 - val_accuracy: 0.8684
Epoch 18/100
19/19 [==============================] - 0s 3ms/step - loss: 0.2799 - accuracy: 0.8830 - val_loss: 0.3651 - val_accuracy: 0.8421
Epoch 19/100
19/19 [==============================] - 0s 3ms/step - loss: 0.2716 - accuracy: 0.8699 - val_loss: 0.2666 - val_accuracy: 0.8750
Epoch 20/100
19/19 [==============================] - 0s 3ms/step - loss: 0.2689 - accuracy: 0.8847 - val_loss: 0.2811 - val_accuracy: 0.8553
Epoch 21/100
19/19 [==============================] - 0s 3ms/step - loss: 0.3101 - accuracy: 0.8484 - val_loss: 0.2641 - val_accuracy: 0.8816
Epoch 22/100
19/19 [==============================] - 0s 3ms/step - loss: 0.2756 - accuracy: 0.8781 - val_loss: 0.2594 - val_accuracy: 0.8618
Epoch 23/100
19/19 [==============================] - 0s 3ms/step - loss: 0.2818 - accuracy: 0.8699 - val_loss: 0.3033 - val_accuracy: 0.8684
Epoch 24/100
19/19 [==============================] - 0s 3ms/step - loss: 0.2606 - accuracy: 0.8731 - val_loss: 0.2436 - val_accuracy: 0.8947
Epoch 25/100
19/19 [==============================] - 0s 3ms/step - loss: 0.2615 - accuracy: 0.8781 - val_loss: 0.2342 - val_accuracy: 0.8816
Epoch 26/100
19/19 [==============================] - 0s 3ms/step - loss: 0.2797 - accuracy: 0.8748 - val_loss: 0.2504 - val_accuracy: 0.8750
Epoch 27/100
19/19 [==============================] - 0s 3ms/step - loss: 0.2615 - accuracy: 0.8781 - val_loss: 0.2662 - val_accuracy: 0.8618
Epoch 28/100
19/19 [==============================] - 0s 3ms/step - loss: 0.2668 - accuracy: 0.8764 - val_loss: 0.2941 - val_accuracy: 0.8684
Epoch 29/100
19/19 [==============================] - 0s 3ms/step - loss: 0.2826 - accuracy: 0.8682 - val_loss: 0.2881 - val_accuracy: 0.8750
Epoch 30/100
19/19 [==============================] - 0s 3ms/step - loss: 0.2844 - accuracy: 0.8616 - val_loss: 0.2518 - val_accuracy: 0.8882
Epoch 31/100
19/19 [==============================] - 0s 3ms/step - loss: 0.2789 - accuracy: 0.8748 - val_loss: 0.2424 - val_accuracy: 0.8816
Epoch 32/100
19/19 [==============================] - 0s 3ms/step - loss: 0.2511 - accuracy: 0.8731 - val_loss: 0.2452 - val_accuracy: 0.8750
Epoch 33/100
19/19 [==============================] - 0s 3ms/step - loss: 0.2507 - accuracy: 0.8896 - val_loss: 0.2615 - val_accuracy: 0.8750
Epoch 34/100
19/19 [==============================] - 0s 3ms/step - loss: 0.2915 - accuracy: 0.8616 - val_loss: 0.2843 - val_accuracy: 0.8487
Epoch 35/100
19/19 [==============================] - 0s 3ms/step - loss: 0.2930 - accuracy: 0.8797 - val_loss: 0.3587 - val_accuracy: 0.8421
Epoch 36/100
19/19 [==============================] - 0s 3ms/step - loss: 0.2727 - accuracy: 0.8666 - val_loss: 0.2308 - val_accuracy: 0.9145
Epoch 37/100
19/19 [==============================] - 0s 3ms/step - loss: 0.2633 - accuracy: 0.8731 - val_loss: 0.2321 - val_accuracy: 0.8750
Epoch 38/100
19/19 [==============================] - 0s 3ms/step - loss: 0.2793 - accuracy: 0.8649 - val_loss: 0.3253 - val_accuracy: 0.8421
Epoch 39/100
19/19 [==============================] - 0s 3ms/step - loss: 0.2617 - accuracy: 0.8814 - val_loss: 0.3619 - val_accuracy: 0.8618
Epoch 40/100
19/19 [==============================] - 0s 3ms/step - loss: 0.2380 - accuracy: 0.8896 - val_loss: 0.2493 - val_accuracy: 0.8750
Epoch 41/100
19/19 [==============================] - 0s 3ms/step - loss: 0.2319 - accuracy: 0.8913 - val_loss: 0.2244 - val_accuracy: 0.8816
Epoch 42/100
19/19 [==============================] - 0s 3ms/step - loss: 0.2261 - accuracy: 0.8929 - val_loss: 0.2432 - val_accuracy: 0.8750
Epoch 43/100
19/19 [==============================] - 0s 3ms/step - loss: 0.2372 - accuracy: 0.9012 - val_loss: 0.2432 - val_accuracy: 0.8750
Epoch 44/100
19/19 [==============================] - 0s 3ms/step - loss: 0.2174 - accuracy: 0.9061 - val_loss: 0.2078 - val_accuracy: 0.9145
Epoch 45/100
19/19 [==============================] - 0s 3ms/step - loss: 0.2362 - accuracy: 0.8979 - val_loss: 0.2724 - val_accuracy: 0.8553
Epoch 46/100
19/19 [==============================] - 0s 3ms/step - loss: 0.2277 - accuracy: 0.8929 - val_loss: 0.2707 - val_accuracy: 0.8684
Epoch 47/100
19/19 [==============================] - 0s 3ms/step - loss: 0.2269 - accuracy: 0.8946 - val_loss: 0.2293 - val_accuracy: 0.8750
Epoch 48/100
19/19 [==============================] - 0s 3ms/step - loss: 0.2257 - accuracy: 0.8995 - val_loss: 0.2294 - val_accuracy: 0.8882
Epoch 49/100
19/19 [==============================] - 0s 3ms/step - loss: 0.2209 - accuracy: 0.9012 - val_loss: 0.2905 - val_accuracy: 0.8553
Epoch 50/100
19/19 [==============================] - 0s 3ms/step - loss: 0.2327 - accuracy: 0.8929 - val_loss: 0.3305 - val_accuracy: 0.8618
Epoch 51/100
19/19 [==============================] - 0s 3ms/step - loss: 0.2245 - accuracy: 0.8896 - val_loss: 0.2535 - val_accuracy: 0.8750
Epoch 52/100
19/19 [==============================] - 0s 3ms/step - loss: 0.2289 - accuracy: 0.8962 - val_loss: 0.1992 - val_accuracy: 0.9145
Epoch 53/100
19/19 [==============================] - 0s 3ms/step - loss: 0.2381 - accuracy: 0.8748 - val_loss: 0.2838 - val_accuracy: 0.8816
Epoch 54/100
19/19 [==============================] - 0s 3ms/step - loss: 0.2249 - accuracy: 0.8830 - val_loss: 0.2056 - val_accuracy: 0.9013
Epoch 55/100
19/19 [==============================] - 0s 3ms/step - loss: 0.2239 - accuracy: 0.9028 - val_loss: 0.2321 - val_accuracy: 0.8816
Epoch 56/100
19/19 [==============================] - 0s 3ms/step - loss: 0.2160 - accuracy: 0.8995 - val_loss: 0.1957 - val_accuracy: 0.9145
Epoch 57/100
19/19 [==============================] - 0s 3ms/step - loss: 0.2238 - accuracy: 0.8913 - val_loss: 0.2571 - val_accuracy: 0.8684
Epoch 58/100
19/19 [==============================] - 0s 3ms/step - loss: 0.2474 - accuracy: 0.8929 - val_loss: 0.1984 - val_accuracy: 0.9013
Epoch 59/100
19/19 [==============================] - 0s 3ms/step - loss: 0.2578 - accuracy: 0.8880 - val_loss: 0.2438 - val_accuracy: 0.8684
Epoch 60/100
19/19 [==============================] - 0s 3ms/step - loss: 0.2255 - accuracy: 0.8946 - val_loss: 0.2079 - val_accuracy: 0.9013
Epoch 61/100
19/19 [==============================] - 0s 3ms/step - loss: 0.2139 - accuracy: 0.8995 - val_loss: 0.2261 - val_accuracy: 0.9079
Epoch 62/100
19/19 [==============================] - 0s 3ms/step - loss: 0.2198 - accuracy: 0.8946 - val_loss: 0.2110 - val_accuracy: 0.8882
Epoch 63/100
19/19 [==============================] - 0s 3ms/step - loss: 0.2189 - accuracy: 0.9028 - val_loss: 0.2168 - val_accuracy: 0.8816
Epoch 64/100
19/19 [==============================] - 0s 3ms/step - loss: 0.2060 - accuracy: 0.9127 - val_loss: 0.2443 - val_accuracy: 0.8684
Epoch 65/100
19/19 [==============================] - 0s 3ms/step - loss: 0.2081 - accuracy: 0.9044 - val_loss: 0.2123 - val_accuracy: 0.9145
Epoch 66/100
19/19 [==============================] - 0s 3ms/step - loss: 0.2131 - accuracy: 0.9012 - val_loss: 0.2168 - val_accuracy: 0.9079
Epoch 67/100
19/19 [==============================] - 0s 3ms/step - loss: 0.2363 - accuracy: 0.8896 - val_loss: 0.2274 - val_accuracy: 0.8684
Epoch 68/100
19/19 [==============================] - 0s 3ms/step - loss: 0.2155 - accuracy: 0.8962 - val_loss: 0.2164 - val_accuracy: 0.9013
Epoch 69/100
19/19 [==============================] - 0s 3ms/step - loss: 0.2183 - accuracy: 0.9012 - val_loss: 0.2024 - val_accuracy: 0.9211
Epoch 70/100
19/19 [==============================] - 0s 3ms/step - loss: 0.2094 - accuracy: 0.8995 - val_loss: 0.2210 - val_accuracy: 0.8750
Epoch 71/100
19/19 [==============================] - 0s 3ms/step - loss: 0.2096 - accuracy: 0.9012 - val_loss: 0.2027 - val_accuracy: 0.8947
Epoch 72/100
19/19 [==============================] - 0s 3ms/step - loss: 0.2102 - accuracy: 0.9012 - val_loss: 0.2595 - val_accuracy: 0.8684
Epoch 73/100
19/19 [==============================] - 0s 3ms/step - loss: 0.2110 - accuracy: 0.8946 - val_loss: 0.2429 - val_accuracy: 0.8750
Epoch 74/100
19/19 [==============================] - 0s 3ms/step - loss: 0.2051 - accuracy: 0.9143 - val_loss: 0.2009 - val_accuracy: 0.8947
Epoch 75/100
19/19 [==============================] - 0s 3ms/step - loss: 0.2113 - accuracy: 0.9077 - val_loss: 0.1938 - val_accuracy: 0.9145
Epoch 76/100
19/19 [==============================] - 0s 3ms/step - loss: 0.2117 - accuracy: 0.8995 - val_loss: 0.2132 - val_accuracy: 0.9013
Epoch 77/100
19/19 [==============================] - 0s 3ms/step - loss: 0.2054 - accuracy: 0.9044 - val_loss: 0.2215 - val_accuracy: 0.8816
Epoch 78/100
19/19 [==============================] - 0s 3ms/step - loss: 0.2129 - accuracy: 0.8946 - val_loss: 0.1940 - val_accuracy: 0.8947
Epoch 79/100
19/19 [==============================] - 0s 3ms/step - loss: 0.2202 - accuracy: 0.8979 - val_loss: 0.2061 - val_accuracy: 0.9079
Epoch 80/100
19/19 [==============================] - 0s 3ms/step - loss: 0.2103 - accuracy: 0.8995 - val_loss: 0.2066 - val_accuracy: 0.8882
Epoch 81/100
19/19 [==============================] - 0s 3ms/step - loss: 0.2169 - accuracy: 0.8962 - val_loss: 0.2113 - val_accuracy: 0.8750
Epoch 82/100
19/19 [==============================] - 0s 3ms/step - loss: 0.2225 - accuracy: 0.9028 - val_loss: 0.2290 - val_accuracy: 0.8684
Epoch 83/100
19/19 [==============================] - 0s 3ms/step - loss: 0.2300 - accuracy: 0.8880 - val_loss: 0.2068 - val_accuracy: 0.9276
Epoch 84/100
19/19 [==============================] - 0s 3ms/step - loss: 0.2071 - accuracy: 0.9077 - val_loss: 0.2418 - val_accuracy: 0.8882
Epoch 85/100
19/19 [==============================] - 0s 3ms/step - loss: 0.2072 - accuracy: 0.9044 - val_loss: 0.1993 - val_accuracy: 0.8947
Epoch 86/100
19/19 [==============================] - 0s 3ms/step - loss: 0.2103 - accuracy: 0.8995 - val_loss: 0.1983 - val_accuracy: 0.9079
Epoch 87/100
19/19 [==============================] - 0s 3ms/step - loss: 0.2092 - accuracy: 0.9028 - val_loss: 0.1967 - val_accuracy: 0.9079
Epoch 88/100
19/19 [==============================] - 0s 3ms/step - loss: 0.2032 - accuracy: 0.9061 - val_loss: 0.2055 - val_accuracy: 0.9013
Epoch 89/100
19/19 [==============================] - 0s 3ms/step - loss: 0.2281 - accuracy: 0.8913 - val_loss: 0.2588 - val_accuracy: 0.8750
Epoch 90/100
19/19 [==============================] - 0s 3ms/step - loss: 0.2158 - accuracy: 0.8946 - val_loss: 0.2232 - val_accuracy: 0.8816
Epoch 91/100
19/19 [==============================] - 0s 3ms/step - loss: 0.2058 - accuracy: 0.9061 - val_loss: 0.2767 - val_accuracy: 0.8618
Epoch 92/100
19/19 [==============================] - 0s 3ms/step - loss: 0.2301 - accuracy: 0.8913 - val_loss: 0.1907 - val_accuracy: 0.9145
Epoch 93/100
19/19 [==============================] - 0s 3ms/step - loss: 0.2286 - accuracy: 0.9028 - val_loss: 0.2530 - val_accuracy: 0.8882
Epoch 94/100
19/19 [==============================] - 0s 3ms/step - loss: 0.2383 - accuracy: 0.8946 - val_loss: 0.1936 - val_accuracy: 0.9079
Epoch 95/100
19/19 [==============================] - 0s 3ms/step - loss: 0.2104 - accuracy: 0.9012 - val_loss: 0.2276 - val_accuracy: 0.8816
Epoch 96/100
19/19 [==============================] - 0s 3ms/step - loss: 0.2128 - accuracy: 0.9044 - val_loss: 0.1996 - val_accuracy: 0.9079
Epoch 97/100
19/19 [==============================] - 0s 3ms/step - loss: 0.2056 - accuracy: 0.9028 - val_loss: 0.1958 - val_accuracy: 0.8882
Epoch 98/100
19/19 [==============================] - 0s 3ms/step - loss: 0.1967 - accuracy: 0.9012 - val_loss: 0.1978 - val_accuracy: 0.9211
Epoch 99/100
19/19 [==============================] - 0s 3ms/step - loss: 0.2105 - accuracy: 0.9061 - val_loss: 0.1948 - val_accuracy: 0.8947
Epoch 100/100
19/19 [==============================] - 0s 3ms/step - loss: 0.2111 - accuracy: 0.8979 - val_loss: 0.1871 - val_accuracy: 0.9145
6/6 [==============================] - 0s 3ms/step - loss: 0.1990 - accuracy: 0.8947
Test Loss: 0.19895000755786896
Test Accuracy: 0.8947368264198303
728x90
반응형

댓글