Deep learning 深入挖掘LSTM Keras
我正在使用LSTM框架对具有四列的传感器数据运行回归问题。我还没有使用任何正规化 我使用的代码如下所述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
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()
。如果执行statefull LSTM,实际会发生什么变化&检查哪些值可以理解变化“有状态”:False
- 如果
会发生什么变化return\u sequences=False
- 如何为LSTM和密集层选择最佳的隐藏节点(神经元)数量
[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'
- 其他问题也应该有更好的选择,这取决于应用程序
- 在非状态网络中,每个序列的状态都会重置
- 在有状态网络中,状态不会自动重置李>
返回序列 由于循环网络以时间步长工作,因此每个时间步长都有结果。
您可以选择输出所有这些结果,结果是一个序列(与输入的时间步数相同)。或者,您可以选择仅获取最终结果,放弃时间步长:
- 返回序列=真:输出(批大小、时间步长、内存单元)
- 返回序列=False:输出(批大小、内存单元)
- 过度拟合:您的模型太强,或者您的数据太少。你的训练准确度会很高,但你的验证准确度不会提高。大体上,模型是在记忆训练数据,因为它太好了
- 不合适:你的模型太弱,根本无法解决任务
模型。获取权重()
——我编辑了我的答案,以获得更具体的示例。