2016-11-26 2 views
3

Для дальнейшего понимания RNN и LSTM я пытаюсь реализовать простой LSTM для оценки частоты и фазы синусоиды. Это, как оказалось, с трудом сходится. MSE довольно высок (в тысячах) Единственное, что, похоже, немного работает, если я создаю синусоиды, имеющие одну и ту же фазу (начиная с того же времени) И учебные образцы передаются как вектор, а не как образцы по одному, как в RNN. Между тем, вот код, который не сходится. В этом коде я удалил разную фазу для каждой частоты Любые мысли о том, что здесь не такОценка RNN LSTM частоты и фазы синусоидальной волны

Я посмотрел на это Keras : How should I prepare input data for RNN? и попытался изменить свой вклад для этого, но не повезло.

from keras.models import Sequential 
from keras.layers.core import Activation, Dropout ,Dense 
from keras.layers.recurrent import GRU, LSTM 
import numpy as np 
from sklearn.cross_validation import train_test_split 

np.random.seed(0) # For reproducability 
TrainingNums = 12000 #Number of Trials 
numSampleInEach = 200 #Length of each sinewave 
numPhaseExamples = 1 #for each freq, so many different phases 

X = np.zeros((TrainingNums,numSampleInEach)) 
Y = np.zeros((TrainingNums,2)) 

#create sinewaves here 
for iii in range(0, TrainingNums//numPhaseExamples): 
    freq = np.round(np.random.randn()*100) 
    for kkk in range(0,numPhaseExamples): 
    #set timeOffset below to 0, if you want the same phase every run 
     timeOffset = 0# 0 for now else np.random.randint(0,90) 
     X[iii*numPhaseExamples+kkk,:] = np.sin(2*3.142*freq*np.linspace(0+timeOffset,numSampleInEach-1+timeOffset,numSampleInEach)/10000) 
     Y[iii*numPhaseExamples+kkk,0] = freq 
     Y[iii*numPhaseExamples+kkk,1] = timeOffset 

X = np.reshape(X,(TrainingNums, numSampleInEach,1)) 
#This below works when there is no phase variation 
#X = np.reshape(X,(TrainingNums, numSampleInEach,1)) 

X_train, X_test, y_train, y_test = train_test_split(X, Y, test_size=0.33) 

#Now create the RNN 
model = Sequential() 
#batch_input_shape = [batch_size,timeStep,dataDimension] 
model.add(LSTM(128,input_shape= (numSampleInEach,1),return_sequences=True)) 

#For things to work for freq estimation only the following change helps 
#model.add(LSTM(128,input_shape=(1,numSampleInEach),return_sequences=True)) 
model.add(Dropout(0.2)) 
model.add(Activation("relu")) 

#second layer of RNN 
model.add(LSTM(128,return_sequences=False)) 
model.add(Dropout(0.2)) 
model.add(Activation("relu")) 

model.add(Dense(2,activation="linear")) 
model.compile(loss="mean_squared_error", optimizer="Nadam") 
print model.summary() 

print "Model compiled." 
model.fit(X_train, y_train, batch_size=16, nb_epoch=150, 
     validation_split=0.1) 
result = model.evaluate(X_test, y_test, verbose=0) 
print 'mse: ', result 

Итак вопросы:

  1. Является ли это право ожидать РНН оценить частоту и фазу?
  2. Я пробовал пару архитектур (многослойный LSTM, один слой с большим количеством узлов и т. Д.). Я также пробовал разные архитектуры.
+1

достигнут некоторый прогресс, запись здесь для других. В первую очередь, после LSTM активации не должно быть. Активация между слоями LSTM - это ошибка – krat

ответ

1

Удаление активации после LSTM правильный ответ

Смежные вопросы