Skip to article frontmatterSkip to article content
Site not loading correctly?

This may be due to an incorrect BASE_URL configuration. See the MyST Documentation for reference.

합성곱 기반 시계열 처리

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
%matplotlib inline
import pandas as pd

files = {'train': '/data/ford/train.tsv', 'test': '/data/ford/test.tsv'}

try:
    train = pd.read_table(files['train'], header=None)
    test = pd.read_table(files['test'], header=None)
except FileNotFoundError:
    print('Downloading files ...')
    url = "https://raw.githubusercontent.com/hfawaz/cd-diagram/master/FordA/"
    train = pd.read_table(f'{url}FordA_TRAIN.tsv', header=None)
    test = pd.read_table(f'{url}FordA_TEST.tsv', header=None)

    train.to_csv('/data/ford/train.tsv', sep='\t', encoding='utf8', index=False, header=False)
    test.to_csv('/data/ford/test.tsv', sep='\t', encoding='utf8', index=False, header=False)
y_train = train[0]
X_train = train.drop(columns=0)
y_test = test[0]
X_test = test.drop(columns=0)
y_train.value_counts()
X_train.shape, X_test.shape
def compare_features(sample_index):
    frame = pd.concat([
        X_train[y_train == 1].iloc[sample_index].reset_index(drop=True),
        X_train[y_train == -1].iloc[sample_index].reset_index(drop=True)
    ], axis=1)
    frame.columns = [1, -1]
    return frame

compare_features(0).plot()
X_train = X_train.values.reshape(*X_train.shape, 1)
X_test = X_test.values.reshape(*X_test.shape, 1)
X_train.shape, X_test.shape
y_train = np.where(y_train == 1, 1, 0)
y_test = np.where(y_test == 1, 1, 0)
idx = np.random.permutation(len(X_train))
X_train = X_train[idx]
y_train = y_train[idx]
from tensorflow.keras import Sequential, layers

def make_model(input_shape):
    model = Sequential([
        layers.Input(input_shape),
        layers.Conv1D(64, kernel_size=3, padding='same'),
        layers.BatchNormalization(),
        layers.Activation('relu'),

        layers.Conv1D(64, kernel_size=3, padding='same'),
        layers.BatchNormalization(),
        layers.Activation('relu'),

        layers.Conv1D(64, kernel_size=3, padding='same'),
        layers.BatchNormalization(),
        layers.Activation('relu'),

        layers.GlobalAveragePooling1D(),
        layers.Dense(1)
    ])

    return model

model = make_model(input_shape=X_train.shape[1:])
model.summary()
from tensorflow.keras.losses import BinaryCrossentropy
from tensorflow.keras.callbacks import ModelCheckpoint, ReduceLROnPlateau, EarlyStopping

model.compile(optimizer='adam', loss=BinaryCrossentropy(from_logits=True), metrics=['acc'])
history = model.fit(
    X_train, y_train, batch_size=32, epochs=500, validation_split=0.2, 
    callbacks=[
        ModelCheckpoint("/model/ford/", monitor='val_loss', save_best_only=True),
        ReduceLROnPlateau(factor=0.5, patience=20, min_lr=0.0001),
        EarlyStopping(patience=50, verbose=1)
    ])
print('Loss: {0}, Acc: {1:.2%}'.format(*model.evaluate(X_test, y_test)))
pd.DataFrame(history.history)[['loss', 'val_loss']].plot()
pd.DataFrame(history.history)[['acc', 'val_acc']].plot()