Форма ввода для 1D сети свертки в кератах - PullRequest
1 голос
/ 15 февраля 2020

Я совершенно новичок в keras и у меня проблема с пониманием форм.

Я хотел создать модель 1D Conv Keras следующим образом, я не знаю, правильно это или нет:

TIME_PERIODS = 511
num_sensors = 2
num_classes = 4
BATCH_SIZE = 400
EPOCHS = 50
model_m = Sequential()
model_m.add(Conv1D(100, 10, activation='relu', input_shape=(TIME_PERIODS, num_sensors)))
model_m.add(Conv1D(100, 10, activation='relu'))
model_m.add(MaxPooling1D(3))
model_m.add(Conv1D(160, 10, activation='relu'))
model_m.add(Conv1D(160, 10, activation='relu'))
model_m.add(GlobalAveragePooling1D())
model_m.add(Dropout(0.5))
model_m.add(Dense(num_classes, activation='softmax'))

Входные данные, которые я имею, представляют собой 888 различных кадров данных панды, где каждый кадр имеет форму (511, 3), где 511 - это число сигнальных точек, а 0-й столбец - значения датчика 1, 1-й столбец - значения датчика 2, а 2-й столбец - помеченные сигналы.

Теперь, как я должен объединить все свои 888 различных фреймов данных панды, чтобы я получил x_train и y_train из X и Y, используя Sklearn train_test_split.

Кроме того, я думаю, что форма ввода я определение для модели неверно, и я не думаю, что на самом деле у меня есть TIME_PERIODS, потому что для 1-временной точки у меня есть 2 значения входа датчика ( оранжевый, синий строка) и 1 метка выхода ( зеленая линия).

enter image description here

Контекст проблемы, которую я пытаюсь решить, например: ввод: основанные на времени значения двух датчиков говорят за 1 AM-2 AM часа от user, output: диапазон времени, например, когда пользователь выполнял действие 1, действие 2, действие X в 1: 10-1: 15, 1: 15-1: 30, 1: 30-2: 00, приведенный выше график покажите пример входных и выходных данных обучения.

Проблема вызвана здесь , но в моем случае у меня нет периода времени, у моей 1-временной точки есть 1 выходная метка.

Обновление 1: я почти уверен, что мой TIME_PERIODS = 1, так как для прогноза я дам 511 входных данных и рассчитываю получить 511 выходных значений.

Ответы [ 2 ]

0 голосов
/ 17 февраля 2020

По меньшей мере, вы на правильном пути. Полное решение для этого будет выглядеть так:

df = pd.concat([pd.read_csv(fname, index_col=<int>, header=<int>) for f filenames], ignore_index=True, axis=0)

inputs = df.loc[:,:-1]
labels = df.loc[:,0]

X_train, X_test, y_train, y_test = train_test_split(inputs, labels, test_size=<float>)

Чтобы добавить немного больше информации, обратите внимание, как у вас дела,

model_m.add(Conv1D(100, 10, activation='relu', input_shape=(TIME_PERIODS, num_sensors)))

, а не

model_m.add(Conv1D(100, 10, activation='relu', padding='SAME', input_shape=(TIME_PERIODS, num_sensors)))

Таким образом, поскольку вы не устанавливаете padding="Same" для слоев свертки, это может привести к нежелательному эффекту того, что ввод становится все меньше и меньше по мере того, как вы go углубляетесь в модель. Если это то, что вам нужно, это нормально. В противном случае установите `padding =" SAME ".

Например, без одинакового заполнения вы получите ширину около 144 при переходе на слой GlobalPooling, где, если вы используете тот же заполнение было бы примерно 170. Здесь это не является серьезной проблемой, но может легко привести к отрицательным размерам входных данных для более глубоких слоев.

0 голосов
/ 17 февраля 2020

Каждый фрейм данных является независимой последовательностью?

 fileNames = get a list of filenames here, you can maybe os.listdir for that
 allFrames = [pandas.read_csv(filename,... other_things...).values for filename in fileNames]


 allData = np.stack(allFrames, axis=0)
 inputData = allData[:,:num_sensors]
 outputData = allData[:, -1:]

Теперь вы можете использовать тест поезда, разделив его так, как вы хотите. Ваша форма ввода правильная.


Если вы хотите предсказать всю последовательность, вам нужно удалить пулы. Каждая свертка должна использовать padding='same'.

И, возможно, вам следует использовать слой Biridectional(LSTM(units, return_sequences=True)) где-нибудь, чтобы сделать вашу модель сильнее.


Простая модель в качестве примера. (Обратите внимание, что модели полностью открыты для творчества)

from keras.layers import *

inputs = Input((TIME_PERIODS,num_sensors)) #Should be called "time_steps" to be precise
outputs = Conv1D(any, 3, padding='same', activation = 'tanh')(inputs)
outputs = Bidirectional(LSTM(any, return_sequences=True))(outputs)
outputs = Conv1D(num_classes, activation='softmax', padding='same')(outputs)

model = keras.models.Model(inputs, outputs)
...