Deep learning 深入挖掘LSTM Keras

Deep learning 深入挖掘LSTM Keras,deep-learning,keras,lstm,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.lay

我正在使用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
    类的损失。如何获得每个历元后的权重?我知道
    模型。获取权重()
    为我提供所有权重。但是我怎样才能在每个时代之后得到它们呢
  • 我如何才能最佳地知道我应该在LSTM和密集层中使用哪种激活函数,以便我的数据执行“最佳”并提供良好的准确性
  • model.get\u config()
    给我提供了
    “有状态”:False
    。如果执行statefull LSTM,实际会发生什么变化&检查哪些值可以理解变化
  • 如果
    return\u 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%

我还添加了几个迭代方法的表

对不起,我问了很多。如果可能,请分享您的帮助。

每个历元后的权重: 对于每个历元之后的操作,您可以使用
回调
,尤其是,它允许非常灵活的使用

定义一个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='classifical\u crossentropy'

  • 具有许多真实类的分类问题通常使用
    activation='sigmoid'
    loss='binary\u crossentropy'

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

有状态网络。 循环网络有一个“内部状态”,大致上是通过一个序列逐步建立起来的“记忆”

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

  • 在非状态网络中,每个序列的状态都会重置
  • 在有状态网络中,状态不会自动重置
不重置状态的想法是能够分批划分每个序列。如果您的序列太长(导致RAM或性能问题),您可以将它们分成几个部分,模型将理解您的批次不是“新序列”,而是“以前序列的续集”

值得注意的变化是需要定义额外的参数,如批量大小和按顺序正确传递数据


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

  • 返回序列=真:输出(批大小、时间步长、内存单元)
  • 返回序列=False:输出(批大小、内存单元)

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

确实没有现成的答案。为某个应用程序创建一个完美的体系结构正是全世界每个人都在寻求的

你可以做实验,或者试着找到与你正在做的事情相同的论文,看看“到目前为止”的最佳实践是什么

一些相关问题:

  • 过度拟合:您的模型太强,或者您的数据太少。你的训练准确度会很高,但你的验证准确度不会提高。大体上,模型是在记忆训练数据,因为它太好了
  • 不合适:你的模型太弱,根本无法解决任务

太好了。。解释得很好<代码>myWeights.add(model.get_weights())对我不起作用。扔给我;NameError:未定义名称“myWeights”,使该代码适合您的需要。您想将重量存储在哪里?打印它们?拯救他们?把它们放在一个变量里?在这里,您可以选择如何处理
模型。获取权重()
——我编辑了我的答案,以获得更具体的示例。