深入挖掘LSTM Keras

时间:2017-07-07 09:25:14

标签: deep-learning keras lstm

我正在使用LSTM框架对具有四列的传感器数据运行回归问题。我还没有使用任何正规化。

我在下面指定的代码;

import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
import math
import keras
from keras.models import Sequential
from keras.layers import Dense, Dropout, Activation
from keras.layers import LSTM
from sklearn.preprocessing import MinMaxScaler
from sklearn.metrics import mean_squared_error
from keras import callbacks
from keras.layers import Flatten

# load the dataset
gbx_data = pd.read_csv('/home/prm/Downloads/aggregated_vibration.csv', usecols=[4,5,6,7])
dataset = gbx_data.values
dataset = dataset.astype('float32')

scaler = MinMaxScaler(feature_range=(0, 1))
dataset = scaler.fit_transform(dataset)


train_size = int(len(dataset) * 0.63)
test_size = len(dataset) - train_size
train, test = dataset[0:train_size,:], dataset[train_size:len(dataset),:]
print(len(train), len(test))

def create_dataset(dataset, look_back):
  dataX, dataY = [], []
  for i in range(len(dataset)-look_back-1):
    a = dataset[i:(i+look_back), :]
    dataX.append(a)
    dataY.append(dataset[i + look_back, :])
  return np.array(dataX), np.array(dataY)


look_back = 10
trainX, trainY = create_dataset(train, look_back)
testX, testY = create_dataset(test, look_back)

trainX = trainX.reshape(trainX.shape[0], look_back, trainX.shape[2])    # model input shape & model output shape will be same always #
testX = testX.reshape(testX.shape[0], look_back, testX.shape[2])

batch_size = 120

class LossHistory(keras.callbacks.Callback):
    def on_train_begin(self, logs={}):
        self.losses = []

    def on_epoch_end(self, epoch, logs={}):
        self.losses.append(logs.get('loss'))


model=Sequential()
model.add(LSTM(10, return_sequences=True, input_shape=(look_back, 4), activation='relu'))
model.add(Dropout(0.2))
model.add(LSTM(12, return_sequences=True, input_shape=(look_back, 4), activation='relu'))
model.add(Dropout(0.2))
model.add(Flatten())
model.add(Dense(4, activation='relu'))
model.compile(loss='mean_squared_error', optimizer='adam', metrics=['accuracy'])
history = LossHistory()
model.fit(trainX, trainY, epochs=10, batch_size=batch_size, callbacks=[history])
print(history.losses)

我想知道以下问题的规格;

  • 对于每个纪元结束,我得到了LossHistory课程的损失。如何在每个时代之后获得权重?我知道model.get_weights()给了我所有的权重。但是我怎样才能在每个时代之后得到它们?
  • 如何才能最佳地了解我应该在LSTM和LSTM中使用哪种激活功能?密集层,以便我的数据执行' best '&给了我良好的准确度?
  • model.get_config()给了我'stateful': False。如果我执行一个有状态的LSTM,实际会发生什么变化&检查哪些值我能理解变化?
  • 如果return_sequences=False会发生什么变化?
  • 如何最佳地选择LSTM&的隐藏节点(神经元)的数量?密集层?

运行上述代码,10个纪元后的损失历史记录如下,

[0.016399867401633194, 0.0029856997435597997, 0.0021351441705040426, 0.0016288172078515754, 0.0012535296516730061, 0.0010065438170736181, 0.00085688360991555948, 0.0007937529246583822, 0.00073356743746738303, 0.00069794598373472037]

准确度为77%。

我也在添加几个迭代方法的表格。enter image description here

抱歉,如果我问了很多话。如果可能,请分享您的帮助。

1 个答案:

答案 0 :(得分:1)

每个时期后的权重:

对于每个纪元后的事情,您可以使用Callback,尤其是LambdaCallback,这样可以非常灵活地使用。

定义一个lambda回调,它将在每个纪元后得到权重:

getWeightsCallback = LambdaCallback(on_epoch_end=getWeightsFunction)

其中:

myWeights = []
def getWeightsFunction(epoch,logs):
    #adapt this code:
    myWeights.append(model.get_weights())

然后将回调添加到fit方法:

model.fit(....., callbacks=[getWeightsCallback])

激活功能

不幸的是,如果有答案,我无法回答。但我相信这是一个直观的事情,它应该进行实验,直到找到最适合您的特定任务和模型的东西。

但我所知道的是最后一层。这个与最终任务完全相关。

  • 使用activation='softmax'loss='categorical_crossentropy'

  • 的分类问题,只有一个真正的类,有很多好处
  • 许多真正类的分类问题通常使用activation='sigmoid'loss='binary_crossentropy'

  • 其他问题也应该有更好的选择,具体取决于应用程序。

有状态网络。

循环网络具有“内部状态”,这大致是通过逐步执行序列构建的“内存”。

此状态对于每个序列都是唯一的。每个序列构建一个状态。

  • 在非有状态网络中,为每个序列重置状态
  • 在有状态网络中,状态不会自动重置。

不重置状态的想法是能够分批划分每个序列。如果序列太长(导致RAM或性能问题),则将它们分成几部分,模型将理解您的批次不是“新序列”,而是“先前序列的后续”。

显着的变化是需要定义额外的参数,例如批量大小和按顺序正确传递数据。

Keras documentation
An indirectly related question

返回序列

由于循环网络按时间步长工作,因此每个步骤都有结果 您可以选择输出所有这些结果,最后得到一个序列(与输入相同的时间步长)。或者您可以选择仅获得最终结果,丢弃时间步骤:

  • 返回序列= True:输出(批量大小,时间步长,存储器单元)
  • 返回序列= False:输出(批量大小,内存单元格)

Same documentation as before

理想的细胞数

对不起,这绝对是一个悬而未决的问题。它完全取决于您想要做什么,数据大小,模型的架构。

确实没有现成的答案。为特定应用创建完美的架构正是每个人在世界各地寻求的。

您可以进行实验或尝试找到与您正在工作的同类工作的论文,以查看“到目前为止”的最佳实践。

一些相关问题:

  • 过度拟合:您的模型太强大,或者您的数据太少。您的训练准确性会很好,但您的验证准确性不会发生变化。粗略地说,该模型正在记忆训练数据,因为它太好了
  • 不合适:你的模型太弱,根本无法解决任务