【发布时间】:2017-07-07 09:25:14
【问题描述】:
我正在使用 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()给了我所有的权重。但是如何在每个 epoch 之后获得它们? - 我如何才能最佳地了解我应该在 LSTM 和密集层中使用哪个激活函数,以便我的数据执行“最佳”并为我提供良好的准确性?
-
model.get_config()给了我'stateful': False。如果我执行一个有状态的 LSTM,实际会发生什么变化并检查哪些值我可以理解变化? - 如果
return_sequences=False会发生什么变化? - 如何为 LSTM 和 Dense 层选择最佳的隐藏节点(神经元)数量?
运行上述代码,10个epoch后的损失历史如下,
[0.016399867401633194, 0.0029856997435597997, 0.0021351441705040426, 0.0016288172078515754, 0.0012535296516730061, 0.0010065438170736181, 0.00085688360991555948, 0.0007937529246583822, 0.00073356743746738303, 0.00069794598373472037]
准确率为 77%。
对不起,如果我问了很多。如果可能,请分享您的帮助。
【问题讨论】:
标签: deep-learning keras lstm