【发布时间】:2021-08-03 01:54:42
【问题描述】:
我对 LSTM 和 CNN 的概念还很陌生。所以,我目前已经分别定义了我的 LSTM 和 CNN:
LSTM:
def create_basic_rnn_model(config, output_size):
model = Sequential()
model.add(LSTM(50,batch_input_shape=(config.BATCH_SIZE,config.LOOK_BACK,32),
return_sequences=False, stateful=config.STATEFUL, dropout=0.5, activation="softsign"))
model.add(Dense(output_size, activation="sigmoid"))
model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])
model.summary()
return model
CNN:
model = Sequential()
model.add(Conv2D(filters=32, kernel_size=(5,5), padding='same', activation='relu', input_shape=(time_steps//subsample, 32, 1)))
model.add(MaxPooling2D(strides=2))
model.add(Conv2D(filters=48, kernel_size=(5,5), padding='valid', activation='relu'))
model.add(MaxPooling2D(strides=2))
model.add(Flatten())
model.add(Dense(256, activation='relu'))
model.add(Dense(84, activation='relu'))
model.add(Dense(6, activation='softmax'))
基于配置的数据输入:
class Config(object):
#data are downsampled, each 15th data point is taken
DOWNSAMPLING = 15
LOOK_BACK = 35
BATCH_SIZE = 512
#Iterations on stateful model, epochs on non-stateful
EPOCHS = 30
ITERATIONS = 1
STATEFUL = False
SHUFFLE = not STATEFUL
VERBOSE = 0
模型将在哪里训练:
def train_rnn(subjects, labelToTrain, trainSeparateLabels, config, modelGenerator, callbacks):
#Calculating output size of trained model
LabelsRange = [labelToTrain,labelToTrain+1]
if(not trainSeparateLabels):
LabelsRange = [0,6]
OutputSize = LabelsRange[1] - LabelsRange[0]
#Model creation
model = modelGenerator(config, output_size = OutputSize)
#Training
for i in range(config.ITERATIONS):
#For specified subjects
for subject in subjects:
#For series 1-7
for j in range(1,8):
signals, labels = load_train_data_prepared(subject = subject,series = j)
#Create sequences
X_train_signals, X_train_labels = create_sequences(
None,
None,
signals.iloc[::config.DOWNSAMPLING].values,
labels.iloc[::config.DOWNSAMPLING].values,
look_back=config.LOOK_BACK
)
X_train_labels = X_train_labels[:,LabelsRange[0]:LabelsRange[1]]
croppedSize = math.floor(len(X_train_signals)/config.BATCH_SIZE)*config.BATCH_SIZE
#Train model on relevant label (calling fit repeatedly in keras doesnt reset the model)
model.fit(
X_train_signals[0:croppedSize],
X_train_labels[0:croppedSize],
epochs=config.EPOCHS,
batch_size=config.BATCH_SIZE,
shuffle=config.SHUFFLE,
verbose=config.VERBOSE,
callbacks=callbacks
)
if(config.STATEFUL):
model.reset_states()
print("FITTING DONE")
return model, LabelsRange
请问我将如何结合我的 LSTM 和 CNN?我已经搜索了几种方法,但它们都不起作用。我已经搜索了 ConvLSTM2D,但似乎无法将它们连接在一起。提前致谢。
【问题讨论】:
-
对于时间序列数据(您将使用一维卷积),通常首先使用卷积从信号中提取特征,然后使用循环层来学习这些特征的时间模式,并以一些完全连接的层来匹配你想要的输出形状。我想这个过程在很大程度上与 2D 卷积相同。
-
感谢您的回复。你能帮我解决我的代码吗?我不知道如何连接这些层。
标签: tensorflow keras conv-neural-network lstm