我正在使用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()
给了我所有的权重。但是我怎样才能在每个时代之后得到它们?model.get_config()
给了我'stateful': False
。如果我执行一个有状态的LSTM,实际会发生什么变化&检查哪些值我能理解变化?return_sequences=False
会发生什么变化?运行上述代码,10个纪元后的损失历史记录如下,
[0.016399867401633194, 0.0029856997435597997, 0.0021351441705040426, 0.0016288172078515754, 0.0012535296516730061, 0.0010065438170736181, 0.00085688360991555948, 0.0007937529246583822, 0.00073356743746738303, 0.00069794598373472037]
准确度为77%。
抱歉,如果我问了很多话。如果可能,请分享您的帮助。
答案 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
由于循环网络按时间步长工作,因此每个步骤都有结果 您可以选择输出所有这些结果,最后得到一个序列(与输入相同的时间步长)。或者您可以选择仅获得最终结果,丢弃时间步骤:
对不起,这绝对是一个悬而未决的问题。它完全取决于您想要做什么,数据大小,模型的架构。
确实没有现成的答案。为特定应用创建完美的架构正是每个人在世界各地寻求的。
您可以进行实验或尝试找到与您正在工作的同类工作的论文,以查看“到目前为止”的最佳实践。
一些相关问题: