【问题标题】:Forming a Multi input LSTM in Keras在 Keras 中形成多输入 LSTM
【发布时间】:2019-01-07 04:24:17
【问题描述】:

我正在尝试使用神经网络从共振能量中预测中子宽度(我对 Keras/NNs 很陌生,所以提前道歉)。

据说共振能量和中子宽度之间存在联系,能量单调增加之间的相似性可以类似于时间序列问题进行建模。

本质上,我有两列data,第一列是共振能量,另一列包含每行各自的中子宽度。我决定使用 LSTM 层通过利用之前的计算来帮助网络预测。

从各种tutorialsother answers 来看,使用“look_back”参数来允许网络在创建数据集时使用以前的时间步来帮助预测当前时间步似乎很常见,例如

trainX, trainY = create_dataset(train, look_back)

我想问一下关于形成NN的问题:

1) 鉴于我的特定应用,我是否需要将每个共振能量显式映射到同一行上相应的中子宽度?

2) Look_back 表示 NN 可以使用多少个先前的值来帮助预测当前值,但它是如何与 LSTM 层结合的呢?即我不太明白如何使用两者?

3) 我应该在什么时候反转 MinMaxScaler?

这是主要的两个查询,对于 1)我认为它可以不这样做,对于 2)我相信这是可能的,但我真的不明白如何。我无法完全弄清楚我在代码中做错了什么,理想情况下,我想在代码工作后绘制预测与火车中参考值的相对偏差并测试数据。任何建议将不胜感激:

import numpy
import matplotlib.pyplot as plt
import pandas
import math

from keras.models import Sequential
from keras.layers import Dense, LSTM, Dropout
from sklearn.preprocessing import MinMaxScaler
from sklearn.metrics import mean_squared_error


# convert an array of values into a dataset matrix

def create_dataset(dataset, look_back=1):
    dataX, dataY = [], []
    for i in range(len(dataset) - look_back - 1):
        a = dataset[i:(i + look_back), 0]
        dataX.append(a)
        dataY.append(dataset[i + look_back, 1])
    return numpy.array(dataX), numpy.array(dataY)

# fix random seed for reproducibility
numpy.random.seed(7)      
# load the dataset
dataframe = pandas.read_csv('CSVDataFe56Energyneutron.csv', engine='python') 
dataset = dataframe.values
print("dataset")
print(dataset.shape)
print(dataset)

# normalize the dataset
scaler = MinMaxScaler(feature_range=(0, 1))
dataset = scaler.fit_transform(dataset)
print(dataset)
# split into train and test sets
train_size = int(len(dataset) * 0.67) 
test_size = len(dataset) - train_size
train, test = dataset[0:train_size, :], dataset[train_size:len(dataset), :]

# reshape into X=t and Y=t+1
look_back = 3
trainX, trainY = create_dataset(train, look_back)  
testX, testY = create_dataset(test, look_back)
# reshape input to be  [samples, time steps, features]
trainX = numpy.reshape(trainX, (trainX.shape[0], look_back, 1))
testX = numpy.reshape(testX, (testX.shape[0],look_back, 1))
# # create and fit the LSTM network
# 
number_of_hidden_layers=16
model = Sequential()
model.add(LSTM(6, input_shape=(look_back,1)))
for x in range(0, number_of_hidden_layers):
    model.add(Dense(50, activation='relu'))
model.add(Dense(1))
model.compile(loss='mean_squared_error', optimizer='adam')
history= model.fit(trainX, trainY, nb_epoch=200, batch_size=32)
trainPredict = model.predict(trainX)
testPredict = model.predict(testX)
print('Train Score: %.2f MSE (%.2f RMSE)' % (trainScore, math.sqrt(trainScore)))
testScore = model.evaluate(testX, testY, verbose=0)
print('Test Score: %.2f MSE (%.2f RMSE)' % (testScore, math.sqrt(testScore)))

【问题讨论】:

    标签: python neural-network keras deep-learning lstm


    【解决方案1】:

    1) 鉴于我的特定应用程序,我是否需要显式映射每个 共振能量与其对应的中子宽度在同一行?

    是的,你必须这样做。基本上你的数据必须是一个形状。 X=[timestep, timestep,...] y=[label, label,...]

    2) Look_back 表示 NN 可以使用多少先前的值来帮助 预测当前值,但它如何与 LSTM 结合 层?即我不太明白如何使用两者?

    LSTM 是一个序列感知层。您可以将其视为隐藏马尔可夫模型。它需要第一个时间步,计算一些东西,然后在下一个时间步中考虑先前的计算。 Look_back,通常称为sequence_length,只是最大时间步数。

    3) 我在什么时候反转 MinMaxScaler?

    为什么要这样做?此外,您不需要扩展输入。

    您的模型似乎存在普遍的误解。如果你有input_shape=(look_back,1),你根本不需要 LSTM。如果您的序列只是单个值的序列,则最好避免使用 LSTM。此外,拟合您的模型应该包括在每个 epoch 之后进行验证,以跟踪损失和验证性能。

    model.fit(x_train, y_train,
          batch_size=32,
          epochs=200,
          validation_data=[x_test, y_test],
          verbose=1)
    

    【讨论】:

    • 谢谢 1) 你提到的数据是 X=[enery[0], energy[1],...] y=[width[0], width[1],...] ,您的意思是显式映射,例如使用字典吗?或者在每行已经有相应宽度的情况下不需要 2) 所以 sequence_length 也表示计算中要考虑的最大时间步数,但会影响 X 和 Y 的形状? 3)我缩放了我的数据集,因为我认为较大的值可能会不成比例地影响我的网络中的权重,因为我的值在一个很大的范围内。 4) 与 Model.predict 相比,使用 [x_test, y_test] 进行验证有什么区别?
    • 1) 你不需要一个字典,它的能量[0] 被标记为宽度 [0] 等等。 2) 是的,您需要使用 keras 中的 pad_sequences 函数将数据填充到 seq_length 3) 缩放是可以的。它确实在非常时期后执行验证,因此您可以跟踪模型性能并且过度拟合将是可见的。
    • 如果我要进行缩放,我应该在什么时候对数据进行逆变换?我注意到缩放将火车测试分数的 RMSE 降低到 0/0.01,并且预测几乎反映了参考值(这看起来几乎太好了)。啊,我明白了,但是使用validation_data = [x_test,y_test],基本上没有为Model.Predict留下数据。或者如果我理解正确,如果我使用验证集,我根本不需要使用Model.Predict吗?跨度>
    • 我不太清楚,为什么要从数据中进行反变换。关于验证,是的。
    • 主要目标是绘制预测网络值与参考值的相对偏差(基本上绘制 trainPredict = model.predict(trainX) 和 testPredict = model.predict(testX))。所以我想对于那个应用程序,你可能不需要对数据进行逆变换?但是如果我想使用预测值,我需要逆变换来获得正常比例的值(基本上摆脱 MinMaxScaler 效应)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-02-27
    • 2019-01-20
    • 1970-01-01
    • 2018-09-14
    • 1970-01-01
    • 2017-07-25
    • 2018-06-30
    相关资源
    最近更新 更多