首页 文章

深入挖掘LSTM Keras

提问于
浏览
0

我正在使用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和密集层使用哪种激活功能,以便我的数据表现“最佳”并且给我很好的准确性?

  • 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 回答

  • 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

    理想的细胞数量

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

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

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

    一些相关问题:

    • 过度拟合:您的模型太强大,或者您的数据太少 . 您的训练准确性很高,但您的验证准确性并不太好

    • 欠配合:你的模型太弱,它根本无法解决任务

相关问题