Модель обработки сигналов Keras - PullRequest
0 голосов
/ 12 декабря 2018

Эй, у меня проблема с моделью для обработки некоторых сигналов.

Контекст: у меня есть несколько сигналов, хранящихся в массивах с числами в виде чисел с плавающей запятой, все они имеют разную длину, и мне нужно извлечь смещение сигналав определенный момент времени, я не знаю, где находится это место в массиве, поэтому я не могу изменить размер массива (чтобы все сигналы имели одинаковую длину).

У меня есть около8000 сигналов с известным смещением.Поэтому я хочу тренировать модель на них.

Что у меня есть на данный момент

model = Sequential()
model.add(LSTM(256, input_shape=(None,1)))
model.add(Dropout(0.2))
model.add(Dense(1, activation="tanh"))
adam = Adam(lr=0.001)
model.compile(loss='mse', optimizer=adam,metrics=['mse', 'acc'])
  • input_shape = (None, 1), поскольку я не знаю длину массива
  • активации =«tanh» последний слой должен быть чем-то, что также может возвращать отрицательный результат.

В основном моя модель не должна зависеть от длины, должна выводить отрицательные и положительные значения.Эта модель не работает для того, что мне нужно, и мне было интересно, если кто-то может указать мне в лучшем направлении.

"Не работает", как после 1000 эпох обучения ~ 200 сигналов / партия, с100 шагов / эпоха, результат был "случайным" и очень далек от реального значения.

Я думал об использовании ConvNet вместо LSTM.Но я не могу использовать «Flatten» или «Reshape».

Один сигнал с сохранением savetxt

-1.118700742721557617e+00
-9.661099910736083984e-01
-9.661099910736083984e-01
-1.088183045387268066e+00
-1.149218797683715820e+00
-1.118700742721557617e+00
-1.088183045387268066e+00
-1.118700742721557617e+00
-1.149218797683715820e+00
-1.088183045387268066e+00
-1.088183045387268066e+00
-1.118700742721557617e+00
-1.179736852645874023e+00
-1.149218797683715820e+00
-1.118700742721557617e+00
-1.149218797683715820e+00
-1.240772962570190430e+00
-1.301809072494506836e+00
-1.240772962570190430e+00
-1.179736852645874023e+00
-1.149218797683715820e+00
-1.240772962570190430e+00
-1.332327008247375488e+00
-1.393362998962402344e+00
-1.362845063209533691e+00
-1.271291017532348633e+00
-1.240772962570190430e+00
-1.362845063209533691e+00
-1.423881053924560547e+00
-1.301809072494506836e+00
-1.088183045387268066e+00
-1.027147054672241211e+00
-1.118700742721557617e+00
-1.240772962570190430e+00
-1.332327008247375488e+00
-1.393362998962402344e+00
-1.332327008247375488e+00
-1.301809072494506836e+00
-1.271291017532348633e+00
-1.210254907608032227e+00
-1.057664990425109863e+00
-9.966289997100830078e-01
-9.966289997100830078e-01
-8.440380096435546875e-01
-5.083401203155517578e-01
-3.252310752868652344e-01
-4.778220653533935547e-01
-7.219660282135009766e-01
-7.219660282135009766e-01
-6.609300374984741211e-01

1 Ответ

0 голосов
/ 12 декабря 2018

Я не уверен, "почему" вы считаете модель "не работающей".Если это из-за метрик, хорошо, возможно, вы могли бы увеличить количество слоев, сделать его более мощным / сложным.

Но если причина в другом, укажите это в вопросе.

Вы можете построить сверточную модель, используя GlobalMaxPooling2D или GlobalAveragePooling2D вместо Flatten или Reshape.

Одна очень интересная вещь, которую вы можете сделать в любой модели (включая модель LSTM), - это добавить данные для текущей позиции.

Например, если ваш сигнал имеет длину 3: [s0, s1, s2], вы можете добавить текущее местоположение каждого шага, передавая входные данные в форме (None,2), например: [[s0,0],[s1,1],[s2,2]]

С этим, вы поможете вашей модели иметь абсолютные и относительные позиции в явном виде без зависимости от очень длительной обработки.

...